Cosa dice GoCardless
| Reason | Tipo | HTTP | Testo di GoCardless |
|---|---|---|---|
rate_limit_exceeded | invalid_api_usage | 429 | Rate limit reached. Check headers for reset time. |
La pagina dei limiti di GoCardless indica la cifra: 1.600 richieste al minuto in un'integrazione standard e 1.600 al minuto per merchant in un'integrazione partner. Quando il limite viene superato, l'API restituisce il 429, e GoCardless precisa che queste richieste si possono ripetere senza problemi: «These requests are safe to retry.». Per sapere quando, rimanda alle intestazioni della risposta: ratelimit-limit, ratelimit-remaining e ratelimit-reset.

Da dove arrivano tante richieste
Il limite conta tutte le richieste all'API, non solo quelle che creano addebiti. Con il connettore, ogni addebito con un mandato salvato è una richiesta, che provenga da un abbonamento che si rinnova o da un pagamento registrato con il metodo di pagamento del cliente. Ogni evento di un pagamento che arriva in Odoo è un'altra richiesta, perché il connettore non si fida solo della notifica: chiede a GoCardless quel pagamento e applica lo stato che gli restituisce. Un lotto grande nello stesso momento, come molti rinnovi insieme mentre arrivano gli eventi degli addebiti precedenti, somma entrambe le cose.
GoCardless classifica questo reason tra gli errori invalid_api_usage, quelli che dipendono da come viene fatta la richiesta, e per questi chiede di avvisare il team tecnico («alert your dev team»). Un 429 isolato non lo richiede; uno che si ripete ogni giorno, sì.
Cosa fa il connettore
- Legge l'intestazione
ratelimit-resete calcola quanto manca: l'ora indicata meno quella del server di Odoo. - Attende quel tempo, come minimo 1 secondo e come massimo 65. Se l'intestazione manca o non si può leggere, attende 1 secondo. Il limite serve a evitare che un orologio sbagliato blocchi il processo di Odoo che aspetta.
- Ripete la richiesta una sola volta.
- Se la ripetizione riceve di nuovo un 429, non attende oltre: lo tratta come qualsiasi altro rifiuto dell'API.
Il connettore non conta le proprie richieste né le frena in anticipo. Non legge ratelimit-remaining: attende solo quando GoCardless ha già risposto 429.

Se anche il secondo tentativo incontra il limite
Dipende da cosa stava facendo Odoo in quel momento.
- Se era un addebito, la transazione passa a «Errore» con «GoCardless rejected the request.» e, sotto, il messaggio di GoCardless con
rate_limit_exceedede ilrequest_idtra parentesi quadre. La fattura resta in attesa di incasso. - Se stava applicando un evento di GoCardless, il webhook risponde 500 affinché GoCardless rinvii la notifica, e gli eventi già applicati non vengono applicati due volte. Anche il recupero orario non lascia indietro un evento fallito: lo richiede di nuovo nel passaggio successivo.
Un 429 non equivale a un addebito senza risposta. Senza risposta, il connettore non sa se GoCardless ha creato l'addebito, quindi lo lascia in sospeso e lo rinvia, con la stessa chiave, entro un'ora. Con un 429 c'è una risposta: GoCardless non ha accettato la richiesta, e per questo la transazione finisce in errore.
Il connettore non è tradotto in italiano: questi testi compaiono sempre in inglese, anche in un Odoo in italiano, sia che li avvii un utente sia un'azione pianificata, come il rinnovo di un abbonamento: «GoCardless rejected the request.».
Cosa fare
- Apri la transazione dalla fattura, con il pulsante «Transazione di pagamento» in alto; il menu delle transazioni compare solo in modalità sviluppatore, e in Odoo 20 non esiste. Se il messaggio cita
rate_limit_exceeded, GoCardless ha rifiutato quella richiesta per il limite, non per il cliente né per il suo mandato. - Dopo un po', riprova a incassare la fattura con il metodo di pagamento salvato del cliente.
- Se succede spesso, controlla l'ora del server di Odoo: l'attesa si calcola sottraendola da quella di
ratelimit-reset, e un orologio in anticipo la accorcia. - Se ti serve GoCardless, conserva il
request_iddel messaggio: la loro documentazione chiede di includerlo quando si contatta il supporto.
Il connettore distribuisce le richieste per non raggiungere il limite?
No. Non le conta né le frena in anticipo: reagisce quando GoCardless risponde 429, con un'attesa e un'unica ripetizione.
Perché attende al massimo 65 secondi?
Mentre attende, il processo di Odoo che fa la richiesta non fa altro. Il codice del connettore imposta quel limite perché un orologio sbagliato non lo blocchi.
Il limite fa perdere qualche evento di GoCardless?
Non si considera perso: il webhook chiede a GoCardless di rinviarlo, e il recupero orario lo richiede di nuovo nel passaggio successivo.
Con il nostro connettore
In Odoo 17, 18, 19 e 20 il connettore tratta il 429 come una pausa: attende quanto indicato da GoCardless, ripete una volta e, se il limite persiste, lascia la transazione in errore con il request_id, così sai cosa è successo e cosa comunicare a GoCardless.
Continua a leggere
Verificato nel codice del connettore (versione 17.0, 18.0, 19.0 e 20.0) e nelle fonti collegate
Fonti
- docs.gocardless.com/docs/api-reference/limits
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 113 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 378 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 408 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 379 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 383 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 462 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 281 in 17.0 (d203ee6), riga 281 in 18.0 (e2ab18b), riga 281 in 19.0 (ce7f5a3) e riga 292 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 247 in 17.0 (d203ee6), riga 247 in 18.0 (e2ab18b), riga 247 in 19.0 (ce7f5a3) e riga 258 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 299 in 17.0 (d203ee6), riga 299 in 18.0 (e2ab18b), riga 299 in 19.0 (ce7f5a3) e riga 310 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 589 in 17.0 (d203ee6), riga 589 in 18.0 (e2ab18b), riga 588 in 19.0 (ce7f5a3) e riga 607 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: controllers/main.py, riga 124 in 17.0 (d203ee6), riga 124 in 18.0 (e2ab18b), riga 124 in 19.0 (ce7f5a3) e riga 127 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: controllers/main.py, riga 96 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/gocardless_webhook_event.py, riga 7 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: const.py, riga 117 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: models/payment_provider.py, riga 603 in 17.0 (d203ee6), riga 603 in 18.0 (e2ab18b), riga 603 in 19.0 (ce7f5a3) e riga 605 in 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/webhooks
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 521 in 17.0 (d203ee6), riga 521 in 18.0 (e2ab18b), riga 521 in 19.0 (ce7f5a3) e riga 523 in 20.0 (688d86b)
- github.com/odoo/odoo/blob/20.0/addons/payment/i18n/it.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
- Codice del modulo: flexigo_payment_gocardless: __manifest__.py, riga 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
