Co mówi GoCardless
| Reason | Tipo | Texto de GoCardless |
|---|---|---|
access_token_revoked | invalid_api_usage | Token has been revoked by the user. |
access_token_not_active | invalid_api_usage | Token has been disabled. |
unauthorized | invalid_api_usage | Credentials not recognised. |
Dla Odoo wszystkie trzy oznaczają to samo: poświadczenie, którym wysyłane są żądania, nie działa już. W tabeli kodów HTTP GoCardless zarezerwowało 401 właśnie dla tego przypadku: „Missing or invalid Authorization header, or the user has been disabled.”. To błędy invalid_api_usage, wynikające ze sposobu wysłania żądania, a w ich przypadku GoCardless zaleca powiadomienie zespołu technicznego („alert your dev team”).

Kiedy token przestaje działać
Konektor łączy się z GoCardless na dwa sposoby i token wygasa w każdym z nich inaczej:
- „Connect my GoCardless account” to połączenie jednym kliknięciem, przez FlexigoTech: integrację partnerską. Zgodnie z przewodnikiem dla partnerów GoCardless, sprzedawca może cofnąć ten dostęp w swoim Dashboardzie („they can revoke your access from the GoCardless dashboard”) albo zamknąć konto. Wtedy GoCardless wysyła ostatni webhook i token przestaje działać: „Your access token stops working, so you can't make any more API calls for that user.”.
- „Paste an access token (advanced)” to tryb, w którym sam tworzysz token w Dashboardzie GoCardless i wklejasz go do Odoo. Jeśli cofniesz go lub wyłączysz tam, Odoo dowie się o tym przy następnym żądaniu, gdy GoCardless je odrzuci.
Co robi Odoo z konektorem
Przy połączeniu jednym kliknięciem ostatni webhook przychodzi bez identyfikatora zdarzenia, jako organisations · disconnected. Konektor stosuje go w następujący sposób:
- Usuwa token i sekret webhooka, a połączenie dostawcy przechodzi w stan „Disconnected in GoCardless”.
- Zapisuje w kontakcie Twojej firmy: „GoCardless reports that the account was disconnected from Odoo on … (…). No collection can be taken until it is connected again.”, z datą i przyczyną podaną przez GoCardless.
- Tworzy aktywność „GoCardless disconnected”, aby ktoś to zauważył, nie otwierając dostawcy.
Od tego momentu konektor nie wywołuje już GoCardless przez tego dostawcę: zadanie co godzinę go pomija, a płatność zapisaną metodą płatności klienta przechodzi w stan „Błąd” z komunikatem „This provider is not connected to GoCardless any more: connect it again first.”.
Bez tego powiadomienia token nadal jest zapisany, a GoCardless odrzuca każde żądanie. Przy płatności transakcja przechodzi w stan „Błąd” z komunikatem „GoCardless rejected the request.” i poniżej z komunikatem GoCardless zawierającym reason (access_token_revoked, access_token_not_active lub unauthorized) oraz request_id w nawiasach kwadratowych. Faktura pozostaje nieopłacona, a zadanie co godzinę nie ponawia transakcji w stanie błędu.
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: powiadomienie w kontakcie i aktywność („GoCardless reports that the account was disconnected from Odoo on … (…). No collection can be taken until it is connected again.” oraz „GoCardless disconnected”), a przy płatności „This provider is not connected to GoCardless any more: connect it again first.” i „GoCardless rejected the request.”, na przykład gdy odnowienie subskrypcji uruchamia zaplanowane działanie.

