Przejdź do głównej treści
GoCardless API · invalid_state

Błąd retry_failed GoCardless przy ponawianiu płatności z Odoo

Ponowienie płatności to akcja API GoCardless z własnymi regułami: działa tylko dla płatności, które się nie powiodły, przy aktywnym mandacie i najwyżej 3 razy. Jeśli płatność się nie powiodła, odpowiedzią jest retry_failed. Z konektorem Odoo pokazuje przycisk ponowienia tylko wtedy, gdy na to pozwala jego reguła.

FlexigoTech · Odpowiada: Víctor Gómez · Aktualizacja: 6 listopada 2026

Najważniejsze

Wersje
Odoo 17, 18, 19 i 20
Sprawdzone
w kodzie źródłowym konektora, wersja 17.0, 18.0, 19.0 i 20.0 · w źródłach podanych na końcu
Czas czytania
5 min

Co mówi GoCardless

ReasonTypTekst GoCardless
retry_failedinvalid_statePayment could not be retried.

Dokumentacja ponowienia (POST /payments/{id}/actions/retry) podaje reguły: płatność jest ponawiana, jeśli jej mandat jest aktywny, API zwraca retry_failed, jeśli płatność nie zakończyła się niepowodzeniem, a „Payments can be retried up to 3 times.”. Jak przy wszystkich błędach invalid_state, GoCardless prosi, by poinformować osobę korzystającą z systemu i nie pozwalać jej ponawiać. Konektor zapisuje w kodzie, że czwarte ponowienie również dostało retry_failed w sandboxie GoCardless.

Karta błędu retry_failed w GoCardless
Reason, jego typ invalid_state i tekst GoCardless.

Dlaczego się pojawia

Według dokumentacji retry_failed pojawia się, gdy płatność nie zakończyła się niepowodzeniem, a konektor widział go także przy próbie czwartego ponowienia. Przy mandacie, który nie jest już aktywny, dokumentacja nie mówi, jaki błąd przychodzi: konektor spodziewa się retry_failed lub mandate_is_inactive i traktuje oba tak samo.

Pojęcie płatności, która nie zakończyła się niepowodzeniem, obejmuje więcej, niż się wydaje. Pobranie oczekujące lub potwierdzone nie nie powiodło się, a zwrócone (charged_back) również nie: pieniądze dotarły, a bank klienta wycofał je później. Według dokumentacji GoCardless każda z tych płatności dostałaby retry_failed.

Przy limicie ponowień mylący bywa Success+. Gdy Success+ ponawia płatność, GoCardless wysyła zdarzenie resubmission_requested, tak samo jak przy każdym innym ponowieniu. Konektor dolicza jedno ponowienie za każde takie zdarzenie, niezależnie od tego, czy pochodzi z Success+, czy z ponowienia zleconego z Odoo, i zapisuje w kodzie, że limit 3 w GoCardless obejmuje także ponowienia Success+. Ponieważ każde pobranie wysyłane przez konektor prosi o retry_if_possible, przy włączonym Success+ łatwo o to, że część tego limitu jest już wykorzystana, zanim spojrzysz na fakturę.

Co widzisz w Odoo z konektorem

Transakcję otwiera się z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji jest dostępne tylko w trybie programisty, a w Odoo 20 go nie ma. Przycisk „Retry collection” przy transakcji pojawia się tylko wtedy, gdy konektor przyjąłby ponowienie: kontroluje to pole obliczane tą samą regułą, którą serwer sprawdza po kliknięciu. Jeśli reguła mówi nie, przycisku nie ma, a jej powód nie trafia na ekran. Widzisz status transakcji i jej grupę GoCardless:

SytuacjaCo widzisz w transakcji
Success+ zamierza ponowićStatus „Oczekujące”, zaznaczone pole „Success+ Will Retry” i w polu „Wiadomość” komunikat „GoCardless could not collect this payment (…). Success+ will retry it automatically; there is nothing to do.”. Bez przycisku.
Nieudana, bez Success+, z mniej niż 3 ponowieniami i aktywnym mandatemStatus „Błąd” i przycisk „Retry collection”.
Wykonano już 3 ponowieniaStatus „Błąd” i „GoCardless Retries” równe 3. Bez przycisku.
Mandat jest zarchiwizowanyStatus „Błąd”; w kontakcie notatka o mandacie i działanie „GoCardless mandate lost”. Bez przycisku.
Oczekująca lub potwierdzonaBez przycisku.
Zwrócona, na przykład z MD06Status „Błąd”, nawet gdy mandat nadal jest aktywny. Bez przycisku: w GoCardless płatność ma status charged_back, a nie failed.

