Naar hoofdinhoud
GoCardless API · invalid_state · 409

GoCardless 409 idempotent_creation_conflict: de incasso bestond al

Deze fout schrikt meer af dan nodig is. GoCardless antwoordt met 409 idempotent_creation_conflict wanneer het voor de tweede keer een aanmaakverzoek ontvangt met een idempotentiesleutel die al gebruikt is. Goed toegepast is dit precies wat voorkomt dat dezelfde factuur twee keer wordt geïncasseerd.

FlexigoTech · Verantwoordelijk: Víctor Gómez · Bijgewerkt op 6 november 2026

In het kort

Versies
Odoo 17, 18, 19 en 20
Gecontroleerd
in de broncode van de connector, versie 17.0, 18.0, 19.0 en 20.0 · in de bronnen onderaan
Leestijd
4 min

Wat GoCardless zegt

ReasonTipoHTTPTexto de GoCardless
idempotent_creation_conflictinvalid_state409A resource already exists for the supplied idempotency key.

De limietenpagina van GoCardless vult dit aan: als er al een resource met die sleutel bestaat, is het antwoord een 409 met links.conflicting_resource_id, dat aanwijst welke resource al is aangemaakt. Sleutels mogen tot 128 tekens lang zijn en GoCardless onthoudt ze minstens 30 dagen.

Kaart van de fout idempotent_creation_conflict van GoCardless
De reason, de HTTP-code 409 en de tekst waarmee GoCardless deze fout documenteert.

Het probleem dat het oplost

Een verzoek kan traag zijn: GoCardless breekt verzoeken af die langer dan 29 seconden duren, en het netwerk kan al eerder wegvallen. Als Odoo een incasso aanvraagt en geen antwoord krijgt, weet het niet of GoCardless hem heeft aangemaakt. Het verzoek zomaar herhalen is gevaarlijk; de eigen documentatie van GoCardless waarschuwt dat opnieuw proberen zonder idempotentiesleutel na een time-out dezelfde betaling twee keer kan incasseren.

Met een sleutel maakt de tweede poging niets nieuws aan: als de eerste is aangekomen, antwoordt GoCardless met deze 409 en het identificatienummer van de incasso die al bestaat.

Hoe de connector het gebruikt

De connector stuurt een idempotentiesleutel mee bij elk verzoek dat een incasso, een terugbetaling, een nieuwe poging of het mandaatverzoek aanmaakt. De sleutel is niet willekeurig. Hij wordt berekend uit de bewerking, de transactie in Odoo en het identificatienummer van de database, zodat:

  • het herhalen van dezelfde incasso exact dezelfde sleutel meestuurt;
  • een kopie van de database voor tests niet botst met die van productie, ook al geven beide dezelfde factuur uit.

Wanneer de 409 binnenkomt, leest de connector conflicting_resource_id, vraagt die resource bij GoCardless op en neemt die over als antwoord. Voor jou is er geen fout: de transactie wordt gekoppeld aan de incasso die al bestond, en de factuur loopt gewoon door.

Wanneer GoCardless niet antwoordt

Als het verzoek zonder antwoord blijft, herhaalt de connector het één keer met dezelfde sleutel. Zonder sleutel herhaalt hij niets. Blijft ook dan het antwoord uit, dan meldt hij dit zonder de incasso als verloren te beschouwen: "GoCardless did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour.". De transactie blijft in behandeling, niet in fout, omdat Odoo bij een fout een nieuwe incasso met een andere referentie en een andere sleutel zou kunnen aanmaken.

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 did not answer, so it is not known yet whether it took the request. It will be sent again, safely, within the hour.". Start een geplande actie de incasso, zoals de verlenging van een abonnement of het opnieuw verzenden door de connector zelf, dan verschijnt het bericht zonder dat er iemand bij is.

Schema: wat GoCardless antwoordt bij een 409 en wat Odoo met de connector doet
Schema gemaakt op basis van de code van de connector (17.0, 18.0, 19.0 en 20.0) en de documentatie van GoCardless; wat doorgestreept is, is wat de 409 voorkomt.

Wat te doen

Met de connector meestal niets: de 409 lost zichzelf op. Als je hem ziet in een ander programma dat op hetzelfde GoCardless-account is aangesloten, controleer dan twee dingen. Ten eerste of je geen sleutel hergebruikt voor verschillende bewerkingen. Ten tweede of de resource in conflicting_resource_id de resource is die je verwachtte: als dat zo is, heeft de nieuwe poging gewerkt zoals het hoort. Is dat niet zo, bewaar dan de request_id van het antwoord: GoCardless vraagt die mee te sturen bij contact met hun support, en de connector voegt hem toe aan zijn foutmeldingen.

Betekent een 409 dat de klant twee keer heeft betaald?

Juist het omgekeerde. Het betekent dat GoCardless weigerde de tweede incasso aan te maken, omdat de sleutel er al een had. De klant betaalt maar één keer.

Wat gebeurt er als de referentie van de transactie wordt gewijzigd?

Dan verandert de sleutel, en GoCardless behandelt het als een nieuwe incasso. Daarom laat de connector een incasso zonder antwoord in behandeling staan, en niet in fout: zo wordt er geen tweede aangemaakt met een andere referentie.

Met onze connector

In Odoo 17, 18, 19 en 20 past de connector de regel toe die GoCardless vraagt om niet dubbel te incasseren: een vaste sleutel per bewerking, herhaling alleen met dezelfde sleutel, en overname van de bestaande resource wanneer de 409 binnenkomt.

Lees verder

Fout mandate_is_inactive van GoCardless bij het aanmaken van een incasso vanuit OdooGoCardless antwoordt met mandate_is_inactive bij een betaling met een geannuleerd, mislukt of verlopen mandaat. Waarom het gebeurt en wat de connector doet.GoCardless-fout retry_failed bij het herhalen van een incasso vanuit OdooGoCardless antwoordt retry_failed als de betaling niet mislukt is of geen herhaling meer toelaat. Wanneer de knop in Odoo verschijnt en wat de connector doet.GoCardless-webhook: 498 Token Invalid, 204 en de Webhook-Signature-handtekeningGoCardless vraagt 498 als de Webhook-Signature niet klopt en 204 bij een onbekend event. Wat Odoo 17, 18, 19 en 20 antwoordt en waarom het in 20 een 401 is.
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
  • 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_provider.py, regel 352 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 68 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 391 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 357 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 373 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 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: i18n/flexigo_payment_gocardless.pot, regel 448 in 17.0 (d203ee6), regel 448 in 18.0 (e2ab18b), regel 448 in 19.0 (ce7f5a3) en regel 450 in 20.0 (688d86b)
  • Broncode van de module: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, regel 29 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) en 20.0 (688d86b)
  • 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)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Broncode van de module: flexigo_payment_gocardless: models/payment_transaction.py, regel 123 in 17.0 (d203ee6), regel 123 in 18.0 (e2ab18b), regel 123 in 19.0 (ce7f5a3) en regel 126 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)
  • github.com/odoo/odoo/blob/17.0/odoo/http.py