Aller au contenu principal
GoCardless · webhooks

Webhook GoCardless : 498 Token Invalid, 204 et la signature Webhook-Signature

Les événements GoCardless arrivent dans Odoo par un webhook signé, et la réponse d'Odoo indique à GoCardless s'il doit réessayer. Deux codes ont une signification particulière : 498 pour une signature qui ne correspond pas et 204 pour un événement non reconnu. Avec les deux, GoCardless arrête les nouvelles tentatives.

FlexigoTech · Responsable : Víctor Gómez · Mis à jour le 6 novembre 2026

L'essentiel

Versions
Odoo 17, 18, 19 et 20
Vérifié
dans le code du connecteur, version 17.0, 18.0, 19.0 et 20.0 · dans les sources citées à la fin
Lecture
3 min

Ce que dit GoCardless

RéponseTexte de GoCardless
498 Token InvalidSignature verification failed. GoCardless will log this and not retry.
204 No ContentEvent type is not recognised. GoCardless will not retry.

Toute autre réponse qui n'est pas 2xx fait que GoCardless réessaie : 9 tentatives de livraison au total, la première plus 8 nouvelles tentatives, de plus en plus espacées. Il attend en outre la réponse 10 secondes au maximum.

Tableau des réponses 498 et 204 au webhook GoCardless
Les deux codes qui arrêtent les nouvelles tentatives de GoCardless et le texte avec lequel il les documente.

Comment la signature est vérifiée

GoCardless signe chaque envoi avec un HMAC SHA256 en hexadécimal du corps tel quel, avec le secret du endpoint, et l'envoie dans l'en-tête Webhook-Signature. Si le secret qu'a Odoo n'est pas celui du endpoint, aucune signature ne correspond. Cela arrive quand on copie mal le secret, quand on le régénère dans le Dashboard sans le mettre à jour dans Odoo, ou quand on envoie à un Odoo les événements d'un autre compte.

Le connecteur ne retient pas la première configuration GoCardless qu'il trouve : il cherche celle dont le secret signe cet envoi. Ainsi, une configuration de test oubliée ne rejette pas les événements réels.

Ce que répond Odoo avec le connecteur

SituationOdoo 17, 18 et 19Odoo 20
Aucun secret ne correspond à la signature498401
Signature correcte, aucun événement ne le concerne204204
Événements appliqués200200

La différence d'Odoo 20 ne relève pas d'un choix du connecteur : son serveur HTTP ne permet pas de renvoyer un code non standard, et 498 n'en est pas un. La suite dépend de la façon dont les événements arrivent. En mode avancé, ils vont directement de GoCardless à Odoo : avec 401, GoCardless réessaie un envoi qui restera non concordant, et un secret mal renseigné apparaît comme une série de tentatives échouées dans le Dashboard de GoCardless. Avec la connexion en deux clics, les événements passent par FlexigoTech Cloud, qui traite ce 401 comme définitif, comme un 498.

Si un événement n'arrive pas

GoCardless garantit que chaque événement arrive au moins une fois, pas exactement une : il peut se répéter. Le connecteur enregistre chaque événement appliqué, un par événement et par configuration GoCardless, et si le même arrive à nouveau il ne l'applique pas deux fois. Cela compte pour l'argent : un paiement confirmé deux fois ne doit pas enregistrer deux encaissements sur la facture. Et si un événement se perd, l'action planifiée qui demande chaque heure à GoCardless les événements manquants le récupère, jusqu'à 100 par passage.

Que faire

  1. Si vous utilisez la connexion en deux clics (« Connect my GoCardless account »), les webhooks sont configurés par FlexigoTech Cloud : il n'y a aucun secret à copier.
  2. En mode avancé (« Paste an access token (advanced) »), vous créez vous-même le endpoint et son secret dans le Dashboard de GoCardless : copiez le secret exact dans la configuration GoCardless d'Odoo.
  3. Si vous régénérez le secret, mettez-le à jour dans Odoo immédiatement ; d'ici là, chaque envoi échouera.
  4. Vérifiez dans le Dashboard de GoCardless les envois échoués : vous pouvez les relancer manuellement depuis là.
Schéma : ce que GoCardless envoie au webhook et ce que répond Odoo avec le connecteur
Schéma réalisé à partir du code du connecteur (17.0, 18.0, 19.0 et 20.0) et de la documentation de GoCardless.

Pourquoi ne pas répondre 500 quand la signature échoue ?

Parce que GoCardless réessaierait un envoi qui ne concordera jamais. Le 498 lui indique d'arrêter ; sur Odoo 20, où il ne peut pas être envoyé, le connecteur répond 401, et via FlexigoTech Cloud ce 401 compte aussi comme définitif.

Avec notre connecteur

Sur Odoo 17, 18, 19 et 20, le connecteur vérifie la signature de chaque envoi contre le secret de chaque configuration GoCardless, répond avec les codes que GoCardless comprend et, au cas où quelque chose se perdrait, récupère les événements chaque heure.

À lire aussi

GoCardless 409 idempotent_creation_conflict : le prélèvement existait déjàGoCardless renvoie 409 si une clé d'idempotence a déjà créé une ressource. Ce n'est pas une erreur : le connecteur évite ainsi un double prélèvement.Erreur mandate_is_inactive de GoCardless lors de la création d'un encaissement depuis OdooGoCardless répond mandate_is_inactive quand un paiement est créé avec un mandat annulé, échoué ou expiré. Pourquoi et comment le connecteur le gère.GoCardless invalid_bank_details : AC01 et BE06, le compte indiqué n'existe pasGoCardless invalid_bank_details avec AC01 ou BE06 : le compte du mandat n'existe pas. Pourquoi cela arrive et ce que fait le connecteur Odoo.
Vérifié dans le code du connecteur (version 17.0, 18.0, 19.0 et 20.0) et dans les sources citées

Sources

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