Ce que dit GoCardless
| Réponse | Texte de GoCardless |
|---|---|
| 498 Token Invalid | Signature verification failed. GoCardless will log this and not retry. |
| 204 No Content | Event 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.

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
| Situation | Odoo 17, 18 et 19 | Odoo 20 |
|---|---|---|
| Aucun secret ne correspond à la signature | 498 | 401 |
| Signature correcte, aucun événement ne le concerne | 204 | 204 |
| Événements appliqués | 200 | 200 |
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
- 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.
- 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.
- Si vous régénérez le secret, mettez-le à jour dans Odoo immédiatement ; d'ici là, chaque envoi échouera.
- Vérifiez dans le Dashboard de GoCardless les envois échoués : vous pouvez les relancer manuellement depuis là.

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
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)
