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

GoCardless refund_payment_invalid_state: tej płatności jeszcze nie można zwrócić

Zwrot w GoCardless oddaje klientowi pieniądze z obciążenia, a GoCardless przyjmuje go tylko wtedy, gdy to obciążenie jest potwierdzone albo już rozliczone. W przeciwnym razie odpowiada refund_payment_invalid_state. Dodatkowo GoCardless ma bezpieczny okres zwrotu wynoszący 7 dni kalendarzowych, a konektor w Odoo dodaje własną regułę 2 dni.

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

Co mówi GoCardless

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

W dokumentacji zwrotów GoCardless podaje termin: „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.”. Ten okres można wyłączyć: „The safer refund period can be disabled by contacting GoCardless.”. I przypomina, po co istnieje: „A payment that has been (partially) refunded can still receive a late failure or chargeback from the customer's bank.”.

Zwroty przez API są ponadto domyślnie wyłączone: „This endpoint is disabled by default. To enable it, you will need to enable refunds on your GoCardless Dashboard.”.

Karta błędu refund_payment_invalid_state w GoCardless
Reason, jego typ invalid_state oraz stany confirmed i paid_out, których GoCardless wymaga do zwrotu.

Reguły terminów w skrócie

Dni od obciążeniaGoCardless, domyślnieKonektor
Mniej niż 2w bezpiecznym okresie: zwraca błądnie wysyła zwrotu
2 lub więcej, ale mniej niż 7w bezpiecznym okresie: zwraca błądwysyła go i zostawia ostrzeżenie w logu serwera
7 lub więcejpoza bezpiecznym okresemwysyła go

Obie strony nie liczą od tego samego momentu. GoCardless liczy od daty obciążenia płatności. Konektor liczy od ostatniej zmiany stanu transakcji obciążenia w Odoo. Jeśli GoCardless wyłączył bezpieczny okres, między 2 a 7 dniem zwrot może przejść.

Kiedy z konektorem pojawia się refund_payment_invalid_state

Odoo pozwala zwrócić tylko potwierdzoną transakcję, a konektor potwierdza ją, gdy GoCardless zwróci confirmed lub paid_out. Ten reason oznacza więc, że płatność zmieniła się w GoCardless, a Odoo jeszcze o tym nie wie: późną awarię, którą GoCardless może zgłosić dla już potwierdzonego obciążenia, albo zwrot od klienta, którego zdarzenie jeszcze nie dotarło.

Co robi konektor

  1. Przy mniej niż 2 dniach nic nie wysyła: Odoo zatrzymuje się na „GoCardless cannot refund a collection until it has settled. This one was charged … day(s) ago; refunds are possible after 2 days.”.
  2. W przeciwnym razie wysyła zwrot do GoCardless z kluczem idempotencji. Jeśli GoCardless go odrzuci, z tym reason, przez bezpieczny okres lub z innego powodu, transakcja zwrotu przechodzi w stan „Błąd” z komunikatem „GoCardless rejected the request.”, a pod nim komunikat GoCardless z reason i request_id.
  3. Jeśli zaakceptuje, transakcja zostaje w stanie „Oczekujące” z komunikatem „Refund submitted. GoCardless will deduct it from a future payout.” i przechodzi w „Potwierdzone”, gdy GoCardless wypłaci zwrot lub potrąci go z rozliczenia.

Od wersji 1.1.5 zwrot w błędzie nie pokazuje przycisku „Retry collection”: zwrot to nie obciążenie i nie ma czego GoCardless mógłby ponowić. Jeśli GoCardless nie zdoła oddać pieniędzy klientowi, konektor przenosi zwrot do błędu z komunikatem „GoCardless could not pay this refund back (…).”. 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 pay this refund back (…).”.

Schemat: co GoCardless odpowiada przy zwrocie i co Odoo robi dzięki konektorowi
Schemat przygotowany na podstawie kodu konektora (17.0, 18.0, 19.0 i 20.0) oraz dokumentacji GoCardless.