Po kliknięciu przycisku Odoo prosi o potwierdzenie: „GoCardless will try to collect this payment again, which can cost a fee. Continue?”. Jeśli GoCardless przyjmie żądanie, transakcja przechodzi w stan oczekujący z komunikatem „Retry requested. GoCardless will confirm the new charge date.”. Gdy nadejdzie zdarzenie resubmission_requested, konektor dolicza ponowienie i zapisuje datę: „GoCardless will collect this payment again on … (retry requested, retry 1 of 3).”. Kliknięcie niczego nie dolicza, dzięki czemu każde ponowienie liczy się tylko raz.

To, co przychodzi ze zdarzeniami, zapisuje konektor bez udziału użytkownika: komunikat Success+ z tabeli, nową datę pobrania i, jeśli mandat wygasł przez zdarzenie, notatkę oraz działanie w kontakcie. Konektor nie jest przetłumaczony na polski: te teksty zawsze pojawiają się po angielsku, także w Odoo po polsku, niezależnie od tego, czy uruchamia je użytkownik, czy zaplanowane działanie: „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”.

Schemat: co odpowiada GoCardless z retry_failed i co robi Odoo z konektorem
Schemat przygotowany na podstawie kodu konektora (17.0, 18.0, 19.0 i 20.0) i dokumentacji GoCardless.

Jeśli GoCardless odpowie retry_failed

Jeśli mimo to API odpowie retry_failed lub mandate_is_inactive, konektor sprawdza mandat, zanim cokolwiek pokaże:

  • Jeśli mandat wygasł, archiwizuje go i informuje o tym w transakcji: „The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.”.
  • Jeśli nadal jest aktywny, pokazuje błąd GoCardless bez zmian: „GoCardless rejected the request.” a pod spodem komunikat API z jego reason i request_id.

Przy pobraniu zwróconym już tu nie dojdzie: od wersji 1.1.4 konektor nie oferuje przycisku, jeśli płatność nie ma w GoCardless statusu failed, a zwrócona ma charged_back.

Co zrobić

  • Jeśli przycisku nie ma, sprawdź status transakcji, „Success+ Will Retry” i „GoCardless Retries”: jedna z sytuacji z tabeli to wyjaśnia.
  • Jeśli wykonano 3 ponowienia, porozmawiaj z klientem: konektor nie zleci kolejnego.
  • Jeśli mandat jest zarchiwizowany, poproś o nowy i pobierz płatność z jego użyciem.
  • Przy pobraniu zwróconym przycisku nie ma: najpierw porozmawiaj z klientem i, jeśli trzeba, pobierz fakturę ponownie nowym pobraniem.

Czy każde ponowienie kosztuje?

Może. Przycisk ostrzega o tym przed wysłaniem czegokolwiek, a konektor nie oferuje go, gdy Success+ zamierza ponowić pobranie, bo ręczne ponowienie dodałoby tylko opłatę. Konkretne stawki zależą od Twojej umowy z GoCardless.

Czy mogę ponowić pobranie zwrócone przez klienta?

Tym przyciskiem nie: konektor nie oferuje go przy pobraniu zwróconym, bo GoCardless ponawia tylko płatności nieudane, a zwrócona taką nie jest. Zwrot, jak MD06, rozwiązuje się rozmową z klientem i, jeśli trzeba, nowym pobraniem.

Z naszym konektorem

W Odoo 17, 18, 19 i 20 konektor liczy ponowienia na podstawie zdarzeń GoCardless i pokazuje przycisk tylko wtedy, gdy pozwala na to jego reguła: nie przy działającym Success+, nie przy 3 ponowieniach i nie przy zarchiwizowanym mandacie. Jeśli mimo to nadejdzie retry_failed, sprawdza mandat, zanim pokaże Ci błąd.

Czytaj dalej

GoCardless insufficient_funds (AM04): na koncie klienta brakowało środkówPolecenie zapłaty GoCardless kończy się błędem insufficient_funds i kodem SEPA AM04. Co oznacza, kiedy Success+ ponawia próbę i co Odoo robi z fakturą.Błąd mandate_is_inactive w GoCardless przy tworzeniu pobrania z OdooGoCardless zwraca mandate_is_inactive przy płatności z mandatem anulowanym, nieudanym lub wygasłym. Dlaczego tak się dzieje i jak obsługuje to konektor w Odoo.GoCardless MD06: klient zleca swojemu bankowi zwrot obciążeniaKlient zleca swojemu bankowi zwrot obciążenia GoCardless: charged_back, refund_requested i MD06. Co dzieje się w Odoo z fakturą i mandatem.
Sprawdzone w kodzie źródłowym konektora (wersja 17.0, 18.0, 19.0 i 20.0) i w podlinkowanych źródłach

Źródła

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