Zum Hauptinhalt springen
GoCardless · Webhooks

GoCardless-Webhook: 498 Token Invalid, 204 und die Webhook-Signature

Ereignisse von GoCardless erreichen Odoo über einen signierten Webhook, und die Antwort von Odoo sagt GoCardless, ob es erneut versuchen soll. Zwei Codes haben eine besondere Bedeutung: 498 für eine Signatur, die nicht passt, und 204 für ein Ereignis, das nicht erkannt wird. Bei beiden stellt GoCardless die Wiederholungsversuche ein.

FlexigoTech · Verantwortlich: Víctor Gómez · Aktualisiert am 6. November 2026

Das Wichtigste

Versionen
Odoo 17, 18, 19 und 20
Geprüft
im Quellcode des Connectors, Version 17.0, 18.0, 19.0 und 20.0 · in den Quellen am Ende
Lesezeit
3 Min.

Was GoCardless sagt

AntwortText von GoCardless
498 Token InvalidSignature verification failed. GoCardless will log this and not retry.
204 No ContentEvent type is not recognised. GoCardless will not retry.

Jede andere Antwort, die kein 2xx ist, veranlasst GoCardless zu einem neuen Versuch: insgesamt 9 Zustellversuche, der erste plus 8 Wiederholungen, mit immer größeren Abständen. Außerdem wartet GoCardless höchstens 10 Sekunden auf die Antwort.

Karte der Antworten 498 und 204 auf den Webhook von GoCardless
Die beiden Codes, die die Wiederholungen von GoCardless stoppen, und der Text, mit dem GoCardless sie dokumentiert.

Wie die Signatur geprüft wird

GoCardless signiert jede Sendung mit einem HMAC SHA256 in Hexadezimal über den Textkörper unverändert, mit dem Geheimschlüssel des Endpunkts, und schickt sie im Header Webhook-Signature. Wenn der Geheimschlüssel in Odoo nicht der des Endpunkts ist, passt keine Signatur. Das passiert beim fehlerhaften Kopieren des Schlüssels, beim Neugenerieren im Dashboard ohne Aktualisierung in Odoo oder wenn die Ereignisse eines anderen Kontos an ein Odoo geschickt werden.

Der Konnektor nimmt nicht die erste GoCardless-Konfiguration, die er findet: Er sucht diejenige, deren Geheimschlüssel diese Sendung signiert hat. So lehnt eine vergessene Testkonfiguration die echten Ereignisse nicht ab.

Was Odoo mit dem Konnektor antwortet

SituationOdoo 17, 18 und 19Odoo 20
Kein Geheimschlüssel passt zur Signatur498401
Signatur korrekt, kein Ereignis gehört dazu204204
Ereignisse angewendet200200

Der Unterschied bei Odoo 20 ist keine Entscheidung des Konnektors: Sein HTTP-Server erlaubt keine Antwort mit einem Code, der nicht standardisiert ist, und 498 gehört nicht dazu. Was danach passiert, hängt davon ab, wie die Ereignisse ankommen. Im erweiterten Modus kommen sie direkt von GoCardless zu Odoo: Bei 401 versucht GoCardless eine Sendung erneut, die weiterhin nicht passen wird, und ein falsch eingetragener Schlüssel zeigt sich als Reihe fehlgeschlagener Versuche im Dashboard von GoCardless. Bei der Verbindung mit zwei Klicks laufen sie über FlexigoTech Cloud, die dieses 401 als endgültig behandelt, genauso wie ein 498.

Wenn ein Ereignis nicht ankommt

GoCardless garantiert, dass jedes Ereignis mindestens einmal ankommt, nicht genau einmal: Es kann sich wiederholen. Der Konnektor speichert jedes angewendete Ereignis, eines pro Ereignis und pro GoCardless-Konfiguration, und wenn dasselbe erneut eintrifft, wendet er es nicht zweimal an. Das ist bei Geld wichtig: Eine doppelt bestätigte Zahlung darf nicht zwei Zahlungseingänge in der Rechnung erzeugen. Und wenn ein Ereignis verloren geht, holt die geplante Aktion, die jede Stunde bei GoCardless die fehlenden Ereignisse anfordert, sie nach, bis zu 100 pro Durchlauf.