Co zrobić

  1. Otwórz transakcję obciążenia z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji pojawia się tylko w trybie deweloperskim i w Odoo 20 nie istnieje. Stamtąd przycisk zwrotów prowadzi do transakcji zwrotu i jej komunikatu.
  2. Jeśli reason to refund_payment_invalid_state, sprawdź płatność w Dashboardzie GoCardless. Jeśli awaria była późna albo klient zwrócił płatność, nie ma czego zwracać: pieniędzy już u Ciebie nie ma. Odoo to odzwierciedli, gdy dotrze zdarzenie; zadanie odzyskujące zgubione zdarzenia co godzinę je pobiera.
  3. Jeśli odrzucenie pochodzi z bezpiecznego okresu, poczekaj, aż upłyną 7 dni od daty obciążenia, albo poproś GoCardless o jego wyłączenie.
  4. Aby zwrócić ponownie, zrób to z płatności obciążenia, przyciskiem zwrotu. Konektor obsługuje zwroty częściowe.

Dlaczego konektor pozwala zwracać od 2 dni, skoro GoCardless mówi o 7?

2 dni to minimum konektora: poniżej niczego nie wysyła. GoCardless pozwala wyłączyć swój bezpieczny okres i dopóki jest włączony, to GoCardless odrzuca zwrot przed 7 dniem. Między 2 a 7 dniem konektor ostrzega w logu, bo awaria SEPA nadal może nadejść.

Czy obciążenie po zwrocie może jeszcze się nie udać?

Tak. GoCardless to zaznacza: płatność zwrócona w całości lub w części może nadal otrzymać późną awarię albo zwrot z banku klienta. Wtedy oddałbyś pieniądze, których w końcu nie zatrzymałeś.

Z naszym konektorem

W Odoo 17, 18, 19 i 20 konektor nie wysyła zwrotów obciążeń młodszych niż 2 dni, zostawia w błędzie z request_id te zwroty, które GoCardless odrzuci, i nie oferuje ponawiania zwrotu, który nie jest obciążeniem.

Czytaj dalej

GoCardless total_amount_confirmation_invalid: suma zwróconych kwot się nie zgadzaGoCardless odrzuca zwrot z total_amount_confirmation_invalid, gdy suma zwróconej kwoty się nie zgadza, lub z number_of_refunds_exceeded po 5 zwrotach.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.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ą.
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/responses-and-errors
  • docs.gocardless.com/docs/api-reference/refund
  • support.gocardless.com/hc/en-gb/articles/360001467265
  • Kod modułu: flexigo_payment_gocardless: const.py, wiersz 41 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 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
  • Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 256 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: const.py, wiersz 106 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 361 w 17.0 (d203ee6), wiersz 361 w 18.0 (e2ab18b), wiersz 360 w 19.0 (ce7f5a3) i wiersz 375 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 365 w 17.0 (d203ee6), wiersz 365 w 18.0 (e2ab18b), wiersz 364 w 19.0 (ce7f5a3) i wiersz 379 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 414 w 17.0 (d203ee6), wiersz 414 w 18.0 (e2ab18b), wiersz 414 w 19.0 (ce7f5a3) i wiersz 416 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 371 w 17.0 (d203ee6), wiersz 371 w 18.0 (e2ab18b), wiersz 370 w 19.0 (ce7f5a3) i wiersz 385 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 397 w 17.0 (d203ee6), wiersz 397 w 18.0 (e2ab18b), wiersz 396 w 19.0 (ce7f5a3) i wiersz 411 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: 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: models/payment_transaction.py, wiersz 413 w 17.0 (d203ee6), wiersz 413 w 18.0 (e2ab18b), wiersz 412 w 19.0 (ce7f5a3) i wiersz 427 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 605 w 17.0 (d203ee6), wiersz 605 w 18.0 (e2ab18b), wiersz 604 w 19.0 (ce7f5a3) i wiersz 625 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 352 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 987 w 17.0 (d203ee6), wiersz 987 w 18.0 (e2ab18b), wiersz 987 w 19.0 (ce7f5a3) i wiersz 1002 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 611 w 17.0 (d203ee6), wiersz 611 w 18.0 (e2ab18b), wiersz 610 w 19.0 (ce7f5a3) i wiersz 631 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 442 w 17.0 (d203ee6), wiersz 442 w 18.0 (e2ab18b), wiersz 442 w 19.0 (ce7f5a3) i wiersz 444 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 424 w 17.0 (d203ee6), wiersz 424 w 18.0 (e2ab18b), wiersz 423 w 19.0 (ce7f5a3) i wiersz 438 w 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: 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: const.py, wiersz 117 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/account_payment/views/account_move_views.xml
  • github.com/odoo/odoo/blob/17.0/odoo/http.py
  • Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)