O que diz o GoCardless
| Resposta | Texto do 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. |
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.

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ção | Odoo 17, 18 e 19 | Odoo 20 |
|---|---|---|
| Nenhum segredo coincide com a assinatura | 498 | 401 |
| Assinatura boa, nenhum evento é seu | 204 | 204 |
| Eventos aplicados | 200 | 200 |
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
- 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.
- 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.
- Se regenerar o segredo, atualize-o no Odoo de imediato; até lá, cada envio falhará.
- Reveja no Dashboard do GoCardless os envios falhados: a partir daí podem ser relançados manualmente.

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