Pular para o conteúdo
Criação de Apps

Idempotência em APIs: como evitar cobranças e pedidos duplicados

Resposta rápida

Uma operação é idempotente quando repeti-la várias vezes produz o mesmo resultado de executá-la uma vez. Em APIs, isso evita cobrança ou pedido duplicado quando o cliente reenvia a requisição por falha de rede ou clique duplo.

Neste artigo
  1. O que é idempotência
  2. Quando o problema acontece
  3. Como implementar com chave de idempotência
  4. Outras proteções

Imagine que o usuário toca em Pagar, a conexão cai e o app não recebe a resposta. Sem saber se deu certo, ele toca de novo. Se o servidor tratar as duas requisições como independentes, a pessoa paga duas vezes. A idempotência existe para evitar esse tipo de problema.

O que é idempotência

Uma operação idempotente dá o mesmo efeito, não importa quantas vezes seja executada com os mesmos dados. Definir o status do pedido como pago é idempotente: repetir não muda nada. Somar 10 ao saldo não é: cada repetição soma de novo.

No protocolo HTTP, GET, PUT e DELETE são idempotentes por definição, desde que o servidor siga a regra. O POST, usado para criar coisas, normalmente não é. É nele que o risco de duplicidade aparece.

Quando o problema acontece

Como implementar com chave de idempotência

A técnica mais comum é pedir ao cliente que envie, junto com a requisição, um identificador único gerado por ele, chamado de chave de idempotência. Muitas APIs de pagamento usam um cabeçalho para isso.

  1. O cliente gera um identificador único para aquela operação, como um UUID, e envia na requisição.
  2. O servidor procura essa chave no banco.
  3. Se não existe, executa a operação e guarda a chave junto com o resultado.
  4. Se já existe, não executa de novo e devolve o resultado guardado.

A chave identifica a intenção do usuário, não a requisição. Se ele tentar de novo a mesma ação, reenvie a mesma chave. Uma nova ação pede uma chave nova.

Outras proteções

  • No front-end, desative o botão após o primeiro clique e mostre o estado de carregamento.
  • Use restrições de unicidade no banco, como um número de pedido único por carrinho.
  • Registre logs com a chave para investigar duplicidades depois.
  • Defina o que fazer se a mesma chave chegar com dados diferentes: o mais seguro é recusar com erro.

Em cobranças, confira também a documentação do seu provedor de pagamentos, que costuma oferecer suporte próprio à idempotência.

  • APIs
  • Backend
  • Desenvolvimento

Perguntas frequentes

Quais métodos HTTP são idempotentes?

Por definição, GET, PUT e DELETE são idempotentes, enquanto POST normalmente não é. Por isso criar pedidos e pagamentos com POST exige cuidado extra.

Por quanto tempo guardar a chave de idempotência?

Guarde por um período maior que o tempo razoável de novas tentativas do cliente. Muitos serviços usam de horas a dias, e a escolha depende do seu caso.

Leia também

Criação de Apps

Webhook: o que é, como funciona e como receber um com segurança

Como funcionam os avisos automáticos entre sistemas e o que cuidar ao recebê-los.

· 5 min de leitura
Criação de Apps

JSON: o que é e como ler esse formato para iniciantes

Se você mexe com APIs ou configurações, vai encontrar JSON o tempo todo.

· 2 min de leitura
Criação de Apps

OAuth: como funciona o login com Google e outras contas

OAuth é o padrão que deixa um app usar sua conta de outro serviço sem conhecer a sua senha.

· 3 min de leitura
Criação de Apps

Rate limit: o que é e como lidar com o limite de requisições

O limite de requisições protege a API, e seu app precisa estar preparado para esbarrar nele.

· 2 min de leitura

Deixe seu comentário