Entrar no painel
Índice

(10) Referência

Idempotência

O cabeçalho Idempotency-Key, e como repetir um pedido sem cobrar duas vezes.

Repetir sem cobrar duas vezes

A rede falha no pior momento: o teu servidor manda criar a sessão (ou o estorno), a API grava, e a resposta perde-se no caminho. Se repetires o pedido, não pode nascer uma segunda sessão nem um segundo estorno. Para isso, todos os POST de /v1 levam o cabeçalho Idempotency-Key, com um valor teu, único por operação.

Terminal
curl -s -i "$SPOLLY_API_URL/v1/checkout/sessions" \
  -H "Authorization: Bearer $SPOLLY_SECRET_KEY" \
  -H "Idempotency-Key: encomenda-1042" \
  -H "Content-Type: application/json" \
  -d '{"amount": 1500000, "currency": "AOA", "description": "Vestido de capulana"}'

Repetido com a mesma chave e o mesmo corpo, o pedido devolve a mesma resposta (o mesmo código e o mesmo corpo, com o mesmo id), com o cabeçalho Idempotent-Replayed: true, e não cria nada outra vez. Oito pedidos iguais ao mesmo tempo dão uma escrita e oito respostas iguais.

As regras

SituaçãoResposta
Sem o cabeçalho400 idempotencia_em_falta
Chave com mais de 255 carateres400 idempotencia_invalida
A mesma chave, o mesmo corpoA resposta guardada, com Idempotent-Replayed: true
A mesma chave, outro corpo (ou outra rota)422 idempotencia_reutilizada
A mesma chave noutro modo (teste e produção)São chaves diferentes: o modo conta

As chaves guardam-se durante 24 horas; depois disso, a mesma chave volta a valer como nova. Um pedido que falhou com um erro de validação (4xx antes de gravar) não fica guardado: corriges e repetes com a mesma chave.

Que chave usar

Uma que identifique a operação na tua loja, e não o pedido HTTP: encomenda-1042 para a sessão da encomenda 1042, estorno-1042-1 para o primeiro estorno dela. Assim, um processo que reinicia a meio e volta a tentar dá com a mesma chave. Um UUID novo por operação também serve, desde que o guardes antes de enviar. Os SDK geram um UUID por chamada se não deres nenhuma, e usam o mesmo em todas as retentativas dessa chamada.