Cosa dice GoCardless
| Reason | Tipo | HTTP | Testo di GoCardless |
|---|---|---|---|
idempotent_creation_conflict | invalid_state | 409 | A resource already exists for the supplied idempotency key. |
La pagina dei limiti di GoCardless lo completa: se esiste già una risorsa con quella chiave, la risposta è un 409 con links.conflicting_resource_id, che indica la risorsa già creata. Le chiavi possono avere fino a 128 caratteri e GoCardless le ricorda per almeno 30 giorni.

Il problema che risolve
Una richiesta può richiedere tempo: GoCardless interrompe quelle che superano i 29 secondi, e la rete può cadere prima. Se Odoo richiede un addebito e non riceve risposta, non sa se GoCardless lo ha creato. Ripetere la richiesta senza altro è pericoloso; la stessa documentazione di GoCardless avverte che riprovare senza chiave di idempotenza dopo un timeout scaduto può addebitare due volte lo stesso pagamento.
Con la chiave, il secondo tentativo non crea nulla: se il primo è arrivato, GoCardless risponde con questo 409 e l'identificativo dell'addebito già esistente.
Come lo usa il connettore
Il connettore invia una chiave di idempotenza in ogni richiesta che crea un addebito, un rimborso, un nuovo tentativo o la richiesta del mandato. La chiave non è casuale. Viene calcolata con l'operazione, la transazione di Odoo e l'identificativo del database, in modo che:
- ripetere lo stesso addebito invii esattamente la stessa chiave;
- una copia del database per i test non entri in conflitto con quella di produzione, anche se entrambe emettono la stessa fattura.
Quando arriva il 409, il connettore legge conflicting_resource_id, richiede quella risorsa a GoCardless e la adotta come risposta. Per te non c'è alcun errore: la transazione risulta collegata all'addebito già esistente, e la fattura prosegue il suo corso normale.
Quando GoCardless non risponde
Se la richiesta resta senza risposta, il connettore la ripete una volta con la stessa chiave. Senza chiave non ripete nulla. Se anche così non c'è risposta, segnala la situazione senza dare l'addebito per perso: «GoCardless did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour.». La transazione resta in sospeso, non in errore, perché in errore Odoo potrebbe generare un altro addebito con un altro riferimento e un'altra chiave.
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: «GoCardless did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour.». Un'azione pianificata, come il rinnovo di un abbonamento o il reinvio del connettore stesso, scrive il messaggio senza nessuno davanti.

Cosa fare
Con il connettore, di solito, nulla: il 409 si risolve da solo. Se lo vedi in un altro programma collegato allo stesso account GoCardless, verifica due cose. La prima, che non stai riutilizzando una chiave per operazioni diverse. La seconda, che la risorsa indicata in conflicting_resource_id sia quella che ti aspettavi: se lo è, il nuovo tentativo ha funzionato come doveva. Se non lo è, conserva il request_id della risposta: GoCardless chiede di includerlo quando contatti il suo supporto, e il connettore lo aggiunge ai suoi messaggi di errore.
Un 409 significa che il cliente ha pagato due volte?
Al contrario. Significa che GoCardless ha rifiutato di creare il secondo addebito perché la chiave ne aveva già uno. Il cliente paga una sola volta.
Cosa succede se si cambia il riferimento della transazione?
Cambia la chiave, e GoCardless lo tratta come un addebito nuovo. Per questo il connettore lascia in sospeso, e non in errore, un addebito senza risposta: così non ne viene creato un altro con un riferimento diverso.
Con il nostro connettore
In Odoo 17, 18, 19 e 20 il connettore applica la regola che GoCardless richiede per non addebitare due volte: chiave fissa per operazione, ripetizione solo con la stessa chiave e adozione della risorsa esistente quando arriva il 409.
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
- 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_provider.py, riga 352 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 68 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 391 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 357 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 373 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 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: i18n/flexigo_payment_gocardless.pot, riga 448 in 17.0 (d203ee6), riga 448 in 18.0 (e2ab18b), riga 448 in 19.0 (ce7f5a3) e riga 450 in 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, riga 29 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- Codice del modulo: flexigo_payment_gocardless: __manifest__.py, riga 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) e 20.0 (688d86b)
- docs.gocardless.com/docs/api-reference/responses-and-errors
- Codice del modulo: flexigo_payment_gocardless: models/payment_transaction.py, riga 123 in 17.0 (d203ee6), riga 123 in 18.0 (e2ab18b), riga 123 in 19.0 (ce7f5a3) e riga 126 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)
- github.com/odoo/odoo/blob/17.0/odoo/http.py
