Co mówi GoCardless
| Odpowiedź | Tekst GoCardless |
|---|---|
| 498 Token Invalid | Signature verification failed. GoCardless will log this and not retry. |
| 204 No Content | Event 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.

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
| Sytuacja | Odoo 17, 18 i 19 | Odoo 20 |
|---|---|---|
| Żaden sekret nie pasuje do sygnatury | 498 | 401 |
| Dobra sygnatura, żadne zdarzenie nie jest jego | 204 | 204 |
| Zdarzenia zastosowane | 200 | 200 |
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ć
- Jeśli używasz połączenia w dwóch kliknięciach („Connect my GoCardless account”), webhooki ustawia FlexigoTech Cloud: nie ma sekretu do kopiowania.
- 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.
- Jeśli regenerujesz sekret, zaktualizuj go w Odoo od razu; do tego czasu każde wysłanie się nie powiedzie.
- Sprawdź w Dashboardzie GoCardless nieudane wysyłki: stamtąd można je ponowić ręcznie.

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
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)
