Wat GoCardless zegt
| Reason | Tipo | HTTP | Texto de GoCardless |
|---|---|---|---|
rate_limit_exceeded | invalid_api_usage | 429 | Rate limit reached. Check headers for reset time. |
De limietpagina van GoCardless geeft het getal: 1.600 verzoeken per minuut bij een standaardintegratie en 1.600 per minuut en per handelaar bij een partnerintegratie. Bij overschrijding geeft de API de 429, en GoCardless merkt op dat die verzoeken zonder problemen opnieuw kunnen worden verstuurd: "These requests are safe to retry.". Om te weten wanneer, verwijst het naar de headers van het antwoord: ratelimit-limit, ratelimit-remaining en ratelimit-reset.

Waar al die verzoeken vandaan komen
De limiet telt alle verzoeken aan de API, niet alleen die welke incasso's aanmaken. Met de connector is elke incasso met een opgeslagen mandaat één verzoek, of die nu komt van een abonnement dat wordt verlengd of van een betaling die met de betaalmethode van de klant wordt geregistreerd. Elke gebeurtenis van een betaling die in Odoo binnenkomt is nog een verzoek, omdat de connector niet alleen op de melding afgaat: hij vraagt die betaling op bij GoCardless en past de status toe die hij terugkrijgt. Een grote batch op hetzelfde moment, zoals veel verlengingen tegelijk terwijl de gebeurtenissen van eerdere incasso's binnenkomen, telt beide mee.
GoCardless rangschikt deze reason onder de fouten invalid_api_usage, die voortkomen uit de manier waarop het verzoek wordt gedaan, en vraagt daarvoor om het technische team te waarschuwen ("alert your dev team"). Eén losse 429 hoeft niet gemeld te worden; een die elke dag terugkomt wel.
Wat de connector doet
- Leest de header
ratelimit-reseten berekent hoeveel tijd er nog nodig is: het tijdstip min dat van de server van Odoo. - Wacht die tijd, minimaal 1 seconde en maximaal 65. Ontbreekt de header of kan hij niet worden gelezen, dan wacht hij 1 seconde. De bovengrens is er zodat een verkeerd ingestelde klok het wachtende Odoo-proces niet vastzet.
- Herhaalt het verzoek maar één keer.
- Krijgt de herhaling opnieuw een 429, dan wacht hij niet langer en behandelt hij het als elke andere afwijzing door de API.
De connector telt zijn verzoeken niet en remt ze niet vooraf af. Hij leest ratelimit-remaining niet: hij wacht alleen wanneer GoCardless al met 429 heeft geantwoord.

Als de tweede poging ook vastloopt
Dat hangt af van wat Odoo op dat moment deed.
- Ging het om een incasso, dan krijgt de transactie de status "Fout" met "GoCardless rejected the request." en daaronder het bericht van GoCardless met
rate_limit_exceededen derequest_idtussen haakjes. De factuur blijft openstaan. - Verwerkte Odoo een gebeurtenis van GoCardless, dan antwoordt de webhook met 500 zodat GoCardless de verzending opnieuw stuurt, en gebeurtenissen die al waren verwerkt worden niet twee keer toegepast. Ook de herstelronde van elk uur laat geen mislukte gebeurtenis liggen: hij vraagt haar opnieuw op bij de volgende ronde.
Een 429 is niet hetzelfde als een incasso zonder antwoord. Zonder antwoord weet de connector niet of GoCardless de incasso heeft aangemaakt, dus laat hij haar in behandeling en stuurt hij haar, met dezelfde sleutel, binnen minder dan een uur opnieuw. Bij een 429 is er wel antwoord: GoCardless heeft het verzoek niet aanvaard, en daarom staat de transactie op fout.
De connector is niet in het Nederlands vertaald: deze teksten verschijnen altijd in het Engels, ook in een Nederlandstalige Odoo, of een gebruiker of een geplande actie ze nu start: "GoCardless rejected the request.".
Wat je doet
- Open de transactie vanuit de factuur met de knop "Betalingstransactie" hierboven; het transactiemenu verschijnt alleen in de ontwikkelaarsmodus en bestaat in Odoo 20 niet. Noemt het bericht
rate_limit_exceeded, dan heeft GoCardless dat verzoek afgewezen vanwege de limiet, niet vanwege de klant of diens mandaat. - Probeer de factuur na enige tijd opnieuw te incasseren met de opgeslagen betaalmethode van de klant.
- Komt het vaak voor, controleer dan de tijd op de server van Odoo: de wachttijd volgt uit het verschil met die van
ratelimit-reset, en een vooruitgelopen klok verkort die. - Heb je GoCardless nodig, bewaar dan de
request_iduit het bericht: hun documentatie vraagt om die bij contact met hun support te vermelden.
Verdeelt de connector de verzoeken zodat de limiet niet wordt bereikt?
Nee. Hij telt ze niet en remt ze niet vooraf af: hij reageert wanneer GoCardless met 429 antwoordt, met één wachttijd en één herhaling.
Waarom wacht hij maximaal 65 seconden?
Terwijl hij wacht, doet het Odoo-proces dat het verzoek verstuurt niets anders. De code van de connector zet die bovengrens zodat een verkeerd ingestelde klok het proces niet vastzet.
Gaat er door de limiet een gebeurtenis van GoCardless verloren?
Die wordt niet als verloren beschouwd: de webhook vraagt GoCardless de gebeurtenis opnieuw te verzenden, en de herstelronde van elk uur vraagt haar bij de volgende ronde opnieuw op.
Met onze connector
In Odoo 17, 18, 19 en 20 behandelt de connector de 429 als een pauze: hij wacht de tijd die GoCardless vraagt, herhaalt één keer en zet, als de limiet nog steeds geldt, de transactie op fout met de request_id, zodat je weet wat er is gebeurd en wat je aan GoCardless kunt geven.
Lees verder
Gecontroleerd in de broncode van de connector (versie 17.0, 18.0, 19.0 en 20.0) en in de gelinkte bronnen
Bronnen
- docs.gocardless.com/docs/api-reference/limits
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 113 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 378 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 408 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 379 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 383 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 462 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 281 in 17.0 (d203ee6), regel 281 in 18.0 (e2ab18b), regel 281 in 19.0 (ce7f5a3) en regel 292 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 247 in 17.0 (d203ee6), regel 247 in 18.0 (e2ab18b), regel 247 in 19.0 (ce7f5a3) en regel 258 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 299 in 17.0 (d203ee6), regel 299 in 18.0 (e2ab18b), regel 299 in 19.0 (ce7f5a3) en regel 310 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 589 in 17.0 (d203ee6), regel 589 in 18.0 (e2ab18b), regel 588 in 19.0 (ce7f5a3) en regel 607 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: controllers/main.py, regel 124 in 17.0 (d203ee6), regel 124 in 18.0 (e2ab18b), regel 124 in 19.0 (ce7f5a3) en regel 127 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: controllers/main.py, regel 96 in 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/gocardless_webhook_event.py, regel 7 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: const.py, regel 117 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
- Broncode van de module: flexigo_payment_gocardless: models/payment_provider.py, regel 603 in 17.0 (d203ee6), regel 603 in 18.0 (e2ab18b), regel 603 in 19.0 (ce7f5a3) en regel 605 in 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/webhooks
- Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 521 in 17.0 (d203ee6), regel 521 in 18.0 (e2ab18b), regel 521 in 19.0 (ce7f5a3) en regel 523 in 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/nl.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
- Broncode van de module: flexigo_payment_gocardless: __manifest__.py, regel 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
