Vai al contenuto principale
GoCardless API · invalid_state · 409

GoCardless 409 idempotent_creation_conflict: l'addebito esisteva già

Questo errore spaventa più di quanto dovrebbe. GoCardless risponde 409 idempotent_creation_conflict quando riceve per la seconda volta una richiesta di creazione con una chiave di idempotenza già usata. Gestito bene, è proprio ciò che impedisce di addebitare due volte la stessa ricevuta.

FlexigoTech · Responsabile: Víctor Gómez · Aggiornato il 6 novembre 2026

In breve

Versioni
Odoo 17, 18, 19 e 20
Verificato
nel codice del connettore, versione 17.0, 18.0, 19.0 e 20.0 · nelle fonti collegate in fondo
Lettura
3 min

Cosa dice GoCardless

ReasonTipoHTTPTesto di GoCardless
idempotent_creation_conflictinvalid_state409A 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.

Scheda dell'errore idempotent_creation_conflict di GoCardless
Il reason, il codice HTTP 409 e il testo con cui GoCardless lo documenta.

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.

Schema: cosa risponde GoCardless con un 409 e cosa fa Odoo con il connettore
Schema realizzato a partire dal codice del connettore (17.0, 18.0, 19.0 e 20.0) e dalla documentazione di GoCardless; ciò che è barrato è ciò che il 409 evita.

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

Errore mandate_is_inactive di GoCardless alla creazione di un incasso da OdooGoCardless risponde mandate_is_inactive se crei un pagamento con un mandato annullato, fallito o scaduto. Perché succede e come lo gestisce il connettore.Errore retry_failed di GoCardless nel nuovo tentativo di incasso da OdooGoCardless risponde retry_failed se il pagamento non è fallito o non ammette più tentativi. Quando compare «Retry collection» e cosa fa il connettore.Webhook di GoCardless: 498 Token Invalid, 204 e la firma Webhook-SignatureGoCardless risponde 498 se la firma Webhook-Signature non torna e 204 se non riconosce l'evento. Cosa risponde Odoo 17, 18, 19 e 20 e perché in 20 è un 401.
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