Salta al contingut principal
GoCardless API · invalid_state

Error retry_failed de GoCardless en reintentar un cobrament des d'Odoo

Reintentar un cobrament és una acció de l'API de GoCardless amb les seves regles: només val per a pagaments que han fallat, amb un mandat actiu i com a màxim 3 vegades. Si el pagament no ha fallat, la resposta és retry_failed. Amb el connector, Odoo només mostra el botó de reintentar quan la seva regla ho permet.

FlexigoTech · Responsable: Víctor Gómez · Actualitzat el 6 de novembre de 2026

L'essencial

Versions
Odoo 17, 18, 19 i 20
Comprovat
al codi del connector, versió 17.0, 18.0, 19.0 i 20.0 · a les fonts enllaçades al final
Lectura
5 min

Què diu GoCardless

ReasonTipusText de GoCardless
retry_failedinvalid_statePayment could not be retried.

La documentació del reintent (POST /payments/{id}/actions/retry) dona les regles: el pagament es reintenta si el seu mandat està actiu, l'API retorna retry_failed si el pagament no ha fallat i «Payments can be retried up to 3 times.». Com amb tots els errors invalid_state, GoCardless demana avisar qui fa servir el sistema i no deixar que reintenti. El connector anota al seu codi que un quart reintent va rebre també retry_failed al sandbox de GoCardless.

Targeta de l'error retry_failed de GoCardless
El reason, el seu tipus invalid_state i el text de GoCardless.

Per què surt

Segons la documentació, retry_failed arriba quan el pagament no ha fallat, i el connector el va veure també en demanar un quart reintent. Amb un mandat que ja no està actiu, la documentació no diu quin error arriba: el connector espera retry_failed o mandate_is_inactive i els tracta igual.

Això d'un pagament que no està fallit abasta més del que sembla. Un cobrament pendent o confirmat no ha fallat, i un de retornat (charged_back) tampoc: els diners van arribar i el banc del client els va retirar després. Segons la documentació de GoCardless, qualsevol d'ells rebria retry_failed.

Amb el límit de reintents, el que confon és Success+. Quan Success+ reintenta un pagament, GoCardless envia un esdeveniment resubmission_requested, igual que amb qualsevol altre reintent. El connector suma un per cada esdeveniment d'aquests, vingui de Success+ o d'un reintent demanat des d'Odoo, i anota al seu codi que el límit de 3 de GoCardless inclou els de Success+. Com que cada cobrament que envia el connector demana retry_if_possible, amb Success+ activat és fàcil que part d'aquest cupo ja estigui gastada quan mires la factura.

El que veus a Odoo amb el connector

La transacció s'obre des de la factura, amb el botó «Transacció de pagament» de dalt; el menú de transaccions només surt en mode desenvolupador, i a Odoo 20 no existeix. El botó «Retry collection» de la transacció només apareix quan el connector acceptaria el reintent: ho controla un camp calculat amb la mateixa regla que comprova el servidor en prémer-lo. Si la regla diu que no, el botó no surt i el seu motiu no arriba a la pantalla. El que veus és l'estat de la transacció i el seu grup GoCardless:

SituacióEl que veus a la transacció
Success+ ho reintentaràEstat «Pendent», la casella «Success+ Will Retry» marcada i, a «Missatge», «GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do.». Sense botó.
Fallit, sense Success+, amb menys de 3 reintents i el mandat actiuEstat «Error» i el botó «Retry collection».
Ja n'hi ha 3Estat «Error» i «GoCardless Retries» a 3. Sense botó.
El mandat està arxivatEstat «Error»; al contacte, la nota del mandat i l'activitat «GoCardless mandate lost». Sense botó.
Pendent o confirmatSense botó.
Retornat, per exemple amb MD06Estat «Error», encara que el mandat segueixi actiu. Sense botó: a GoCardless el pagament és a charged_back, no a failed.

En prémer el botó, Odoo demana confirmar: «GoCardless will try to collect this payment again, which can cost a fee. Continue?». Si GoCardless l'accepta, la transacció passa a pendent amb «Retry requested. GoCardless will confirm the new charge date.». Quan arriba l'esdeveniment resubmission_requested, el connector suma el reintent i escriu la data: «GoCardless will collect this payment again on … (retry requested, retry 1 of 3).». En prémer no suma res, i així cada reintent compta una sola vegada.

