Aller au contenu principal
API GoCardless · invalid_state · remboursements

GoCardless refund_payment_invalid_state : ce prélèvement ne peut pas encore être remboursé

Un remboursement GoCardless rend au client l'argent d'un prélèvement, et GoCardless ne l'accepte que si ce prélèvement est confirmé ou déjà versé. Sinon, il répond refund_payment_invalid_state. De plus, GoCardless applique une période de remboursement sécurisée de 7 jours calendaires, et le connecteur Odoo ajoute sa propre règle de 2 jours.

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

Ce que dit GoCardless

ReasonTipoTexte de GoCardless
refund_payment_invalid_stateinvalid_statePayment must be confirmed or paid_out before it can be refunded.

Dans la référence des remboursements, GoCardless ajoute un délai : « A refund can only be created once it is outside the safer refund period (7 calendar days after the charge date) otherwise an error is returned. ». Cette période peut être désactivée : « The safer refund period can be disabled by contacting GoCardless. ». Et il rappelle pourquoi elle existe : « A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank. ».

Les remboursements par l'API, par ailleurs, sont désactivés par défaut : « This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard. ».

Carte de l'erreur refund_payment_invalid_state de GoCardless
Le reason, son type invalid_state et les statuts confirmed et paid_out que GoCardless exige pour rembourser.

Les règles de délai, en un coup d'œil

Jours depuis le prélèvementGoCardless, par défautLe connecteur
Moins de 2période sécurisée : renvoie une erreurn'envoie pas le remboursement
2 ou plus, mais moins de 7période sécurisée : renvoie une erreurl'envoie et laisse un avertissement dans le journal du serveur
7 ou plushors période sécuriséel'envoie

Les deux ne comptent pas à partir du même point. GoCardless compte à partir de la date de débit du paiement. Le connecteur compte à partir du dernier changement d'état de la transaction du prélèvement dans Odoo. Si GoCardless a retiré la période sécurisée, entre 2 et 7 jours le remboursement peut aboutir.

Quand refund_payment_invalid_state apparaît avec le connecteur

Odoo ne permet de rembourser qu'une transaction confirmée, et le connecteur la confirme lorsque GoCardless indique confirmed ou paid_out. Ce reason signifie donc que le paiement a changé chez GoCardless et qu'Odoo ne le sait pas encore : un échec tardif, que GoCardless peut communiquer alors que le paiement est déjà confirmé, ou un remboursement demandé par le client dont l'événement n'est pas encore arrivé.

Ce que fait le connecteur

  1. En dessous de 2 jours, il n'envoie rien : Odoo s'arrête avec « GoCardless cannot refund a collection until it has settled. This one was charged … day(s) ago; refunds are possible after 2 days. ».
  2. Sinon, il envoie le remboursement à GoCardless avec sa clé d'idempotence. Si GoCardless le rejette, pour ce reason, pour la période sécurisée ou pour tout autre motif, la transaction de remboursement passe à « Erreur » avec « GoCardless rejected the request. » et, dessous, le message de GoCardless avec le reason et le request_id.
  3. S'il l'accepte, la transaction reste « En attente » avec « Refund submitted. GoCardless will deduct it from a future payout. », puis passe à « Confirmé » lorsque GoCardless le paie ou le déduit d'un versement.

Depuis la version 1.1.5, un remboursement en erreur n'affiche pas le bouton « Retry collection » : un remboursement n'est pas un prélèvement, et GoCardless n'a rien à réessayer. Si GoCardless ne parvient pas à rendre l'argent au client, le connecteur passe le remboursement en erreur avec « GoCardless could not pay this refund back (…). ». 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 pay this refund back (…). ».

Schéma : ce que répond GoCardless lors d'un remboursement 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.

