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

GoCardless total_amount_confirmation_invalid: suma zwróconych kwot się nie zgadza

Każdy zwrot wysyłany do GoCardless zawiera kwotę kontrolną: wszystko, co zwrócono z tej płatności, łącznie z nowym zwrotem. Jeśli nie zgadza się z tym, co GoCardless ma zapisane, odrzuca zwrot z total_amount_confirmation_invalid. To zabezpieczenie przed sytuacją, w której dwa systemy zwracają tę samą płatność, nie wiedząc o sobie nawzajem.

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

Co mówi GoCardless

ReasonTypTekst GoCardless
total_amount_confirmation_invalidinvalid_stateTotal amount refunded does not match the confirmation value.
number_of_refunds_exceededinvalid_stateMaximum of 5 refunds per payment already reached.

Dokumentacja zwrotów wyjaśnia pierwszy z nich: „total_amount_confirmation_invalid if the confirmation amount doesn't match the total amount refunded for the payment.”. Oraz po co ono jest: „This safeguard is there to prevent two processes from creating refunds without awareness of each other.”.

To pole, według GoCardless, to suma zwrotów już zapisanych przy płatności plus tworzony zwrot, w groszach. W ich przykładzie zwrot na 100 ma total_amount_confirmation równe 150: z tej płatności wcześniej zwrócono już 50.

Karta błędu total_amount_confirmation_invalid z GoCardless
Reason, jego typ invalid_state, pole total_amount_confirmation oraz limit 5 zwrotów na płatność.

Jak konektor liczy tę kwotę

Przy każdym zwrocie konektor sumuje zwroty tej płatności, które w Odoo są oczekujące, autoryzowane lub wykonane, i dodaje nowy. Zwroty w błędzie się nie liczą. Ta suma trafia jako total_amount_confirmation.

Liczenie także oczekujących ma znaczenie: zwrot w drodze jest już zlecony do GoCardless, więc gdyby go nie uwzględnić, kwota byłaby za niska i GoCardless odrzuciłby kolejny zwrot.

Kiedy kwota się nie zgadza

Kwota wynika z tego, co wie Odoo. Jeśli ktoś zwrócił pieniądze z tej płatności inną drogą, na przykład innym programem podłączonym do tego samego konta GoCardless, GoCardless ma to zapisane, a Odoo nie. Suma wysłana przez konektor jest wtedy za niska i GoCardless odrzuca zwrot. Dokładnie na taki przypadek działa to zabezpieczenie: gdyby zaakceptował zwrot, klient dostałby te same pieniądze dwa razy.

number_of_refunds_exceeded to coś innego: konektor pozwala na zwroty częściowe, a GoCardless przyjmuje najwyżej 5 zwrotów na płatność. Szósty zostanie odrzucony, nawet jeśli nadal pozostaje kwota do zwrotu.

Co robi Odoo z konektorem

W Odoo płatność za zlecenie zwraca się z jej poziomu, przyciskiem zwrotu, i tylko wtedy, gdy jej transakcja jest potwierdzona. Konektor wysyła zwrot z kluczem idempotentności, a jeśli GoCardless go odrzuci, transakcja zwrotu przechodzi w stan „Błąd” z komunikatem „GoCardless rejected the request.” i poniżej komunikatem GoCardless z reason oraz request_id w nawiasach kwadratowych.

Od wersji 1.1.5 zwrot w błędzie nie pokazuje przycisku „Retry collection”: zwrot to nie obciążenie.

Schemat: co GoCardless odpowiada, gdy kwota się nie zgadza, i co robi Odoo z konektorem
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, a w Odoo 20 go nie ma. Stamtąd przycisk zwrotów prowadzi do transakcji zwrotu i jej komunikatu.
  2. Przy total_amount_confirmation_invalid sprawdź w Dashboardzie GoCardless zwroty tej płatności. Jeśli któryś wykonano poza Odoo, pieniądze już wróciły do klienta: nie zwracaj ich ponownie z Odoo.
  3. Przy number_of_refunds_exceeded ta płatność nie przyjmuje w GoCardless więcej zwrotów. Jeśli nadal trzeba coś zwrócić, musi to pójść inną drogą.
  4. Aby nie dojść do limitu, połącz w jeden zwrot wszystko, co trzeba zwrócić z tego samego obciążenia.
  5. Jeśli potrzebujesz GoCardless, zachowaj request_id z komunikatu: ich dokumentacja prosi o podanie go przy kontakcie z pomocą techniczną.

Dlaczego Odoo nie widzi zwrotów wykonanych inną drogą?

GoCardless informuje webhookiem o każdym utworzonym zwrocie, ale konektor stosuje te powiadomienia tylko do zwrotów, które ma w Odoo: zwrot utworzony inną drogą nie ma transakcji i nie wchodzi do kwoty.

Czy mogę zwrócić tylko część obciążenia?

Tak. Konektor pozwala na zwroty częściowe, do limitu 5 zwrotów na płatność ustalonego przez GoCardless; każdy z nich w swojej kwocie kontrolnej uwzględnia wcześniejsze.

Z naszym konektorem

W Odoo 17, 18, 19 i 20 konektor wysyła przy każdym zwrocie sumę zwróconych kwot z tej płatności, łącznie z tymi w drodze, aby GoCardless zatrzymał podwójny zwrot zamiast go wykonać, a odrzucenie zostawia w transakcji wraz z jej request_id.

Czytaj dalej

GoCardless refund_payment_invalid_state: tej płatności jeszcze nie można zwrócićGoCardless zwraca refund_payment_invalid_state, gdy płatność nie jest confirmed ani paid_out. Zasady terminów GoCardless i konektora w Odoo.GoCardless 409 idempotent_creation_conflict: obciążenie już istniałoGoCardless zwraca 409 idempotent_creation_conflict, gdy klucz idempotentności coś już utworzył. Czemu to nie błąd i jak konektor zapobiega podwójnej opłacie.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/responses-and-errors
  • docs.gocardless.com/docs/api-reference/refund
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 550 w 17.0 (d203ee6), wiersz 550 w 18.0 (e2ab18b), wiersz 549 w 19.0 (ce7f5a3) i wiersz 568 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 389 w 17.0 (d203ee6), wiersz 389 w 18.0 (e2ab18b), wiersz 388 w 19.0 (ce7f5a3) i wiersz 403 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 383 w 17.0 (d203ee6), wiersz 383 w 18.0 (e2ab18b), wiersz 382 w 19.0 (ce7f5a3) i wiersz 397 w 20.0 (688d86b)
  • 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: 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 352 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 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 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)
  • 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
  • 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
  • Kod modułu: flexigo_payment_gocardless: __manifest__.py, wiersz 31 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • github.com/odoo/odoo/blob/17.0/odoo/http.py