El que arriba amb els esdeveniments ho escriu el connector sense ningú al davant. El connector no està traduït al català: aquests textos surten sempre en anglès, també en un Odoo en català, tant si els llança un usuari com una tasca programada: el missatge de Success+ de la taula, la nova data de càrrec i, si el mandat va morir per un esdeveniment, la nota i l'activitat del contacte: «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).» i «GoCardless mandate lost». El que surt de prémer el botó va en el teu idioma.

Esquema: què respon GoCardless amb retry_failed i què fa Odoo amb el connector
Esquema fet a partir del codi del connector (17.0, 18.0, 19.0 i 20.0) i de la documentació de GoCardless.

Si GoCardless contesta retry_failed

Si tot i això l'API contesta retry_failed o mandate_is_inactive, el connector consulta el mandat abans d'ensenyar res:

  • Si el mandat és mort, l'arxiva i ho diu a la transacció: «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.».
  • Si segueix actiu, ensenya l'error de GoCardless tal qual: «GoCardless rejected the request.» i a sota el missatge de l'API, amb el seu reason i el request_id.

Amb un cobrament retornat ja no s'arriba aquí: des de la versió 1.1.4, el connector no ofereix el botó si el pagament no és a failed a GoCardless, i un retornat és a charged_back.

Què fer

  • Si el botó no surt, mira l'estat de la transacció, «Success+ Will Retry» i «GoCardless Retries»: una de les situacions de la taula ho explica.
  • Si ja n'hi ha 3, parla amb el client: el connector ja no en demana un altre.
  • Si el mandat està arxivat, demana'n un de nou i cobra amb ell.
  • En un cobrament retornat no hi ha botó: parla abans amb el client i, si escau, torna a cobrar la factura amb un cobrament nou.

Cada reintent costa diners?

Pot ser. El botó ho avisa abans d'enviar res, i el connector no l'ofereix mentre Success+ va a reintentar el cobrament, perquè un reintent a mà només afegiria una comissió. Les tarifes concretes depenen del teu contracte amb GoCardless.

Puc reintentar un cobrament retornat pel client?

Amb aquest botó, no: el connector no l'ofereix en un cobrament retornat, perquè GoCardless només reintenta pagaments fallits i un retornat no ho és. Una devolució, com un MD06, es resol parlant amb el client i, si escau, amb un cobrament nou.

Amb el nostre connector

A Odoo 17, 18, 19 i 20 el connector compta els reintents amb els esdeveniments de GoCardless i només ensenya el botó quan la seva regla ho permet: ni amb Success+ en marxa, ni amb 3 reintents, ni amb el mandat arxivat. Si tot i això arriba retry_failed, mira el mandat abans d'ensenyar-te l'error.

Continua llegint

GoCardless insufficient_funds (AM04): el compte del client no tenia saldoUn deute de GoCardless falla amb insufficient_funds i el codi SEPA AM04. Què vol dir, quan el reintenta Success+ i què fa Odoo amb la factura.Error mandate_is_inactive de GoCardless en crear un cobrament des d'OdooGoCardless respon mandate_is_inactive en crear un pagament amb un mandat cancel·lat, fallit o caducat. Per què passa i com ho resol el connector a Odoo.GoCardless MD06: el client demana al seu banc que li retorni un cobramentEl client demana al seu banc que li retorni un adeudament de GoCardless: charged_back, refund_requested i MD06. Què passa a Odoo amb la factura i el mandat.
Comprovat al codi del connector (versió 17.0, 18.0, 19.0 i 20.0) i a les fonts enllaçades

