Aller au contenu principal
GoCardless API · invalid_state

Erreur retry_failed de GoCardless lors d'une nouvelle tentative de prélèvement depuis Odoo

Relancer un prélèvement est une action de l'API GoCardless soumise à ses règles : elle ne vaut que pour les paiements échoués, avec un mandat actif et au maximum 3 fois. Si le paiement n'a pas échoué, la réponse est retry_failed. Avec le connecteur, Odoo n'affiche le bouton de nouvelle tentative que lorsque sa règle le permet.

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
6 min

Ce que dit GoCardless

ReasonTypeTexte de GoCardless
retry_failedinvalid_statePayment could not be retried.

La documentation de la relance (POST /payments/{id}/actions/retry) donne les règles : le paiement est relancé si son mandat est actif, l'API renvoie retry_failed si le paiement n'a pas échoué et « Payments can be retried up to 3 times. ». Comme pour toutes les erreurs invalid_state, GoCardless demande de prévenir la personne qui utilise le système et de ne pas la laisser relancer. Le connecteur note dans son code qu'une quatrième relance a elle aussi reçu retry_failed dans le sandbox de GoCardless.

Carte de l'erreur retry_failed de GoCardless
Le reason, son type invalid_state et le texte de GoCardless.

Pourquoi elle apparaît

Selon la documentation, retry_failed arrive quand le paiement n'a pas échoué, et le connecteur l'a aussi vu en demandant une quatrième relance. Avec un mandat qui n'est plus actif, la documentation ne dit pas quelle erreur arrive : le connecteur attend retry_failed ou mandate_is_inactive et traite les deux de la même façon.

Un paiement qui n'est pas en échec recouvre plus de cas qu'il n'y paraît. Un prélèvement en attente ou confirmé n'a pas échoué, et un prélèvement contesté (charged_back) non plus : l'argent est arrivé, puis la banque du client l'a retiré. Selon la documentation de GoCardless, chacun d'eux recevrait retry_failed.

Pour la limite de relances, ce qui prête à confusion, c'est Success+. Quand Success+ relance un paiement, GoCardless envoie un événement resubmission_requested, comme pour toute autre relance. Le connecteur en ajoute une par événement de ce type, qu'il vienne de Success+ ou d'une relance demandée depuis Odoo, et note dans son code que la limite de 3 de GoCardless inclut celles de Success+. Comme chaque paiement envoyé par le connecteur demande retry_if_possible, avec Success+ activé il est fréquent qu'une partie de ce quota soit déjà consommée quand vous regardez la facture.

Ce que vous voyez dans Odoo avec le connecteur

La transaction s'ouvre 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. Le bouton « Retry collection » de la transaction n'apparaît que lorsque le connecteur accepterait la relance : un champ calculé le contrôle avec la même règle que celle vérifiée par le serveur au clic. Si la règle dit non, le bouton n'apparaît pas et son motif n'arrive pas à l'écran. Ce que vous voyez, c'est l'état de la transaction et son groupe GoCardless :

SituationCe que vous voyez dans la transaction
Success+ va la relancerÉtat « En attente », la case « Success+ Will Retry » cochée et, dans « Message », « GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do. ». Sans bouton.
Échoué, sans Success+, avec moins de 3 relances et le mandat actifÉtat « Erreur » et le bouton « Retry collection ».
3 relances déjà faitesÉtat « Erreur » et « GoCardless Retries » à 3. Sans bouton.
Le mandat est archivéÉtat « Erreur » ; sur le contact, la note du mandat et l'activité « GoCardless mandate lost ». Sans bouton.
En attente ou confirméSans bouton.
Contesté, par exemple avec MD06État « Erreur », même si le mandat est toujours actif. Sans bouton : dans GoCardless le paiement est en charged_back, pas en failed.

Au clic sur le bouton, Odoo demande confirmation : « GoCardless will try to collect this payment again, which can cost a fee. Continue? ». Si GoCardless accepte, la transaction passe en attente avec « Retry requested. GoCardless will confirm the new charge date. ». Quand l'événement resubmission_requested arrive, le connecteur ajoute la relance et écrit la date : « GoCardless will collect this payment again on … (retry requested, retry 1 of 3). ». Le clic n'ajoute rien, ainsi chaque relance n'est comptée qu'une seule fois.

