O que diz a GoCardless
| Reason | Tipo | Texto da GoCardless |
|---|---|---|
access_token_revoked | invalid_api_usage | Token has been revoked by the user. |
access_token_not_active | invalid_api_usage | Token has been disabled. |
unauthorized | invalid_api_usage | Credentials not recognised. |
Para o Odoo, os três significam o mesmo: a credencial com que pede as coisas já não serve. Na sua tabela de códigos HTTP, a GoCardless reserva o 401 para esse caso: «Missing or invalid Authorization header, or the user has been disabled.». São erros invalid_api_usage, os que vêm da forma como o pedido é feito, e para esses a GoCardless pede que se avise a equipa técnica («alert your dev team»).

Quando deixa de valer o token
O conector liga-se à GoCardless de duas maneiras, e o token morre de forma diferente em cada uma:
- «Ligar a minha conta GoCardless» é a ligação em dois cliques, através da FlexigoTech: uma integração de parceiro. Segundo o guia de parceiros da GoCardless, o comerciante pode revogar esse acesso a partir do seu Dashboard («they can revoke your access from the GoCardless dashboard») ou encerrar a sua conta. Nesse caso, a GoCardless envia um último webhook e o token deixa de funcionar: «Your access token stops working, so you can't make any more API calls for that user.».
- «Colar um token de acesso (avançado)» é o modo em que cria o token no Dashboard da GoCardless e o cola no Odoo. Se o revogar ou desativar lá, o Odoo dá por isso no pedido seguinte, quando a GoCardless o rejeitar.
O que o Odoo faz com o conector
Com a ligação em dois cliques, esse último webhook chega sem id de evento, como organisations · disconnected. O conector aplica-o assim:
- Apaga o token e o segredo do webhook, e a ligação do fornecedor passa a «Desligado na GoCardless».
- Escreve no contacto da sua empresa «A GoCardless indica que a conta foi desligada do Odoo em … (…). Não será possível cobrar nada até voltar a ser ligada.», com a data e a causa que a GoCardless envia.
- Cria a atividade «GoCardless desligada», para que alguém dê por isso sem abrir o fornecedor.
A partir desse momento, o conector já não volta a chamar a GoCardless com esse fornecedor: a tarefa de cada hora salta-o, e uma cobrança com o método de pagamento guardado de um cliente passa a «Erro» com «Este fornecedor já não está ligado ao GoCardless: volte a ligá-lo primeiro.».
Sem esse aviso, o token continua guardado e a GoCardless rejeita cada pedido. Numa cobrança, a transação passa a «Erro» com «A GoCardless rejeitou o pedido.» e, por baixo, a mensagem da GoCardless com o reason (access_token_revoked, access_token_not_active ou unauthorized) e o request_id entre parênteses retos. A fatura continua por cobrar, e a tarefa de cada hora não reenvia uma transação em erro.
O aviso no contacto e a atividade são escritos pelo conector sem ninguém à frente, ao aplicar o webhook. Numa base de dados criada em português saem assim; numa criada em inglês e passada depois para português, em inglês: «GoCardless reports that the account was disconnected from Odoo on … (…). No collection can be taken until it is connected again.» e «GoCardless disconnected». Estes textos saem no idioma de quem lança a cobrança; se for uma ação agendada, como a renovação de uma subscrição, são escritos sem ninguém à frente: numa base de dados criada em português saem assim, e numa criada em inglês e passada depois para português, em inglês: «This provider is not connected to GoCardless any more: connect it again first.» e «GoCardless rejected the request.».

