Signaturprüfungsfehler von Webhooks beheben
Erfahren Sie, wie Sie einen häufigen Fehler beim Abhören von Webhook-Ereignissen beheben.
Bei der Verarbeitung von Webhook-Ereignissen empfehlen wir, Ihren Endpoint zu sichern, indem Sie überprüfen, ob das Ereignis von Stripe stammt. Hierfür können Sie den Stripe-Signature
-Header verwenden und die Funktion constructEvent()
mit drei Parametern aufrufen:
requestBody
: der von Stripe gesendete Anfragetext für die Hauptzeichenfolgesignature
: der Stripe-Signature-Header in der von Stripe gesendeten AnfrageendpointSecret
: der mit Ihrem Endpoint verknüpfte Geheimschlüssel
Es ist möglich, dass durch diese Funktion ein Signaturprüfungsfehler ausgelöst wird.
Webhook signature verification failed. Err: No signatures found matching the expected signature for payload.
Wenn Sie diesen Fehler erhalten, ist mindestens einer der drei Parameter, die Sie an die obige Funktion übergeben haben, falsch. In den folgenden Schritten wird erläutert, wie Sie überprüfen, ob die einzelnen Parameter korrekt sind.
Endpoint-Geheimschlüssel prüfen
Der häufigste Fehler ist die Verwendung des falschen Endpoint-Geheimschlüssels. Wenn Sie einen Webhook-Endpoint verwenden, der im Dashboard erstellt wurde, öffnen Sie den Endpoint im Dashboard und klicken oben auf der Seite auf den Link Geheimschlüssel anzeigen, um den Schlüssel anzuzeigen.
Wenn Sie die Stripe-CLI verwenden, wird der Geheimschlüssel im Terminal angezeigt, wenn Sie den Befehl stripe listen
ausführen.
In beiden Fällen beginnt der Geheimschlüssel mit einem whsec_
-Präfix, der Schlüssel selbst ist jedoch anders. Überprüfen Sie Signaturen von Ereignissen, die von der CLI weitergeleitet werden, nicht mithilfe des Schlüssels von einem vom Dashboard verwalteten Endpoint oder umgekehrt.
Geben Sie schließlich den in Ihrem Code verwendeten endpointSecret
ein und vergewissern Sie sich, dass er mit den oben gefundenen Angaben übereinstimmt.
Anfragetext prüfen
Der Anfragetext muss die Haupttext-Zeichenfolge sein, die Stripe in UTF-8-Codierung ohne Änderungen sendet. Wenn Sie dies als Zeichenfolge aufschreiben, sollte es in etwa so aussehen:
{ "id": "evt_xxx", "object": "event", "data": { ... } }
Den reinen Anfragetext abrufen
Einige Frameworks können den Anfragetext bearbeiten, indem sie zum Beispiel Leerzeichen hinzufügen oder entfernen, die Schlüsselwertpaare neu anordnen, die Zeichenfolge in das JSON-Format konvertieren oder die Codierung ändern. Alle diese Fälle führen zu einer fehlgeschlagenen Signaturprüfung.
Im Folgenden finden Sie eine nicht vollständige Liste der Frameworks, die die Daten mithilfe gängiger Konfigurationen analysieren oder ändern können, sowie einige Tipps zum Abrufen des Raw-Anfragetextes.
Framework | Abrufmethode |
---|---|
Stripe-Node-Bibliothek mit Express | Folgen Sie unserem Quickstart-Leitfaden für Integrationen. |
Stripe-Node-Bibliothek mit Body Parser | Probieren Sie die Lösungen aus, die in diesem GitHub-Problem aufgeführt sind. |
Stripe-Node-Bibliothek mit Next.js-Endpoints | Versuchen Sie, bodyParser zu deaktivieren und buffer(request) zu verwenden, wie in diesem Beispiel gezeigt. |
AWS API Gateway mit Lambda-Funktion
Um den reinen Anfragetext für das AWS API Gateway mit Lambda-Funktion im API Gateway abzurufen, richten Sie eine Body-Mapping-Vorlage ein, die in etwa so aussieht:
- Inhaltstyp:
application/json
- Vorlageninhalte:
{ "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 } }
Greifen Sie dann in der Lambda-Funktion auf den Raw-Body mit der rawBody
-Eigenschaft des Ereignisses und die Header mit der headers
-Eigenschaft des Ereignisses zu.
Signatur prüfen
Geben Sie den signature
-Parameter ein und bestätigen Sie, dass er in etwa so aussieht:
t=xxx,v1=yyy,v0=zzz
Wenn nicht, prüfen Sie, ob ein Problem in Ihrem Code vorliegt, wenn versucht wird, die Signatur aus dem Header zu extrahieren.