Ce que dit GoCardless
| Reason | Type | Texte de GoCardless |
|---|---|---|
internal_server_error | gocardless | An internal error occurred. Report to support with request_id. |
request_timed_out | gocardless | Request did not complete in time. Retry, report if persistent. |
GoCardless regroupe ces reasons dans le type gocardless, celui des erreurs survenues à l'intérieur de GoCardless : « These errors occurred within GoCardless while processing your request. ». Sa table des codes HTTP dit ceci de ces deux codes :
| HTTP | Texte de GoCardless |
|---|---|
| 500 | Server-side error. Retry, and report to support with the request_id if it persists. |
| 504 | Request timed out. Retry, and report with request_id if it persists. |
Sur la page des limites, GoCardless fixe par ailleurs la durée maximale d'une requête : 29 secondes (« Request timeout 29 seconds »).

Trois cas que le connecteur ne traite pas de la même façon
Le connecteur attend la réponse de GoCardless jusqu'à 30 secondes pour chaque requête. Lors d'un encaissement, d'un remboursement ou d'une nouvelle tentative, Odoo peut se trouver face à trois situations différentes :
- GoCardless répond par un
500ou un504, avec le reason dans la réponse. - GoCardless ne répond pas : la connexion est coupée ou les 30 secondes sont écoulées.
- La panne survient lors du traitement d'un événement, quand le connecteur demande à GoCardless le paiement auquel se rapporte l'événement.
Ce que fait le connecteur
Avec un 500 ou un 504. Le connecteur ne répète une requête que lorsqu'elle reste sans réponse, ou après un 429. Avec un 500 ou un 504, il y a une réponse, donc il la considère comme un rejet. Pour un encaissement, la transaction passe en « Erreur » avec « GoCardless rejected the request. » et, en dessous, le message de GoCardless avec le reason et le request_id entre crochets. La tâche horaire ne renvoie pas une transaction en erreur. Si GoCardless créait tout de même l'encaissement, son premier événement le relie : chaque encaissement porte dans ses métadonnées la référence de la transaction Odoo, le connecteur la recherche et applique l'état du paiement. Une transaction en erreur repasse ainsi en « En attente » ou passe en « Confirmé ».
Sans réponse. Le connecteur répète la requête une fois, avec la même clé d'idempotence. Si personne ne répond toujours, il ne considère pas l'encaissement comme perdu : la transaction reste en attente avec « GoCardless did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour. ». La tâche horaire la renvoie avec la même clé ; si GoCardless l'avait déjà créée, il répond 409 et le connecteur adopte ce qui existe déjà.
Lors du traitement d'un événement. Pour chaque événement d'un paiement, le connecteur demande ce paiement à GoCardless. Si cette consultation échoue, le webhook répond 500 pour que GoCardless renvoie l'envoi, et les événements déjà appliqués ne sont pas appliqués deux fois. La récupération horaire ne laisse pas non plus un événement en échec de côté.
Le connecteur n'est pas traduit en français : ces textes apparaissent toujours en anglais, même dans un Odoo en français, qu'ils soient déclenchés par un utilisateur ou par une action planifiée : « GoCardless rejected the request. » et « GoCardless did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour. ».

Que faire
- Ouvrez la transaction depuis la facture, avec le bouton « Transaction de paiement » en haut ; le menu des transactions n'apparaît qu'en mode développeur, et il n'existe pas dans Odoo 20. Si le message cite
internal_server_errorourequest_timed_out, la panne vient de GoCardless, et non du client ni de son mandat. - Avant de réencaisser la facture, cherchez l'encaissement dans le Dashboard de GoCardless : le connecteur met comme description de chaque encaissement la référence de sa transaction Odoo. S'il est là, n'encaissez pas une seconde fois ; son événement reliera la transaction.
- S'il n'y est pas, réencaissez la facture avec le moyen de paiement enregistré du client. Un nouvel encaissement est une autre transaction, avec une autre clé d'idempotence : d'où l'intérêt de vérifier avant.
- Si l'erreur se répète, écrivez au support de GoCardless avec le
request_iddu message : leur documentation demande de l'inclure lorsqu'on les contacte.
Pourquoi le connecteur ne réessaie-t-il pas un 500 comme il le fait sans réponse ?
Parce qu'il ne répète aveuglément que ce qui peut être répété sans risque : une requête sans réponse, avec la même clé, ou une requête ayant reçu un 429 (selon GoCardless, celles-ci peuvent être répétées sans problème). Un 500 ou un 504 est une réponse, et le connecteur la traite comme un rejet.
Un encaissement en double peut-il survenir ?
Avec la même clé, non : GoCardless répond par un 409 et le connecteur adopte l'encaissement déjà existant. Le risque vient d'un nouvel encaissement lancé depuis la facture, car il crée une autre transaction avec une autre clé. D'où l'intérêt de chercher d'abord l'encaissement dans le Dashboard.
Avec notre connecteur
Dans Odoo 17, 18, 19 et 20, le connecteur distingue une erreur de GoCardless d'une requête sans réponse : la première passe en erreur avec son request_id, la seconde reste en attente et est renvoyée avec la même clé, et dans les deux cas l'événement d'un encaissement qui existe bel et bien le relie à sa transaction.
À 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/responses-and-errors
- docs.gocardless.com/docs/api-reference/limits
- Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 361 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 394 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 357 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 373 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 448 en 17.0 (d203ee6), ligne 448 en 18.0 (e2ab18b), ligne 448 en 19.0 (ce7f5a3) et ligne 450 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 29 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 299 en 17.0 (d203ee6), ligne 299 en 18.0 (e2ab18b), ligne 299 en 19.0 (ce7f5a3) et ligne 310 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 391 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 68 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 397 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 462 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 521 en 17.0 (d203ee6), ligne 521 en 18.0 (e2ab18b), ligne 521 en 19.0 (ce7f5a3) et ligne 523 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 281 en 17.0 (d203ee6), ligne 281 en 18.0 (e2ab18b), ligne 281 en 19.0 (ce7f5a3) et ligne 292 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 258 en 17.0 (d203ee6), ligne 258 en 18.0 (e2ab18b), ligne 258 en 19.0 (ce7f5a3) et ligne 269 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 115 en 17.0 (d203ee6), ligne 115 en 18.0 (e2ab18b), ligne 115 en 19.0 (ce7f5a3) et ligne 118 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 572 en 17.0 (d203ee6), ligne 572 en 18.0 (e2ab18b), ligne 571 en 19.0 (ce7f5a3) et ligne 590 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 697 en 17.0 (d203ee6), ligne 697 en 18.0 (e2ab18b), ligne 696 en 19.0 (ce7f5a3) et ligne 720 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 623 en 17.0 (d203ee6), ligne 623 en 18.0 (e2ab18b), ligne 623 en 19.0 (ce7f5a3) et ligne 625 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 589 en 17.0 (d203ee6), ligne 589 en 18.0 (e2ab18b), ligne 588 en 19.0 (ce7f5a3) et ligne 607 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: controllers/main.py, ligne 124 en 17.0 (d203ee6), ligne 124 en 18.0 (e2ab18b), ligne 124 en 19.0 (ce7f5a3) et ligne 127 en 20.0 (688d86b)
- Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 603 en 17.0 (d203ee6), ligne 603 en 18.0 (e2ab18b), ligne 603 en 19.0 (ce7f5a3) et ligne 605 en 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/fr.po
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- Code du module : flexigo_payment_gocardless: __manifest__.py, ligne 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