Co zrobić
- Otwórz transakcję z faktury, przyciskiem „Transakcja płatnicza” u góry; menu transakcji jest widoczne tylko w trybie deweloperskim, a w Odoo 20 nie istnieje. Jeśli komunikat mówi, że dostawca nie jest już połączony, albo wskazuje jeden z trzech reasonów, problemem jest połączenie, a nie klient ani jego mandat.
- Przy połączeniu jednym kliknięciem otwórz dostawcę płatności GoCardless i połącz się ponownie przez „Connect my GoCardless account”.
- W trybie zaawansowanym utwórz nowy token w Dashboardzie GoCardless, wklej go w polu „GoCardless Access Token” i kliknij „Test connection”. Konektor pobiera z GoCardless wierzyciela Twojego konta tym tokenem: jeśli GoCardless go odrzuci, zobaczysz jego błąd od razu, a nie przy następnej płatności.
- Gdy połączenie znowu działa, ponów płatności za faktury, które pozostały nieopłacone. Transakcje w błędzie nie są wysyłane ponownie automatycznie.
- Jeśli potrzebujesz pomocy GoCardless, zapisz
request_idz komunikatu: ich dokumentacja prosi o podanie go przy kontakcie z pomocą techniczną.
Dlaczego konektor usuwa token zamiast dalej próbować?
Ponieważ GoCardless informuje, że ten token już nie działa. Dzięki temu kolejne płatności wyjaśniają, co się stało (dostawca nie jest już połączony), zamiast otrzymywać jedno odrzucenie za drugim, a w kontakcie firmy zapisane jest, kiedy i dlaczego została rozłączona.
Czy token z sandboxa działa z kontem produkcyjnym?
Nie. Pomoc przy polu tokenu mówi to wprost: tokeny sandboxa zaczynają się od sandbox_ i działają tylko z API sandboxa. Do prawdziwych płatności potrzebny jest token produkcyjny.
Z naszym konektorem
W Odoo 17, 18, 19 i 20 konektor nie pozwala, by martwy token przerodził się w łańcuch nieudanych płatności bez wyjaśnienia: jeśli GoCardless zgłosi rozłączenie, zapisuje to w firmie i w aktywności, a jeśli nie zgłosi, każde odrzucenie zawiera reason i request_id od GoCardless.
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/responses-and-errors
- docs.gocardless.com/docs/partner-integrations/connect-your-merchants
- docs.gocardless.com/docs/partner-integrations/webhooks-for-partners
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 71 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 143 w 17.0 (d203ee6), wiersz 143 w 18.0 (e2ab18b), wiersz 143 w 19.0 (ce7f5a3) i wiersz 145 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 888 w 17.0 (d203ee6), wiersz 888 w 18.0 (e2ab18b), wiersz 888 w 19.0 (ce7f5a3) i wiersz 903 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 1237 w 17.0 (d203ee6), wiersz 1237 w 18.0 (e2ab18b), wiersz 1237 w 19.0 (ce7f5a3) i wiersz 1234 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 1241 w 17.0 (d203ee6), wiersz 1241 w 18.0 (e2ab18b), wiersz 1241 w 19.0 (ce7f5a3) i wiersz 1238 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 265 w 17.0 (d203ee6), wiersz 265 w 18.0 (e2ab18b), wiersz 265 w 19.0 (ce7f5a3) i wiersz 267 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 545 w 17.0 (d203ee6), wiersz 545 w 18.0 (e2ab18b), wiersz 545 w 19.0 (ce7f5a3) i wiersz 547 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 456 w 17.0 (d203ee6), wiersz 456 w 18.0 (e2ab18b), wiersz 456 w 19.0 (ce7f5a3) i wiersz 458 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 732 w 17.0 (d203ee6), wiersz 732 w 18.0 (e2ab18b), wiersz 732 w 19.0 (ce7f5a3) i wiersz 734 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 336 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 1740 w 17.0 (d203ee6), wiersz 1740 w 18.0 (e2ab18b), wiersz 1740 w 19.0 (ce7f5a3) i wiersz 1745 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 281 w 17.0 (d203ee6), wiersz 281 w 18.0 (e2ab18b), wiersz 281 w 19.0 (ce7f5a3) i wiersz 292 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_transaction.py, wiersz 247 w 17.0 (d203ee6), wiersz 247 w 18.0 (e2ab18b), wiersz 247 w 19.0 (ce7f5a3) i wiersz 258 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 623 w 17.0 (d203ee6), wiersz 623 w 18.0 (e2ab18b), wiersz 623 w 19.0 (ce7f5a3) i wiersz 625 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: models/payment_provider.py, wiersz 742 w 17.0 (d203ee6), wiersz 742 w 18.0 (e2ab18b), wiersz 742 w 19.0 (ce7f5a3) i wiersz 744 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1100 w 17.0 (d203ee6), wiersz 1100 w 18.0 (e2ab18b), wiersz 1100 w 19.0 (ce7f5a3) i wiersz 1107 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 346 w 17.0 (d203ee6), wiersz 346 w 18.0 (e2ab18b), wiersz 346 w 19.0 (ce7f5a3) i wiersz 348 w 20.0 (688d86b)
- Kod modułu: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, wiersz 1167 w 17.0 (d203ee6), wiersz 1167 w 18.0 (e2ab18b), wiersz 1167 w 19.0 (ce7f5a3) i wiersz 1174 w 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)
