Salta al contingut principal
GoCardless · webhooks

Webhook de GoCardless: 498 Token Invalid, 204 i la signatura Webhook-Signature

Els esdeveniments de GoCardless arriben a Odoo per un webhook signat, i la resposta d'Odoo li diu a GoCardless si ha de tornar a intentar-ho. Dos codis tenen un significat especial: 498 per a una signatura que no quadra i 204 per a un esdeveniment que no es reconeix. Amb tots dos, GoCardless deixa de reintentar.

FlexigoTech · Responsable: Víctor Gómez · Actualitzat el 6 de novembre de 2026

L'essencial

Versions
Odoo 17, 18, 19 i 20
Comprovat
al codi del connector, versió 17.0, 18.0, 19.0 i 20.0 · a les fonts enllaçades al final
Lectura
3 min

Què diu GoCardless

RespostaText de GoCardless
498 Token InvalidSignature verification failed. GoCardless will log this and not retry.
204 No ContentEvent type is not recognised. GoCardless will not retry.

Qualsevol altra resposta que no sigui 2xx fa que GoCardless torni a intentar-ho: 9 intents d'entrega en total, el primer més 8 reintents, cada cop més espaiats. A més, espera la resposta com a màxim 10 segons.

Targeta de les respostes 498 i 204 al webhook de GoCardless
Els dos codis que aturen els reintents de GoCardless i el text amb què els documenta.

Com es comprova la signatura

GoCardless signa cada enviament amb un HMAC SHA256 en hexadecimal del cos tal qual, amb el secret del endpoint, i l'envia a la capçalera Webhook-Signature. Si el secret que té Odoo no és el de l'endpoint, cap signatura no quadra. Passa en copiar malament el secret, en regenerar-lo al Dashboard sense actualitzar-lo a Odoo, o en enviar a un Odoo els esdeveniments d'un altre compte.

El connector no es queda amb la primera configuració de GoCardless que troba: busca la que té el secret que signa aquell enviament. Així, una configuració de proves oblidada no rebutja els esdeveniments reals.

Què respon Odoo amb el connector

SituacióOdoo 17, 18 i 19Odoo 20
Cap secret no quadra amb la signatura498401
Signatura bona, cap esdeveniment és seu204204
Esdeveniments aplicats200200

La diferència d'Odoo 20 no és una elecció del connector: el seu servidor HTTP no deixa respondre un codi que no sigui estàndard, i 498 no ho és. El que passa després depèn de com arriben els esdeveniments. En el mode avançat van directes de GoCardless a Odoo: amb 401, GoCardless reintenta un enviament que continuarà sense quadrar, i un secret mal posat es nota com una sèrie de reintents fallits al Dashboard de GoCardless. Amb la connexió en dos clics arriben a través de FlexigoTech Cloud, que tracta aquell 401 com a final, igual que un 498.

Si un esdeveniment no arriba

GoCardless garanteix que cada esdeveniment arriba almenys una vegada, no exactament una: pot repetir-se. El connector guarda cada esdeveniment que aplica, un per esdeveniment i per configuració de GoCardless, i si el mateix arriba una altra vegada no l'aplica dues vegades. Això importa amb els diners: un pagament confirmat dues vegades no ha de registrar dos cobraments a la factura. I si un esdeveniment es perd, la tasca programada que cada hora demana a GoCardless els esdeveniments que falten el recupera, fins a 100 per passada.

Què fer

  1. Si uses la connexió en dos clics («Connect my GoCardless account»), els webhooks els munta FlexigoTech Cloud: no hi ha secret que copiar.
  2. En el mode avançat («Paste an access token (advanced)»), l'endpoint i el seu secret els crees tu al Dashboard de GoCardless: copia el secret exacte a la configuració de GoCardless a Odoo.
  3. Si regeneres el secret, actualitza'l a Odoo de seguida; fins llavors, cada enviament fallarà.
  4. Revisa al Dashboard de GoCardless els enviaments fallits: des d'allà es poden rellançar a mà.
Esquema: què envia GoCardless al webhook i què respon Odoo amb el connector
Esquema fet a partir del codi del connector (17.0, 18.0, 19.0 i 20.0) i de la documentació de GoCardless.

Per què no respondre 500 quan la signatura falla?

Perquè GoCardless reintentaria un enviament que mai no quadrarà. El 498 li diu que s'aturi; a Odoo 20, on no es pot enviar, el connector respon 401, i a través de FlexigoTech Cloud aquell 401 també compta com a final.

Amb el nostre connector

A Odoo 17, 18, 19 i 20 el connector comprova la signatura de cada enviament contra el secret de cada configuració de GoCardless, respon amb els codis que GoCardless entén i, per si alguna cosa es perd, recupera els esdeveniments cada hora.

Continua llegint

GoCardless 409 idempotent_creation_conflict: el cobrament ja existiaGoCardless retorna 409 idempotent_creation_conflict si una clau d'idempotència ja ha creat res. Per què no és un error i com evita el connector cobrar dos cops.Error mandate_is_inactive de GoCardless en crear un cobrament des d'OdooGoCardless respon mandate_is_inactive en crear un pagament amb un mandat cancel·lat, fallit o caducat. Per què passa i com ho resol el connector a Odoo.GoCardless invalid_bank_details: AC01 i BE06, el compte indicat no existeixGoCardless invalid_bank_details amb AC01 o BE06: el compte del mandat no existeix. Per què arriba en el pagament i en el mandat, i què fa Odoo amb el connector.
Comprovat al codi del connector (versió 17.0, 18.0, 19.0 i 20.0) i a les fonts enllaçades

Fonts

  • docs.gocardless.com/docs/api-reference/webhooks
  • Codi del mòdul: flexigo_payment_gocardless: models/gocardless_webhook_event.py, línia 7 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 110 a 17.0 (d203ee6), 18.0 (e2ab18b) i 19.0 (ce7f5a3)
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 113 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 128 a 17.0 (d203ee6), línia 128 a 18.0 (e2ab18b), línia 128 a 19.0 (ce7f5a3) i línia 131 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 103 a 17.0 (d203ee6), línia 103 a 18.0 (e2ab18b), línia 103 a 19.0 (ce7f5a3) i línia 106 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: const.py, línia 117 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_provider.py, línia 71 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 6 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: models/payment_token.py, línia 83 a 17.0 (d203ee6), línia 83 a 18.0 (e2ab18b), línia 83 a 19.0 (ce7f5a3) i línia 82 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: __manifest__.py, línia 31 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 95 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 888 a 17.0 (d203ee6), línia 888 a 18.0 (e2ab18b), línia 888 a 19.0 (ce7f5a3) i línia 903 a 20.0 (688d86b)
  • Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 143 a 17.0 (d203ee6), línia 143 a 18.0 (e2ab18b), línia 143 a 19.0 (ce7f5a3) i línia 145 a 20.0 (688d86b)