Qué dice GoCardless
| Reason | Tipo | Texto de 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 Odoo los tres significan lo mismo: la credencial con la que pide las cosas ya no sirve. En su tabla de códigos HTTP, GoCardless reserva el 401 para ese caso: «Missing or invalid Authorization header, or the user has been disabled.». Son errores invalid_api_usage, los que vienen de cómo se hace la petición, y para esos GoCardless pide avisar al equipo técnico («alert your dev team»).

Cuándo deja de valer el token
El conector se conecta a GoCardless de dos maneras, y el token muere de forma distinta en cada una:
- «Conectar mi cuenta de GoCardless» es la conexión en dos clics, a través de FlexigoTech: una integración de partner. Según la guía de partners de GoCardless, el comercio puede revocar ese acceso desde su Dashboard («they can revoke your access from the GoCardless dashboard») o cerrar su cuenta. Entonces GoCardless manda un último webhook y el token deja de funcionar: «Your access token stops working, so you can't make any more API calls for that user.».
- «Pegar un token de acceso (avanzado)» es el modo en el que creas tú el token en el Dashboard de GoCardless y lo pegas en Odoo. Si lo revocas o lo desactivas allí, Odoo lo descubre en la siguiente petición, cuando GoCardless la rechaza.
Lo que hace Odoo con el conector
Con la conexión en dos clics, ese último webhook llega sin id de evento, como organisations · disconnected. El conector lo aplica así:
- Borra el token y el secreto del webhook, y la conexión del proveedor pasa a «Desconectado en GoCardless».
- Escribe en el contacto de tu empresa «GoCardless indica que la cuenta se desconectó de Odoo el … (…). No se podrá cobrar nada hasta que se vuelva a conectar.», con la fecha y la causa que manda GoCardless.
- Crea la actividad «GoCardless desconectado», para que alguien se entere sin abrir el proveedor.
Desde ese momento el conector no vuelve a llamar a GoCardless con ese proveedor: la tarea de cada hora lo salta, y un cobro con el método de pago guardado de un cliente pasa a «Error» con «Este proveedor ya no está conectado a GoCardless: vuelve a conectarlo primero.».
Sin ese aviso, el token sigue guardado y GoCardless rechaza cada petición. En un cobro, la transacción pasa a «Error» con «GoCardless rechazó la solicitud.» y, debajo, el mensaje de GoCardless con el reason (access_token_revoked, access_token_not_active o unauthorized) y el request_id entre corchetes. La factura sigue pendiente de cobro, y la tarea de cada hora no reenvía una transacción en error.
El aviso del contacto y la actividad los escribe el conector sin nadie delante, al aplicar el webhook. En una base de datos creada en castellano salen así; en una creada en inglés y pasada después a castellano, en inglés: «GoCardless reports that the account was disconnected from Odoo on … (…). No collection can be taken until it is connected again.» y «GoCardless disconnected». Los mensajes de un cobro salen en el idioma de quien lo lanza; si lo lanza una tarea programada, como la renovación de una suscripción, siguen la misma regla: «This provider is not connected to GoCardless any more: connect it again first.» y «GoCardless rejected the request.».

