paybell English

Vérifier la signature d'un webhook Stripe

« No signatures found matching the expected signature for payload » : collez l'en-tête, le corps et la clé, et voyez lequel des trois n'est pas ce que vous croyez.

Chargement…

Comment Stripe signe un événement

Stripe prend l'horodatage, un point, puis le corps de la requête exactement tel qu'il est envoyé, calcule un HMAC-SHA256 de cette chaîne avec la clé secrète de signature de l'endpoint, et place le résultat dans l'en-tête Stripe-Signature sous la forme t=horodatage,v1=signature. Vérifier, c'est refaire le même calcul et comparer. Cette page le fait dans votre navigateur avec l'API Web Crypto.

Pourquoi la vérification échoue, par ordre de probabilité

  1. Le corps a été analysé avant d'être vérifié. Un framework qui transforme le JSON en objet puis le réécrit ne rend pas les mêmes octets : espaces, ordre des clés et échappements changent. Vérifiez sur le corps brut. L'outil vous dit quand la signature correspond au corps tel que Stripe l'a envoyé mais pas à sa version réécrite, ou l'inverse.
  2. La mauvaise clé. Chaque endpoint a sa propre clé whsec_, le mode test et le mode réel en ont de différentes, et la CLI Stripe en affiche encore une autre pour stripe listen. Une clé d'API (sk_) n'est pas une clé de signature.
  3. Un proxy a modifié le corps : une passerelle qui réencode, retire un saut de ligne final ou décode le texte avec un autre jeu de caractères.
  4. L'horloge. Les bibliothèques refusent un horodatage vieux de plus de cinq minutes pour empêcher les rejeux. Rejouer à la main un événement enregistré échoue pour cette seule raison.

Ne pas avoir à le faire soi-même

Si tout ce que vous attendez du webhook est un message dans un canal quand de l'argent bouge, Paybell fait la vérification pour vous et publie dans Slack, Discord ou Teams.

Questions

Est-il prudent de coller ma clé de signature ici ?
Le calcul se fait dans votre navigateur avec l'API Web Crypto et rien de ce que vous collez n'est envoyé à un serveur : vous pouvez le constater dans l'onglet réseau des outils de développement, ou vous déconnecter avant de coller. Une clé de signature ne permet que de vérifier ou de forger des événements pour un seul endpoint ; dans le doute, renouvelez-la ensuite dans Stripe.
Peut-il produire une signature pour mes propres tests ?
Oui. « Signer ce corps maintenant » écrit un en-tête Stripe-Signature pour le corps et la clé saisis, à l'heure actuelle, pour appeler votre propre endpoint avec curl.