Jedna przyczyna, cztery kody
| Kod SEPA Core | Tekst GoCardless |
|---|---|
| MS02 | The customer refused to accept this payment. |
| MS03, RR04 | The payment failed but the reason for the failure was not provided, usually for regulatory reasons. |
| SL01 | The payment failed due to a restriction on Direct Debit payments from the payer's bank account. |
Wszystkie trzy wiersze pochodzą z tabeli nieudanych płatności (payments · failed) w dokumentacji GoCardless dla SEPA Core. W przeciwieństwie do innych przyczyn żadna z nich nie mówi, że mandat zostaje anulowany: klient nadal jest upoważniony do obciążeń, mimo że to konkretne obciążenie nie przeszło.

Co kryje się za każdym kodem
MS02 jest najbardziej jednoznaczną odpowiedzią: klient powiedział swojemu bankowi, żeby nie realizował tej składki. Konektor zapisał w komentarzu do kodu, że to kombinacja, którą zaobserwował w testowej płatności SEPA w sandboksie GoCardless. MS03 i RR04 są odwrotnością: płatność nie przechodzi, a bank nie podaje powodu, zwykle z przyczyn regulacyjnych, więc jedynym sposobem, by się dowiedzieć, co się dzieje, jest zapytanie klienta. SL01 wskazuje na konto: jego bank ogranicza obciążenia, które można na nie nałożyć, a zmienić to może tylko właściciel konta w swoim banku.
W przypadku MS02, RR04 i SL01 ponowne przedstawienie polecenia bez wcześniejszej rozmowy z klientem zwykle kończy się tak samo i może wiązać się z kolejną opłatą. MS03 ma wyjątek: według przewodnika Success+ w Austrii, Belgii, Niemczech, Luksemburgu i na Słowacji MS03 liczy się jako brak środków i Success+ może je ponowić. Jeśli tak jest, zdarzenie przychodzi z will_attempt_retry ustawionym na true.
Co robi Odoo z konektorem
Transakcję otwiera się z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji widoczne jest tylko w trybie deweloperskim, a w Odoo 20 w ogóle nie istnieje. Konektor zapisuje przyczynę w polu „GoCardless Cause”, a nie kod SEPA, i wyświetla: „GoCardless could not collect this payment (refer_to_payer).”. Dalej postępuje zgodnie z treścią zdarzenia:
- Jeśli
will_attempt_retryma wartośćtrue, transakcja otrzymuje status „Oczekujące”, zaznaczane jest pole „Success+ Will Retry” i komunikat brzmi: „Success+ will retry it automatically; there is nothing to do.”. Przycisk ponowienia się nie pojawia. - W przeciwnym razie transakcja przechodzi w stan „Błąd” i pojawia się przycisk „Retry collection”, o ile pozostały próby. Jeśli Odoo uznało już obciążenie za zrealizowane, konektor anuluje jego płatność, a faktura wraca do stanu oczekującej na zapłatę.
- Mandat pozostaje bez zmian.
refer_to_payernie znajduje się wśród przyczyn, dla których konektor archiwizuje mandat, więc metoda płatności klienta pozostaje dostępna przy kolejnym obciążeniu.
Ten ostatni punkt jest celowy: archiwizowanie mandatu z powodu jednorazowego odrzucenia zmusiłoby klienta do podpisania nowego bez powodu.
Oba komunikaty zapisuje konektor podczas stosowania zdarzenia, bez udziału człowieka. W bazie danych utworzonej po polsku również wyświetlają się w języku angielskim, ponieważ konektor nie jest przetłumaczony na polski i te teksty zawsze są w języku angielskim: „GoCardless could not collect this payment (refer_to_payer).” oraz „Success+ will retry it automatically; there is nothing to do.”.
Co zrobić zależnie od kodu
Odoo nie informuje, który z czterech kodów nadszedł: konektor zapisuje tylko przyczynę. Kod zobaczysz w GoCardless. Według ich centrum pomocy powód każdej porażki widać na osi czasu płatności w Dashboardzie („You are able to view the reason for a payment failure in the status timeline of the payment in your GoCardless dashboard.”). W trybie zaawansowanym dokładny kod znajduje się też w zdarzeniu (details.reason_code), a Dashboard przechowuje wysyłki webhooków z ostatnich 3 miesięcy w Developers > Webhooks wraz z ich treścią.
| Kod | Pierwszy krok |
|---|---|
| MS02 | Zapytaj klienta, dlaczego odrzucił polecenie: kwota, termin albo niezgoda z fakturą. |
| MS03 | Sprawdź „Success+ Will Retry”: w Austrii, Belgii, Niemczech, Luksemburgu i na Słowacji Success+ może ponowić MS03 jako brak środków. Jeśli pole nie jest zaznaczone, poproś klienta, by skontaktował się z bankiem. |
| RR04 | Poproś klienta, by skontaktował się z bankiem: GoCardless nie otrzymuje powodu. |
| SL01 | Klient musi zdjąć ograniczenie obciążeń ze swojego konta albo podać ci inne. |
Gdy klient potwierdzi, że obciążenie przejdzie, użyj w transakcji przycisku „Retry collection” i potwierdź ostrzeżenie o opłacie. Konektor odpowie „Retry requested. GoCardless will confirm the new charge date.” i zostawi transakcję w stanie oczekującym. Pamiętaj o limicie: płatność można ponowić najwyżej 3 razy („Payments can be retried up to 3 times.”).
Czy mandat zostaje anulowany, jeśli klient odrzuci obciążenie?
Nie. Dokumentacja GoCardless tego nie przewiduje dla tej przyczyny, a konektor nie archiwizuje mandatu przy refer_to_payer. Jeśli klient chce przestać płacić przez polecenie zapłaty, anuluje mandat w swoim banku, a to przychodzi z inną przyczyną: mandate_cancelled.

Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor zamienia refer_to_payer w nieopłaconą fakturę z widoczną przyczyną i mandatem, który nadal obowiązuje. Nie zgaduje kodu SEPA: Odoo zapisuje przyczynę w transakcji, a kod sprawdzasz w GoCardless. Decyzja o ponownym obciążeniu należy do ciebie, po rozmowie z klientem.
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/events/payment
- docs.gocardless.com/docs/api-reference/payment
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 15 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 79 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 76 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 71 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 725 w 17.0 (d203ee6), wiersz 725 w 18.0 (e2ab18b), wiersz 724 w 19.0 (ce7f5a3) i wiersz 748 w 20.0 (688d86b)
- 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 754 w 17.0 (d203ee6), wiersz 754 w 18.0 (e2ab18b), wiersz 753 w 19.0 (ce7f5a3) i wiersz 777 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: 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: 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 356 w 17.0 (d203ee6), wiersz 356 w 18.0 (e2ab18b), wiersz 356 w 19.0 (ce7f5a3) i wiersz 358 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 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: __manifest__.py, wiersz 31 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 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)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pl.po
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- 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 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 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: models/payment_transaction.py, wiersz 461 w 17.0 (d203ee6), wiersz 461 w 18.0 (e2ab18b), wiersz 460 w 19.0 (ce7f5a3) i wiersz 479 w 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/webhooks
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- support.gocardless.com/hc/en-gb/articles/360001467265
- Kod modułu: flexigo_payment_gocardless: const.py, wiersz 66 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