Was zu tun ist

  1. Wenn Sie die Verbindung mit zwei Klicks nutzen («Connect my GoCardless account»), richtet FlexigoTech Cloud die Webhooks ein: Es gibt keinen Schlüssel zu kopieren.
  2. Im erweiterten Modus («Paste an access token (advanced)») erstellen Sie den Endpunkt und seinen Geheimschlüssel selbst im Dashboard von GoCardless: Kopieren Sie den genauen Schlüssel in die GoCardless-Konfiguration in Odoo.
  3. Wenn Sie den Schlüssel neu generieren, aktualisieren Sie ihn sofort in Odoo; bis dahin schlägt jede Sendung fehl.
  4. Prüfen Sie im Dashboard von GoCardless die fehlgeschlagenen Sendungen: Von dort lassen sie sich manuell erneut auslösen.
Schema: Was GoCardless an den Webhook sendet und was Odoo mit dem Konnektor antwortet
Schema auf Grundlage des Konnektorcodes (17.0, 18.0, 19.0 und 20.0) und der Dokumentation von GoCardless.

Warum nicht mit 500 antworten, wenn die Signatur fehlschlägt?

Weil GoCardless eine Sendung wiederholen würde, die nie passen wird. Der 498 sagt ihm, dass er aufhören soll; in Odoo 20, wo er nicht gesendet werden kann, antwortet der Konnektor mit 401, und über FlexigoTech Cloud zählt dieses 401 ebenfalls als endgültig.

Mit unserem Konnektor

In Odoo 17, 18, 19 und 20 prüft der Konnektor die Signatur jeder Sendung gegen den Geheimschlüssel jeder GoCardless-Konfiguration, antwortet mit den Codes, die GoCardless versteht, und holt für den Fall, dass etwas verloren geht, jede Stunde die Ereignisse nach.

Weiterlesen

GoCardless 409 idempotent_creation_conflict: Die Abbuchung existierte bereitsGoCardless gibt 409 zurück, wenn ein Idempotenzschlüssel schon etwas angelegt hat. Warum das kein Fehler ist und wie der Konnektor Doppelabbuchungen verhindert.GoCardless-Fehler mandate_is_inactive beim Anlegen einer Zahlung aus OdooGoCardless meldet mandate_is_inactive bei Zahlungen mit gekündigtem, fehlgeschlagenem oder abgelaufenem Mandat. Ursache und Lösung im Odoo-Konnektor.GoCardless invalid_bank_details: AC01 und BE06, das angegebene Konto existiert nichtGoCardless invalid_bank_details mit AC01 oder BE06: Das Konto des Mandats existiert nicht. Warum es bei Zahlung und Mandat auftritt und was Odoo tut.
Geprüft im Quellcode des Connectors (Version 17.0, 18.0, 19.0 und 20.0) und in den verlinkten Quellen

Quellen

  • docs.gocardless.com/docs/api-reference/webhooks
  • Quellcode des Moduls: flexigo_payment_gocardless: models/gocardless_webhook_event.py, Zeile 7 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: controllers/main.py, Zeile 110 in 17.0 (d203ee6), 18.0 (e2ab18b) und 19.0 (ce7f5a3)
  • Quellcode des Moduls: flexigo_payment_gocardless: controllers/main.py, Zeile 113 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: controllers/main.py, Zeile 128 in 17.0 (d203ee6), Zeile 128 in 18.0 (e2ab18b), Zeile 128 in 19.0 (ce7f5a3) und Zeile 131 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: controllers/main.py, Zeile 103 in 17.0 (d203ee6), Zeile 103 in 18.0 (e2ab18b), Zeile 103 in 19.0 (ce7f5a3) und Zeile 106 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 117 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_provider.py, Zeile 71 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: __manifest__.py, Zeile 6 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_token.py, Zeile 83 in 17.0 (d203ee6), Zeile 83 in 18.0 (e2ab18b), Zeile 83 in 19.0 (ce7f5a3) und Zeile 82 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: __manifest__.py, Zeile 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Quellcode des Moduls: flexigo_payment_gocardless: controllers/main.py, Zeile 95 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 888 in 17.0 (d203ee6), Zeile 888 in 18.0 (e2ab18b), Zeile 888 in 19.0 (ce7f5a3) und Zeile 903 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 143 in 17.0 (d203ee6), Zeile 143 in 18.0 (e2ab18b), Zeile 143 in 19.0 (ce7f5a3) und Zeile 145 in 20.0 (688d86b)