Co mówi GoCardless
| Reason | Typ | Tekst GoCardless |
|---|---|---|
retry_failed | invalid_state | Payment 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.

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:
| Sytuacja | Co 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 mandatem | Status „Błąd” i przycisk „Retry collection”. |
| Wykonano już 3 ponowienia | Status „Błąd” i „GoCardless Retries” równe 3. Bez przycisku. |
| Mandat jest zarchiwizowany | Status „Błąd”; w kontakcie notatka o mandacie i działanie „GoCardless mandate lost”. Bez przycisku. |
| Oczekująca lub potwierdzona | Bez przycisku. |
| Zwrócona, na przykład z MD06 | Status „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”.

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