Que faire

  1. Ouvrez la transaction du prélèvement 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. Depuis là, le bouton de remboursements mène à la transaction du remboursement et à son message.
  2. Si le reason est refund_payment_invalid_state, consultez le paiement dans le Dashboard GoCardless. Si l'échec est tardif ou si le client a demandé un remboursement, il n'y a rien à rembourser : l'argent n'est plus chez vous. Odoo le reflétera à l'arrivée de l'événement ; la tâche qui récupère chaque heure les événements manqués le fera.
  3. Si le refus vient de la période sécurisée, attendez 7 jours après la date de débit, ou demandez à GoCardless de la retirer.
  4. Pour rembourser à nouveau, faites-le depuis le paiement du prélèvement, avec son bouton de remboursement. Le connecteur accepte les remboursements partiels.

Pourquoi le connecteur autorise-t-il le remboursement dès 2 jours alors que GoCardless parle de 7 ?

Les 2 jours sont le minimum du connecteur : en dessous, il n'envoie rien. GoCardless permet de retirer sa période sécurisée, et tant qu'elle est active c'est GoCardless qui rejette le remboursement avant 7 jours. Entre 2 et 7 jours, le connecteur signale l'opération dans le journal, car un échec SEPA peut encore arriver.

Un prélèvement remboursé peut-il encore échouer ?

Oui. GoCardless le signale : un paiement remboursé, totalement ou partiellement, peut encore recevoir un échec tardif ou un rejet de la banque du client. Dans ce cas, vous auriez rendu de l'argent que vous n'avez finalement pas gardé.

Avec notre connecteur

Dans Odoo 17, 18, 19 et 20, le connecteur n'envoie pas de remboursements de prélèvements de moins de 2 jours, consigne en erreur, avec leur request_id, ceux que GoCardless rejette, et ne propose pas de réessayer un remboursement, qui n'est pas un prélèvement.

À lire aussi

GoCardless total_amount_confirmation_invalid : le total remboursé ne correspond pasGoCardless refuse un remboursement avec total_amount_confirmation_invalid si le total remboursé ne correspond pas, ou number_of_refunds_exceeded au-delà de 5.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.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.
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/refund
  • support.gocardless.com/hc/en-gb/articles/360001467265
  • Code du module : flexigo_payment_gocardless: const.py, ligne 41 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/models/payment_transaction.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_payment_views.xml
  • Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 256 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: const.py, ligne 106 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 361 en 17.0 (d203ee6), ligne 361 en 18.0 (e2ab18b), ligne 360 en 19.0 (ce7f5a3) et ligne 375 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 365 en 17.0 (d203ee6), ligne 365 en 18.0 (e2ab18b), ligne 364 en 19.0 (ce7f5a3) et ligne 379 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 414 en 17.0 (d203ee6), ligne 414 en 18.0 (e2ab18b), ligne 414 en 19.0 (ce7f5a3) et ligne 416 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 371 en 17.0 (d203ee6), ligne 371 en 18.0 (e2ab18b), ligne 370 en 19.0 (ce7f5a3) et ligne 385 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 397 en 17.0 (d203ee6), ligne 397 en 18.0 (e2ab18b), ligne 396 en 19.0 (ce7f5a3) et ligne 411 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: 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 413 en 17.0 (d203ee6), ligne 413 en 18.0 (e2ab18b), ligne 412 en 19.0 (ce7f5a3) et ligne 427 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 605 en 17.0 (d203ee6), ligne 605 en 18.0 (e2ab18b), ligne 604 en 19.0 (ce7f5a3) et ligne 625 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_provider.py, ligne 352 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 987 en 17.0 (d203ee6), ligne 987 en 18.0 (e2ab18b), ligne 987 en 19.0 (ce7f5a3) et ligne 1002 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 611 en 17.0 (d203ee6), ligne 611 en 18.0 (e2ab18b), ligne 610 en 19.0 (ce7f5a3) et ligne 631 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, ligne 442 en 17.0 (d203ee6), ligne 442 en 18.0 (e2ab18b), ligne 442 en 19.0 (ce7f5a3) et ligne 444 en 20.0 (688d86b)
  • Code du module : flexigo_payment_gocardless: models/payment_transaction.py, ligne 424 en 17.0 (d203ee6), ligne 424 en 18.0 (e2ab18b), ligne 423 en 19.0 (ce7f5a3) et ligne 438 en 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: 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: const.py, ligne 117 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) et 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)