Fonts

  • docs.gocardless.com/docs/api-reference/payment
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 119 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • docs.gocardless.com/docs/optimise/reduced-failed-payments-with-success-plus
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 680 a 17.0 (d203ee6), línia 680 a 18.0 (e2ab18b), línia 679 a 19.0 (ce7f5a3) i línia 703 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 449 a 17.0 (d203ee6), línia 449 a 18.0 (e2ab18b), línia 448 a 19.0 (ce7f5a3) i línia 463 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 122 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 260 a 17.0 (d203ee6), línia 260 a 18.0 (e2ab18b), línia 260 a 19.0 (ce7f5a3) i línia 271 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: views/payment_transaction_views.xml, línia 13 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 63 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 418 a 17.0 (d203ee6), línia 418 a 18.0 (e2ab18b), línia 417 a 19.0 (ce7f5a3) i línia 432 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: views/payment_transaction_views.xml, línia 27 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: views/payment_transaction_views.xml, línia 28 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 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/ca.po
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 729 a 17.0 (d203ee6), línia 729 a 18.0 (e2ab18b), línia 728 a 19.0 (ce7f5a3) i línia 752 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 713 a 17.0 (d203ee6), línia 713 a 18.0 (e2ab18b), línia 712 a 19.0 (ce7f5a3) i línia 736 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 430 a 17.0 (d203ee6), línia 430 a 18.0 (e2ab18b), línia 429 a 19.0 (ce7f5a3) i línia 444 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 437 a 17.0 (d203ee6), línia 437 a 18.0 (e2ab18b), línia 436 a 19.0 (ce7f5a3) i línia 451 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 442 a 17.0 (d203ee6), línia 442 a 18.0 (e2ab18b), línia 441 a 19.0 (ce7f5a3) i línia 456 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 435 a 17.0 (d203ee6), línia 435 a 18.0 (e2ab18b), línia 434 a 19.0 (ce7f5a3) i línia 449 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_token.py, línia 131 a 17.0 (d203ee6), línia 131 a 18.0 (e2ab18b), línia 131 a 19.0 (ce7f5a3) i línia 130 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 469 a 17.0 (d203ee6), línia 469 a 18.0 (e2ab18b), línia 468 a 19.0 (ce7f5a3) i línia 487 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 321 a 17.0 (d203ee6), línia 321 a 18.0 (e2ab18b), línia 321 a 19.0 (ce7f5a3) i línia 332 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 397 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 462 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 484 a 17.0 (d203ee6), línia 484 a 18.0 (e2ab18b), línia 483 a 19.0 (ce7f5a3) i línia 502 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 683 a 17.0 (d203ee6), línia 683 a 18.0 (e2ab18b), línia 682 a 19.0 (ce7f5a3) i línia 706 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1016 a 17.0 (d203ee6), línia 1016 a 18.0 (e2ab18b), línia 1016 a 19.0 (ce7f5a3) i línia 1031 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 567 a 17.0 (d203ee6), línia 567 a 18.0 (e2ab18b), línia 567 a 19.0 (ce7f5a3) i línia 569 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1063 a 17.0 (d203ee6), línia 1063 a 18.0 (e2ab18b), línia 1063 a 19.0 (ce7f5a3) i línia 1070 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 408 a 17.0 (d203ee6), línia 408 a 18.0 (e2ab18b), línia 408 a 19.0 (ce7f5a3) i línia 410 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 436 a 17.0 (d203ee6), línia 436 a 18.0 (e2ab18b), línia 436 a 19.0 (ce7f5a3) i línia 438 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1083 a 17.0 (d203ee6), línia 1083 a 18.0 (e2ab18b), línia 1083 a 19.0 (ce7f5a3) i línia 1090 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 495 a 17.0 (d203ee6), línia 495 a 18.0 (e2ab18b), línia 495 a 19.0 (ce7f5a3) i línia 497 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1022 a 17.0 (d203ee6), línia 1022 a 18.0 (e2ab18b), línia 1022 a 19.0 (ce7f5a3) i línia 1037 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 560 a 17.0 (d203ee6), línia 560 a 18.0 (e2ab18b), línia 560 a 19.0 (ce7f5a3) i línia 562 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1481 a 17.0 (d203ee6), línia 1481 a 18.0 (e2ab18b), línia 1481 a 19.0 (ce7f5a3) i línia 1488 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 1233 a 17.0 (d203ee6), línia 1233 a 18.0 (e2ab18b), línia 1233 a 19.0 (ce7f5a3) i línia 1240 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 521 a 17.0 (d203ee6), línia 521 a 18.0 (e2ab18b), línia 521 a 19.0 (ce7f5a3) i línia 523 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 31 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 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