Przejdź do głównej treści
GoCardless · webhooki

Webhook GoCardless: 498 Token Invalid, 204 i podpis Webhook-Signature

Zdarzenia GoCardless docierają do Odoo przez podpisany webhook, a odpowiedź Odoo mówi GoCardless, czy ma ponowić próbę. Dwa kody mają szczególne znaczenie: 498 dla podpisu, który nie pasuje, i 204 dla zdarzenia, którego nie rozpoznano. Przy obu GoCardless przestaje ponawiać.

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

OdpowiedźTekst GoCardless
498 Token InvalidSignature verification failed. GoCardless will log this and not retry.
204 No ContentEvent type is not recognised. GoCardless will not retry.

Każda inna odpowiedź niż 2xx powoduje, że GoCardless ponawia próbę: łącznie 9 prób dostarczenia, pierwsza plus 8 ponowień, coraz rzadziej. Ponadto czeka na odpowiedź najwyżej 10 sekund.

Tabela odpowiedzi 498 i 204 na webhook GoCardless
Dwa kody, które zatrzymują ponowienia GoCardless, oraz tekst, którym je dokumentuje.

Jak sprawdzana jest sygnatura

GoCardless podpisuje każde wysłanie HMAC SHA256 w postaci szesnastkowej z treści dokładnie tak, jak jest, kluczem sekretnym endpointu, i przesyła ją w nagłówku Webhook-Signature. Jeśli sekret, który ma Odoo, nie jest sekretem endpointu, żadna sygnatura się nie zgodzi. Dzieje się tak przy błędnym skopiowaniu sekretu, przy jego regeneracji w Dashboardzie bez aktualizacji w Odoo albo przy wysyłaniu do jednego Odoo zdarzeń z innego konta.

Konektor nie bierze pierwszej konfiguracji GoCardless, jaką znajdzie: szuka tej, która ma sekret podpisujący dane wysłanie. Dzięki temu zapomniana konfiguracja testowa nie odrzuca prawdziwych zdarzeń.

Co odpowiada Odoo z konektorem

SytuacjaOdoo 17, 18 i 19Odoo 20
Żaden sekret nie pasuje do sygnatury498401
Dobra sygnatura, żadne zdarzenie nie jest jego204204
Zdarzenia zastosowane200200

Różnica w Odoo 20 nie wynika z wyboru konektora: jego serwer HTTP nie pozwala zwrócić kodu niestandardowego, a 498 takim nie jest. To, co dzieje się dalej, zależy od sposobu dotarcia zdarzeń. W trybie zaawansowanym idą bezpośrednio z GoCardless do Odoo: przy 401 GoCardless ponawia wysyłanie, które dalej się nie zgodzi, a źle ustawiony sekret widać jako serię nieudanych ponowień w Dashboardzie GoCardless. Przy połączeniu w dwóch kliknięciach docierają przez FlexigoTech Cloud, który traktuje to 401 jako ostateczne, tak jak 498.

Gdy zdarzenie nie dociera

GoCardless gwarantuje, że każde zdarzenie dotrze co najmniej raz, a nie dokładnie raz: może się powtórzyć. Konektor zapisuje każde zastosowane zdarzenie, po jednym na zdarzenie i konfigurację GoCardless, i jeśli to samo przyjdzie ponownie, nie stosuje go dwa razy. Ma to znaczenie przy pieniądzach: płatność potwierdzona dwa razy nie może zarejestrować dwóch wpłat na fakturze. A jeśli zdarzenie zginie, zaplanowane działanie, które co godzinę prosi GoCardless o brakujące zdarzenia, je odzyska, do 100 na przebieg.

Co zrobić

  1. Jeśli używasz połączenia w dwóch kliknięciach („Connect my GoCardless account”), webhooki ustawia FlexigoTech Cloud: nie ma sekretu do kopiowania.
  2. W trybie zaawansowanym („Paste an access token (advanced)”) endpoint i jego sekret tworzysz sam w Dashboardzie GoCardless: skopiuj dokładny sekret do konfiguracji GoCardless w Odoo.
  3. Jeśli regenerujesz sekret, zaktualizuj go w Odoo od razu; do tego czasu każde wysłanie się nie powiedzie.
  4. Sprawdź w Dashboardzie GoCardless nieudane wysyłki: stamtąd można je ponowić ręcznie.
Schemat: co GoCardless wysyła do webhooka i co Odoo odpowiada z konektorem
Schemat przygotowany na podstawie kodu konektora (17.0, 18.0, 19.0 i 20.0) oraz dokumentacji GoCardless.

Dlaczego nie odpowiadać 500, gdy podpis się nie zgadza?

Bo GoCardless ponawiałby wysyłanie, które nigdy nie zostanie zaakceptowane. 498 mówi mu, żeby przestał; w Odoo 20, gdzie nie można go wysłać, konektor odpowiada 401, a przez FlexigoTech Cloud to 401 również liczy się jako ostateczne.

Z naszym konektorem

W Odoo 17, 18, 19 i 20 konektor sprawdza sygnaturę każdego wysłania względem sekretu każdej konfiguracji GoCardless, odpowiada kodami, które GoCardless rozumie, a gdyby coś zginęło, co godzinę odzyskuje zdarzenia.

Czytaj dalej

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.Błąd mandate_is_inactive w GoCardless przy tworzeniu pobrania z OdooGoCardless zwraca mandate_is_inactive przy płatności z mandatem anulowanym, nieudanym lub wygasłym. Dlaczego tak się dzieje i jak obsługuje to konektor w Odoo.GoCardless invalid_bank_details: AC01 i BE06, wskazany rachunek nie istniejeGoCardless invalid_bank_details z kodem AC01 lub BE06: rachunek z mandatu nie istnieje. Kiedy się pojawia przy płatności i mandacie oraz co robi konektor.
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/webhooks
  • Kod modułu: flexigo_payment_gocardless: models/gocardless_webhook_event.py, wiersz 7 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: controllers/main.py, wiersz 110 w 17.0 (d203ee6), 18.0 (e2ab18b) i 19.0 (ce7f5a3)
  • Kod modułu: flexigo_payment_gocardless: controllers/main.py, wiersz 113 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: controllers/main.py, wiersz 128 w 17.0 (d203ee6), wiersz 128 w 18.0 (e2ab18b), wiersz 128 w 19.0 (ce7f5a3) i wiersz 131 w 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: controllers/main.py, wiersz 103 w 17.0 (d203ee6), wiersz 103 w 18.0 (e2ab18b), wiersz 103 w 19.0 (ce7f5a3) i wiersz 106 w 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)
  • 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: __manifest__.py, wiersz 6 w 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Kod modułu: flexigo_payment_gocardless: models/payment_token.py, wiersz 83 w 17.0 (d203ee6), wiersz 83 w 18.0 (e2ab18b), wiersz 83 w 19.0 (ce7f5a3) i wiersz 82 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/responses-and-errors
  • Kod modułu: flexigo_payment_gocardless: controllers/main.py, wiersz 95 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: 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)