Ce qui arrive avec les événements, le connecteur l'écrit sans personne devant l'écran : le message de Success+ du tableau, la nouvelle date de prélèvement et, si le mandat est mort à cause d'un événement, la note et l'activité du contact. 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 could not collect this payment (…). Success+ will retry it automatically; there is nothing to do. », « GoCardless will collect this payment again on … (retry requested, retry 1 of 3). » et « GoCardless mandate lost ».

Schéma : ce que répond GoCardless avec retry_failed et ce que fait 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.

Si GoCardless répond retry_failed

Si l'API répond tout de même retry_failed ou mandate_is_inactive, le connecteur consulte le mandat avant d'afficher quoi que ce soit :

  • Si le mandat est mort, il l'archive et le signale dans la transaction : « The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate. ».
  • S'il est toujours actif, il affiche l'erreur de GoCardless telle quelle : « GoCardless rejected the request. » et dessous le message de l'API, avec son reason et le request_id.

Avec un paiement contesté, on n'arrive plus ici : depuis la version 1.1.4, le connecteur n'offre pas le bouton si le paiement n'est pas en failed dans GoCardless, et un paiement contesté est en charged_back.

Que faire

  • Si le bouton n'apparaît pas, regardez l'état de la transaction, « Success+ Will Retry » et « GoCardless Retries » : une des situations du tableau l'explique.
  • Si 3 relances ont été faites, parlez au client : le connecteur n'en demande plus d'autre.
  • Si le mandat est archivé, demandez-en un nouveau et encaissez avec lui.
  • Pour un paiement contesté, il n'y a pas de bouton : parlez d'abord au client et, le cas échéant, encaissez de nouveau la facture avec un nouveau prélèvement.

Chaque relance coûte-t-elle de l'argent ?

Possiblement. Le bouton le signale avant d'envoyer quoi que ce soit, et le connecteur ne l'offre pas tant que Success+ va relancer le paiement, car une relance manuelle ne ferait qu'ajouter des frais. Les tarifs exacts dépendent de votre contrat avec GoCardless.

Puis-je relancer un paiement contesté par le client ?

Avec ce bouton, non : le connecteur ne l'offre pas pour un paiement contesté, car GoCardless ne relance que les paiements échoués et un paiement contesté n'en est pas un. Une contestation, comme un MD06, se règle en parlant au client et, le cas échéant, avec un nouveau prélèvement.

Avec notre connecteur

Dans Odoo 17, 18, 19 et 20, le connecteur compte les relances avec les événements de GoCardless et n'affiche le bouton que lorsque sa règle le permet : pas avec Success+ en cours, pas avec 3 relances, pas avec le mandat archivé. Si retry_failed arrive malgré tout, il regarde le mandat avant de vous montrer l'erreur.

À lire aussi