Qué hacer
- Abre la transacción desde la factura, con el botón «Transacción de pago» de arriba; el menú de transacciones solo sale en modo desarrollador, y en Odoo 20 no existe. Si el mensaje dice que el proveedor ya no está conectado, o nombra uno de los tres reasons, el problema es la conexión, no el cliente ni su mandato.
- Con la conexión en dos clics, abre el proveedor de pago GoCardless y vuelve a conectar con «Conectar mi cuenta de GoCardless».
- En el modo avanzado, crea un token nuevo en el Dashboard de GoCardless, pégalo en «Token de acceso de GoCardless» y pulsa «Probar la conexión». El conector pide a GoCardless el acreedor de tu cuenta con ese token: si GoCardless lo rechaza, verás su error en ese momento y no en el siguiente cobro.
- Con la conexión otra vez en marcha, vuelve a cobrar las facturas que se quedaron sin cobrar. Las transacciones en error no se reenvían solas.
- Si necesitas a GoCardless, guarda el
request_iddel mensaje: su documentación pide incluirlo al contactar con su soporte.
¿Por qué el conector borra el token en vez de seguir intentándolo?
Porque GoCardless dice que ese token ya no funciona. Así los cobros siguientes explican qué pasa (que el proveedor ya no está conectado) en lugar de recibir un rechazo tras otro, y en el contacto de la empresa queda escrito cuándo y por qué se desconectó.
¿Un token del sandbox sirve con la cuenta de producción?
No. La ayuda del campo del token lo dice: los tokens del sandbox empiezan por sandbox_ y solo funcionan con la API del sandbox. Para cobrar de verdad hace falta un token de producción.
Con nuestro conector
En Odoo 17, 18, 19 y 20 el conector no deja que un token muerto se convierta en una cadena de cobros fallidos sin explicación: si GoCardless avisa de la desconexión, lo dice en la empresa y en una actividad, y si no avisa, cada rechazo lleva el reason y el request_id de GoCardless.
Sigue leyendo
Comprobado en el código del conector (versión 17.0, 18.0, 19.0 y 20.0) y en las fuentes enlazadas
Fuentes
- 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 del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 71 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 153 en 17.0 (d203ee6), línea 153 en 18.0 (e2ab18b), línea 153 en 19.0 (ce7f5a3) y línea 158 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 958 en 17.0 (d203ee6), línea 958 en 18.0 (e2ab18b), línea 958 en 19.0 (ce7f5a3) y línea 979 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 1237 en 17.0 (d203ee6), línea 1237 en 18.0 (e2ab18b), línea 1237 en 19.0 (ce7f5a3) y línea 1234 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 1241 en 17.0 (d203ee6), línea 1241 en 18.0 (e2ab18b), línea 1241 en 19.0 (ce7f5a3) y línea 1238 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 284 en 17.0 (d203ee6), línea 284 en 18.0 (e2ab18b), línea 284 en 19.0 (ce7f5a3) y línea 289 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 590 en 17.0 (d203ee6), línea 590 en 18.0 (e2ab18b), línea 590 en 19.0 (ce7f5a3) y línea 595 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 485 en 17.0 (d203ee6), línea 485 en 18.0 (e2ab18b), línea 485 en 19.0 (ce7f5a3) y línea 490 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 732 en 17.0 (d203ee6), línea 732 en 18.0 (e2ab18b), línea 732 en 19.0 (ce7f5a3) y línea 734 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 336 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1934 en 17.0 (d203ee6), línea 1934 en 18.0 (e2ab18b), línea 1934 en 19.0 (ce7f5a3) y línea 1943 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 397 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 462 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 560 en 17.0 (d203ee6), línea 560 en 18.0 (e2ab18b), línea 560 en 19.0 (ce7f5a3) y línea 565 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 281 en 17.0 (d203ee6), línea 281 en 18.0 (e2ab18b), línea 281 en 19.0 (ce7f5a3) y línea 292 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_transaction.py, línea 247 en 17.0 (d203ee6), línea 247 en 18.0 (e2ab18b), línea 247 en 19.0 (ce7f5a3) y línea 258 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 623 en 17.0 (d203ee6), línea 623 en 18.0 (e2ab18b), línea 623 en 19.0 (ce7f5a3) y línea 625 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: models/payment_provider.py, línea 742 en 17.0 (d203ee6), línea 742 en 18.0 (e2ab18b), línea 742 en 19.0 (ce7f5a3) y línea 744 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1182 en 17.0 (d203ee6), línea 1182 en 18.0 (e2ab18b), línea 1182 en 19.0 (ce7f5a3) y línea 1193 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 370 en 17.0 (d203ee6), línea 370 en 18.0 (e2ab18b), línea 370 en 19.0 (ce7f5a3) y línea 375 en 20.0 (688d86b)
- Código del módulo: flexigo_payment_gocardless: i18n/es.po, línea 1262 en 17.0 (d203ee6), línea 1262 en 18.0 (e2ab18b), línea 1262 en 19.0 (ce7f5a3) y línea 1273 en 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/es.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 del módulo: flexigo_payment_gocardless: __manifest__.py, línea 31 en 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) y 20.0 (688d86b)
