Què diu GoCardless
| Reason | Tipus | HTTP | Text de GoCardless |
|---|---|---|---|
rate_limit_exceeded | invalid_api_usage | 429 | Rate limit reached. Check headers for reset time. |
La pàgina de límits de GoCardless indica la xifra: 1.600 peticions per minut en una integració estàndard i 1.600 per minut i comerç en una integració de partner. En superar-les, l'API retorna el 429, i GoCardless aclareix que aquestes peticions es poden repetir sense problema: «These requests are safe to retry.». Per saber quan, remet a les capçaleres de la resposta: ratelimit-limit, ratelimit-remaining i ratelimit-reset.

D'on surten tantes peticions
El límit compta totes les peticions a l'API, no només les que creen cobraments. Amb el connector, cada cobrament amb un mandat guardat és una petició, vingui d'una subscripció que es renova o d'un pagament registrat amb el mètode de pagament del client. Cada esdeveniment d'un pagament que arriba a Odoo n'és una altra, perquè el connector no es fia només de l'avís: demana aquell pagament a GoCardless i aplica l'estat que li retorna. Una tanda gran al mateix moment, com moltes renovacions alhora mentre arriben els esdeveniments dels cobraments anteriors, suma les dues coses.
GoCardless classifica aquest reason entre els errors invalid_api_usage, els que vénen de com es fa la petició, i per a aquests demana avisar l'equip tècnic («alert your dev team»). Un 429 suelt no ho necessita; un que es repeteix cada dia, sí.
El que fa el connector
- Llegeix la capçalera
ratelimit-reseti calcula quant falta: l'hora que porta menys la del servidor d'Odoo. - Espera aquest temps, com a mínim 1 segon i com a màxim 65. Si la capçalera falta o no es pot llegir, espera 1 segon. El topall hi és perquè un rellotge mal posat no deixi penjat el procés d'Odoo que espera.
- Repeteix la petició només una vegada.
- Si la repetició torna a rebre un 429, ja no espera més: ho tracta com qualsevol altre rebuig de l'API.
El connector no compta les seves peticions ni les frena per endavant. No llegeix ratelimit-remaining: només espera quan GoCardless ja ha respost 429.

Si el segon intent també topa
Depèn del que estava fent Odoo en aquell moment.
- Si era un cobrament, la transacció passa a «Error» amb «GoCardless rejected the request.» i, a sota, el missatge de GoCardless amb
rate_limit_exceededi elrequest_identre claudàtors. La factura continua pendent de cobrament. - Si estava aplicant un esdeveniment de GoCardless, el webhook contesta 500 perquè GoCardless torni a enviar l'enviament, i els esdeveniments que ja es van aplicar no s'apliquen dues vegades. La recuperació de cada hora tampoc deixa enrere un esdeveniment que va fallar: el torna a demanar en la passada següent.
Un 429 no és el mateix que un cobrament sense resposta. Sense resposta, el connector no sap si GoCardless va crear el cobrament, així que el deixa pendent i el torna a enviar, amb la mateixa clau, en menys d'una hora. Amb un 429 sí hi ha resposta: GoCardless no va acceptar la petició, i per això la transacció queda en error.
Aquest missatge surt en l'idioma de qui llança el cobrament. Si el llança una tasca programada, com la renovació d'una subscripció, s'escriu sense ningú al davant. El connector no està traduït al català: aquests textos surten sempre en anglès, també en un Odoo en català, tant si els llança un usuari com una tasca programada: «GoCardless rejected the request.».
Què fer
- Obre la transacció des de la factura, amb el botó «Transacció de pagament» de dalt; el menú de transaccions només surt en mode desenvolupador, i a Odoo 20 no existeix. Si el missatge esmenta
rate_limit_exceeded, GoCardless va rebutjar aquella petició pel límit, no pel client ni pel seu mandat. - Passat un moment, torna a cobrar la factura amb el mètode de pagament guardat del client.
- Si et passa sovint, comprova l'hora del servidor d'Odoo: l'espera surt de restar-la a la de
ratelimit-reset, i un rellotge avançat la escurça. - Si necessites GoCardless, guarda el
request_iddel missatge: la seva documentació demana incloure'l en contactar amb el seu suport.
El connector reparteix les peticions per no arribar al límit?
No. No les compta ni les frena per endavant: reacciona quan GoCardless contesta 429, amb una espera i una sola repetició.
Per què espera com a màxim 65 segons?
Mentre espera, el procés d'Odoo que fa la petició no fa res més. El codi del connector posa aquest topall perquè un rellotge mal posat no el deixi penjat.
Es perd algun esdeveniment de GoCardless pel límit?
No es dona per perdut: el webhook demana a GoCardless que el torni a enviar, i la recuperació de cada hora el torna a demanar en la passada següent.
Amb el nostre connector
A Odoo 17, 18, 19 i 20 el connector tracta el 429 com una pausa: espera el que demana GoCardless, repeteix una vegada i, si el límit continua, deixa la transacció en error amb el request_id perquè sàpigues què va passar i què donar a GoCardless.
Continua llegint
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/limits
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Codi del mòdul: flexigo_payment_gocardless: const.py, línia 113 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 378 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 408 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 379 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 383 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 397 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 462 a 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) i 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 281 a 17.0 (d203ee6), línia 281 a 18.0 (e2ab18b), línia 281 a 19.0 (ce7f5a3) i línia 292 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 247 a 17.0 (d203ee6), línia 247 a 18.0 (e2ab18b), línia 247 a 19.0 (ce7f5a3) i línia 258 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 299 a 17.0 (d203ee6), línia 299 a 18.0 (e2ab18b), línia 299 a 19.0 (ce7f5a3) i línia 310 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: models/payment_transaction.py, línia 589 a 17.0 (d203ee6), línia 589 a 18.0 (e2ab18b), línia 588 a 19.0 (ce7f5a3) i línia 607 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 124 a 17.0 (d203ee6), línia 124 a 18.0 (e2ab18b), línia 124 a 19.0 (ce7f5a3) i línia 127 a 20.0 (688d86b)
- Codi del mòdul: flexigo_payment_gocardless: controllers/main.py, línia 96 a 20.0 (688d86b)
- 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: 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 603 a 17.0 (d203ee6), línia 603 a 18.0 (e2ab18b), línia 603 a 19.0 (ce7f5a3) i línia 605 a 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/webhooks
- Codi del mòdul: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, línia 521 a 17.0 (d203ee6), línia 521 a 18.0 (e2ab18b), línia 521 a 19.0 (ce7f5a3) i línia 523 a 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/ca.po
- github.com/odoo/odoo/blob/20.0/addons/payment/views/payment_transaction_views.xml
- github.com/odoo/odoo/blob/17.0/odoo/http.py
- github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml
- 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)