GoCardless insufficient_funds (AM04) : le compte du client ne disposait pas de soldeUn prélèvement GoCardless échoue avec insufficient_funds et le code SEPA AM04. Ce qu'il signifie, quand Success+ le retente et ce que fait Odoo avec la facture.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 MD06 : le client demande à sa banque de rembourser un encaissementLe client demande à sa banque de rembourser un prélèvement GoCardless : charged_back, refund_requested et MD06. Effets dans Odoo sur la facture et le mandat.
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/payment
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Code du module : flexigo_payment_gocardless: const.py, ligne 119 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 680 en 17.0 (d203ee6), ligne 680 en 18.0 (e2ab18b), ligne 679 en 19.0 (ce7f5a3) et ligne 703 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 449 en 17.0 (d203ee6), ligne 449 en 18.0 (e2ab18b), ligne 448 en 19.0 (ce7f5a3) et ligne 463 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: const.py, ligne 122 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 260 en 17.0 (d203ee6), ligne 260 en 18.0 (e2ab18b), ligne 260 en 19.0 (ce7f5a3) et ligne 271 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: views/payment_transaction_views.xml, ligne 13 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 63 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 418 en 17.0 (d203ee6), ligne 418 en 18.0 (e2ab18b), ligne 417 en 19.0 (ce7f5a3) et ligne 432 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: views/payment_transaction_views.xml, ligne 27 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: views/payment_transaction_views.xml, ligne 28 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/fr.po
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 729 en 17.0 (d203ee6), ligne 729 en 18.0 (e2ab18b), ligne 728 en 19.0 (ce7f5a3) et ligne 752 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 713 en 17.0 (d203ee6), ligne 713 en 18.0 (e2ab18b), ligne 712 en 19.0 (ce7f5a3) et ligne 736 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 430 en 17.0 (d203ee6), ligne 430 en 18.0 (e2ab18b), ligne 429 en 19.0 (ce7f5a3) et ligne 444 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 437 en 17.0 (d203ee6), ligne 437 en 18.0 (e2ab18b), ligne 436 en 19.0 (ce7f5a3) et ligne 451 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 442 en 17.0 (d203ee6), ligne 442 en 18.0 (e2ab18b), ligne 441 en 19.0 (ce7f5a3) et ligne 456 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 435 en 17.0 (d203ee6), ligne 435 en 18.0 (e2ab18b), ligne 434 en 19.0 (ce7f5a3) et ligne 449 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_token.py, ligne 131 en 17.0 (d203ee6), ligne 131 en 18.0 (e2ab18b), ligne 131 en 19.0 (ce7f5a3) et ligne 130 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 469 en 17.0 (d203ee6), ligne 469 en 18.0 (e2ab18b), ligne 468 en 19.0 (ce7f5a3) et ligne 487 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 321 en 17.0 (d203ee6), ligne 321 en 18.0 (e2ab18b), ligne 321 en 19.0 (ce7f5a3) et ligne 332 en 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: models/payment_transaction.py, ligne 484 en 17.0 (d203ee6), ligne 484 en 18.0 (e2ab18b), ligne 483 en 19.0 (ce7f5a3) et ligne 502 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 683 en 17.0 (d203ee6), ligne 683 en 18.0 (e2ab18b), ligne 682 en 19.0 (ce7f5a3) et ligne 706 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1016 en 17.0 (d203ee6), ligne 1016 en 18.0 (e2ab18b), ligne 1016 en 19.0 (ce7f5a3) et ligne 1031 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 567 en 17.0 (d203ee6), ligne 567 en 18.0 (e2ab18b), ligne 567 en 19.0 (ce7f5a3) et ligne 569 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1063 en 17.0 (d203ee6), ligne 1063 en 18.0 (e2ab18b), ligne 1063 en 19.0 (ce7f5a3) et ligne 1070 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 408 en 17.0 (d203ee6), ligne 408 en 18.0 (e2ab18b), ligne 408 en 19.0 (ce7f5a3) et ligne 410 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 436 en 17.0 (d203ee6), ligne 436 en 18.0 (e2ab18b), ligne 436 en 19.0 (ce7f5a3) et ligne 438 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1083 en 17.0 (d203ee6), ligne 1083 en 18.0 (e2ab18b), ligne 1083 en 19.0 (ce7f5a3) et ligne 1090 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 495 en 17.0 (d203ee6), ligne 495 en 18.0 (e2ab18b), ligne 495 en 19.0 (ce7f5a3) et ligne 497 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1022 en 17.0 (d203ee6), ligne 1022 en 18.0 (e2ab18b), ligne 1022 en 19.0 (ce7f5a3) et ligne 1037 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 560 en 17.0 (d203ee6), ligne 560 en 18.0 (e2ab18b), ligne 560 en 19.0 (ce7f5a3) et ligne 562 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1481 en 17.0 (d203ee6), ligne 1481 en 18.0 (e2ab18b), ligne 1481 en 19.0 (ce7f5a3) et ligne 1488 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 1233 en 17.0 (d203ee6), ligne 1233 en 18.0 (e2ab18b), ligne 1233 en 19.0 (ce7f5a3) et ligne 1240 en 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: __manifest__.py, ligne 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/events/payment
  • github.com/odoo/odoo/blob/17.0/odoo/http.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml