Saltar para o conteúdo principal
GoCardless · webhooks

Webhook do GoCardless: 498 Token Invalid, 204 e a assinatura Webhook-Signature

Os eventos do GoCardless chegam ao Odoo através de um webhook assinado, e a resposta do Odoo diz ao GoCardless se deve tentar novamente. Dois códigos têm um significado especial: 498 para uma assinatura que não coincide e 204 para um evento que não é reconhecido. Com os dois, o GoCardless deixa de repetir.

FlexigoTech · Responsável: Víctor Gómez · Atualizado em 6 de novembro de 2026

O essencial

Módulo
GoCardless
Versões
Odoo 17, 18, 19 e 20
Verificado
no código do conector, versão 17.0, 18.0, 19.0 e 20.0 · nas fontes indicadas no fim
Leitura
3 min

O que diz o GoCardless

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

Qualquer outra resposta que não seja 2xx faz com que o GoCardless volte a tentar: 9 tentativas de entrega no total, a primeira mais 8 repetições, cada vez mais espaçadas. Além disso, aguarda a resposta no máximo 10 segundos.

Cartão das respostas 498 e 204 ao webhook do GoCardless
Os dois códigos que param as repetições do GoCardless e o texto com que os documenta.

Como se verifica a assinatura

O GoCardless assina cada envio com um HMAC SHA256 em hexadecimal do corpo tal qual, com o segredo do endpoint, e envia-o no cabeçalho Webhook-Signature. Se o segredo que o Odoo tem não for o do endpoint, nenhuma assinatura coincide. Acontece ao copiar mal o segredo, ao regenerá-lo no Dashboard sem o atualizar no Odoo, ou ao enviar para um Odoo os eventos de outra conta.

O conector não fica com a primeira configuração do GoCardless que encontra: procura a que tem o segredo que assina esse envio. Assim, uma configuração de testes esquecida não rejeita os eventos reais.

O que responde o Odoo com o conector

SituaçãoOdoo 17, 18 e 19Odoo 20
Nenhum segredo coincide com a assinatura498401
Assinatura boa, nenhum evento é seu204204
Eventos aplicados200200

A diferença do Odoo 20 não é uma escolha do conector: o seu servidor HTTP não deixa responder um código que não seja padrão, e o 498 não o é. O que acontece depois depende de como chegam os eventos. No modo avançado vão diretamente do GoCardless para o Odoo: com 401, o GoCardless repete um envio que continuará sem coincidir, e um segredo mal colocado nota-se como uma série de repetições falhadas no Dashboard do GoCardless. Com a ligação em dois cliques chegam através do FlexigoTech Cloud, que trata esse 401 como final, tal como um 498.

Se um evento não chegar

O GoCardless garante que cada evento chega pelo menos uma vez, não exatamente uma: pode repetir-se. O conector guarda cada evento que aplica, um por evento e por configuração do GoCardless, e se o mesmo chegar outra vez não o aplica duas vezes. Isto importa com o dinheiro: um pagamento confirmado duas vezes não deve registar duas cobranças na fatura. E se um evento se perder, a ação agendada que de hora a hora pede ao GoCardless os eventos em falta recupera-o, até 100 por passagem.

O que fazer

  1. Se usar a ligação em dois cliques («Ligar a minha conta GoCardless»), os webhooks são montados pelo FlexigoTech Cloud: não há segredo para copiar.
  2. No modo avançado («Colar um token de acesso (avançado)»), o endpoint e o seu segredo são criados por si no Dashboard do GoCardless: copie o segredo exato para a configuração do GoCardless no Odoo.
  3. Se regenerar o segredo, atualize-o no Odoo de imediato; até lá, cada envio falhará.
  4. Reveja no Dashboard do GoCardless os envios falhados: a partir daí podem ser relançados manualmente.
Esquema: o que o GoCardless envia ao webhook e o que o Odoo responde com o conector
Esquema feito a partir do código do conector (17.0, 18.0, 19.0 e 20.0) e da documentação do GoCardless.

Porque não responder 500 quando a assinatura falha?

Porque o GoCardless repetiria um envio que nunca vai coincidir. O 498 diz-lhe que pare; no Odoo 20, onde não se pode enviar, o conector responde 401, e através do FlexigoTech Cloud esse 401 também conta como final.

Com o nosso conector

No Odoo 17, 18, 19 e 20 o conector verifica a assinatura de cada envio contra o segredo de cada configuração do GoCardless, responde com os códigos que o GoCardless entende e, caso algo se perca, recupera os eventos de hora a hora.

Continue a ler

GoCardless 409 idempotent_creation_conflict: a cobrança já existiaA GoCardless devolve 409 idempotent_creation_conflict se uma chave de idempotência já criou algo. Porque não é falha e como o conector evita cobrar a dobrar.Erro mandate_is_inactive da GoCardless ao criar uma cobrança a partir do OdooA GoCardless responde mandate_is_inactive ao criar um pagamento com um mandato cancelado, falhado ou expirado. Porquê e como o conector o resolve no Odoo.GoCardless invalid_bank_details: AC01 e BE06, a conta indicada não existeGoCardless invalid_bank_details com AC01 ou BE06: a conta do mandato não existe. Porque surge no pagamento e no mandato, e o que o Odoo faz com o conector.
Verificado no código do conector (versão 17.0, 18.0, 19.0 e 20.0) e nas fontes indicadas

Fontes

  • docs.gocardless.com/docs/api-reference/webhooks
  • Código do módulo: flexigo_payment_gocardless: models/gocardless_webhook_event.py, linha 7 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: controllers/main.py, linha 110 em 17.0 (d203ee6), 18.0 (e2ab18b) e 19.0 (ce7f5a3)
  • Código do módulo: flexigo_payment_gocardless: controllers/main.py, linha 113 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: controllers/main.py, linha 128 em 17.0 (d203ee6), linha 128 em 18.0 (e2ab18b), linha 128 em 19.0 (ce7f5a3) e linha 131 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: controllers/main.py, linha 103 em 17.0 (d203ee6), linha 103 em 18.0 (e2ab18b), linha 103 em 19.0 (ce7f5a3) e linha 106 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: const.py, linha 117 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 71 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: __manifest__.py, linha 6 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: models/payment_token.py, linha 83 em 17.0 (d203ee6), linha 83 em 18.0 (e2ab18b), linha 83 em 19.0 (ce7f5a3) e linha 82 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: __manifest__.py, linha 31 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Código do módulo: flexigo_payment_gocardless: controllers/main.py, linha 95 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 957 em 17.0 (d203ee6), linha 957 em 18.0 (e2ab18b), linha 957 em 19.0 (ce7f5a3) e linha 979 em 20.0 (688d86b)
  • Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 152 em 17.0 (d203ee6), linha 152 em 18.0 (e2ab18b), linha 152 em 19.0 (ce7f5a3) e linha 158 em 20.0 (688d86b)