Corrigez les erreurs de vérification de la signature du webhook
Découvrez comment corriger une erreur courante lors de l'écoute d'événements de webhook.
Lorsque vous traitez des événements de webhook, nous vous recommandons de sécuriser votre endpoint en vérifiant que l’événement provient bien de Stripe. Pour ce faire, utilisez l’en-tête Stripe-Signature
et appelez la fonction constructEvent()
avec trois paramètres :
requestBody
: la chaîne du corps de la demande envoyée par Stripesignature
: l’en-tête Stripe-Signature dans la requête envoyée par StripeendpointSecret
: la clé secrète associée à votre endpoint
Cette fonction peut déclencher une erreur de vérification de la signature.
Webhook signature verification failed. Err: No signatures found matching the expected signature for payload.
Si vous obtenez cette erreur, c’est qu’au moins l’un des trois paramètres que vous avez transmis à la fonction ci-dessus est incorrect. Les étapes suivantes expliquent comment vérifier que chaque paramètre est correctement défini.
Vérifier la clé secrète de l’endpoint
L’erreur la plus fréquente est l’utilisation d’une clé secrète d’endpoint erronée. Si vous utilisez un endpoint de webhook créé dans le Dashboard, ouvrez l’endpoint dans le Dashboard et cliquez sur le lien Révéler la clé secrète en haut de la page pour afficher la clé secrète.
Si vous utilisez l’interface de ligne de commande Stripe, la clé secrète s’affiche sur le terminal lorsque vous exécutez la commande stripe listen
.
Dans les deux cas, la clé secrète commence par un préfixe whsec_
, mais la clé elle-même est différente. Ne vérifiez pas les signatures sur les événements transmis par l’interface de ligne de commande en utilisant la clé secrète d’un endpoint géré par le Dashboard, ou l’inverse.
Enfin, imprimez l’endpointSecret
utilisé dans votre code, et assurez-vous qu’il correspond à celui que vous avez trouvé ci-dessus.
Vérifier le corps de la requête
Le corps de la requête doit être la chaîne de caractères que Stripe envoie en encodage UTF-8 sans aucune modification. Lorsque vous l’imprimez en tant que chaîne, il ressemble à ceci :
{ "id": "evt_xxx", "object": "event", "data": { ... } }
Récupérer le corps de la requête brute
Certains cadres peuvent modifier le corps de la requête en ajoutant ou en supprimant des espaces, en réorganisant les paires clé-valeur, en convertissant la chaîne en JSON ou en changeant l’encodage. Dans tous ces cas, la vérification de la signature échoue.
Voici une liste non exhaustive de structures qui peuvent analyser ou modifier les données à l’aide de configurations courantes, ainsi que quelques conseils pour obtenir le corps de la requête brute.
Cadre | Méthode de recherche |
---|---|
Bibliothèque stripe-node avec Express | Suivez notre guide de démarrage rapide de l’intégration. |
Bibliothèque stripe-node avec Body Parser | Essayez les solutions répertoriées dans ce problème GitHub. |
Bibliothèque stripe-node utilisant les endpoints Next.js | Essayez de désactiver bodyParser et d’utiliser buffer(request) , comme dans cet exemple. |
Plateforme API AWS avec la fonction Lambda
Pour récupérer le corps de la requête brute pour la passerelle API AWS avec la fonction Lambda, configurez un modèle de mappage du corps dans la passerelle API, comme suit :
- Content-Type :
application/json
- Contenu du modèle :
{ "method": "$context.httpMethod", "body": $input.json('$'), "rawBody": "$util.escapeJavaScript($input.body).replaceAll("\\'", "'")", "headers": { #foreach($param in $input.params().header.keySet()) "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end #end } }
Ensuite, dans la fonction Lambda, accédez au corps brut avec la propriété de l’événement rawBody
et aux en-têtes avec la propriété de l’événement headers
.
Vérifier la signature
Imprimez le paramètre signature
et confirmez qu’il ressemble à ceci :
t=xxx,v1=yyy,v0=zzz
Si ce n’est pas le cas, vérifiez si vous avez un problème dans votre code lorsque vous essayez d’extraire la signature de l’en-tête.