O que fazer
- Abra a transação a partir da fatura, com o botão «Transação de Pagamento» no topo; o menu de transações só aparece em modo de programador, e no Odoo 20 não existe. Se a mensagem disser que o fornecedor já não está ligado, ou nomear um dos três reasons, o problema é a ligação, não o cliente nem o seu mandato.
- Com a ligação em dois cliques, abra o fornecedor de pagamento GoCardless e volte a ligar com «Ligar a minha conta GoCardless».
- No modo avançado, crie um token novo no Dashboard da GoCardless, cole-o em «Token de acesso da GoCardless» e carregue em «Testar a ligação». O conector pede à GoCardless o credor da sua conta com esse token: se a GoCardless o rejeitar, verá o erro dela nesse momento e não na cobrança seguinte.
- Com a ligação outra vez em funcionamento, volte a cobrar as faturas que ficaram por cobrar. As transações em erro não são reenviadas sozinhas.
- Se precisar da GoCardless, guarde o
request_idda mensagem: a documentação dela pede que o inclua ao contactar o seu suporte.
Porque é que o conector apaga o token em vez de continuar a tentar?
Porque a GoCardless diz que esse token já não funciona. Assim, as cobranças seguintes explicam o que se passa (que o fornecedor já não está ligado) em vez de receberem uma rejeição atrás de outra, e no contacto da empresa fica escrito quando e porquê foi desligado.
Um token do sandbox serve com a conta de produção?
Não. A ajuda do campo do token diz-o: os tokens do sandbox começam por sandbox_ e só funcionam com a API do sandbox. Para cobrar a sério é preciso um token de produção.
Com o nosso conector
No Odoo 17, 18, 19 e 20, o conector não deixa que um token inválido se transforme numa cadeia de cobranças falhadas sem explicação: se a GoCardless avisar da desconexão, diz-o na empresa e numa atividade, e se não avisar, cada rejeição traz o reason e o request_id da GoCardless.
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/responses-and-errors
- docs.gocardless.com/docs/partner-integrations/connect-your-merchants
- docs.gocardless.com/docs/partner-integrations/webhooks-for-partners
- 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: 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)
- 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: models/payment_provider.py, linha 1237 em 17.0 (d203ee6), linha 1237 em 18.0 (e2ab18b), linha 1237 em 19.0 (ce7f5a3) e linha 1234 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 1241 em 17.0 (d203ee6), linha 1241 em 18.0 (e2ab18b), linha 1241 em 19.0 (ce7f5a3) e linha 1238 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 281 em 17.0 (d203ee6), linha 281 em 18.0 (e2ab18b), linha 281 em 19.0 (ce7f5a3) e linha 287 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 588 em 17.0 (d203ee6), linha 588 em 18.0 (e2ab18b), linha 588 em 19.0 (ce7f5a3) e linha 594 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 483 em 17.0 (d203ee6), linha 483 em 18.0 (e2ab18b), linha 483 em 19.0 (ce7f5a3) e linha 489 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 732 em 17.0 (d203ee6), linha 732 em 18.0 (e2ab18b), linha 732 em 19.0 (ce7f5a3) e linha 734 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 336 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1934 em 17.0 (d203ee6), linha 1934 em 18.0 (e2ab18b), linha 1934 em 19.0 (ce7f5a3) e linha 1944 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 397 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 462 em 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 558 em 17.0 (d203ee6), linha 558 em 18.0 (e2ab18b), linha 558 em 19.0 (ce7f5a3) e linha 564 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 281 em 17.0 (d203ee6), linha 281 em 18.0 (e2ab18b), linha 281 em 19.0 (ce7f5a3) e linha 292 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_transaction.py, linha 247 em 17.0 (d203ee6), linha 247 em 18.0 (e2ab18b), linha 247 em 19.0 (ce7f5a3) e linha 258 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 623 em 17.0 (d203ee6), linha 623 em 18.0 (e2ab18b), linha 623 em 19.0 (ce7f5a3) e linha 625 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: models/payment_provider.py, linha 742 em 17.0 (d203ee6), linha 742 em 18.0 (e2ab18b), linha 742 em 19.0 (ce7f5a3) e linha 744 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1185 em 17.0 (d203ee6), linha 1185 em 18.0 (e2ab18b), linha 1185 em 19.0 (ce7f5a3) e linha 1197 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 367 em 17.0 (d203ee6), linha 367 em 18.0 (e2ab18b), linha 367 em 19.0 (ce7f5a3) e linha 373 em 20.0 (688d86b)
- Código do módulo: flexigo_payment_gocardless: i18n/pt.po, linha 1265 em 17.0 (d203ee6), linha 1265 em 18.0 (e2ab18b), linha 1265 em 19.0 (ce7f5a3) e linha 1277 em 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/pt.po
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- 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)
