Wat GoCardless zegt
| Reason | Tipo | HTTP | Texto de GoCardless |
|---|---|---|---|
idempotent_creation_conflict | invalid_state | 409 | A 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.

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.

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
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
