Pular para o conteúdo
xFlow Payments

Blog

Failover de pagamentos: como sobreviver à queda de uma adquirente

Failover de pagamentos é trocar de provedor automaticamente quando o principal deixa de responder. No Pix, isso significa gerar a cobrança em outra adquirente sem o pagador perceber. Na xFlow, a cobrança vai para a próxima adquirente da cadeia, e o seu sistema faz retry seguro com Idempotency-Key.

Atualizado em · Equipe xFlow Payments · 5 min de leitura

Failover de pagamentos é trocar de provedor automaticamente quando o principal deixa de responder, para que as cobranças continuem sendo geradas. No Pix, uma queda de adquirente sem failover significa checkout parado: o cliente quer pagar e não recebe o QR Code. Com failover, a cobrança é gerada em outra adquirente e o pagador nem percebe a troca.

Na xFlow Payments, o failover é a retentativa automática: se a adquirente escolhida não responde, a xFlow tenta de novo e, se precisar, gera a cobrança na próxima adquirente da cadeia. A seguir, o que acontece numa queda, como desenhar o failover e o que o seu sistema precisa fazer.

O que acontece numa queda de adquirente

Uma adquirente fora do ar raramente avisa. Os sinais mais comuns são:

  • pedidos de cobrança que demoram e terminam em timeout;
  • erros na geração da cobrança;
  • cobranças que não chegam ao pagador.

Para quem vende, o efeito é imediato: cada tentativa de compra sem QR Code é uma venda que pode não voltar. Quanto maior o volume, maior o custo de cada minuto parado.

Failover, retentativa e contingência

Os termos aparecem juntos e se completam:

Termo O que significa Na xFlow
Retentativa Tentar de novo no mesmo provedor A xFlow tenta de novo quando a adquirente não responde
Failover Trocar para outro provedor A cobrança Pix é gerada na próxima adquirente da cadeia
Cadeia de contingência A ordem dos provedores que entram em caso de falha Definida por regra de roteamento, na configuração da sua conta

Como desenhar failover de pagamentos

1. Tenha uma cadeia ordenada

Failover precisa de um plano B definido antes da falha. Cada regra deve dizer qual provedor vem primeiro, qual vem depois e assim por diante. Na xFlow, essa ordem faz parte do roteamento de pagamentos: cada regra, por valor, horário ou dia da semana, aponta para uma cadeia.

2. Defina quando desistir de um provedor

Esperar indefinidamente por uma resposta é o mesmo que estar parado. O failover precisa de um limite de espera por tentativa e de um número de novas tentativas antes de passar para o próximo. Na xFlow, isso é feito do lado da xFlow, por adquirente da cadeia.

3. Proteja contra duplicidade

Toda troca e todo retry carregam o risco de gerar duas cobranças para o mesmo pedido. A defesa é a idempotência: um identificador único por pedido, que faz o provedor devolver a mesma cobrança em vez de criar outra. Na API da xFlow, esse identificador é o cabeçalho Idempotency-Key.

4. Cuidado redobrado no dinheiro que sai

Na entrada, uma cobrança a mais fica pendente e expira sem pagamento. Na saída, um envio a mais é dinheiro que sai duas vezes. Por isso, no saque, a regra é nunca repetir sem idempotência: envie o Idempotency-Key em todo POST /api/v1/transfers e espere o webhook withdrawal.completed ou withdrawal.failed antes de concluir que algo deu errado.

5. Observe o que está acontecendo

Failover sem visibilidade esconde problemas. Acompanhe os códigos de erro, o tempo de resposta e a situação dos serviços.

Como a xFlow faz failover no Pix

  1. Seu sistema chama POST /api/v1/charges com um Idempotency-Key.
  2. A regra de roteamento da sua conta escolhe a primeira adquirente.
  3. Se ela não responde, a xFlow tenta de novo.
  4. Se continuar sem resposta, a xFlow gera a cobrança na próxima adquirente da cadeia.
  5. A API devolve a cobrança com pix.copyPaste e pix.qrCodeBase64, no mesmo formato de sempre.
  6. Se nenhuma adquirente da cadeia gerar a cobrança, a API responde 502 charge_failed.

O pagador recebe um único QR Code, o da cobrança que a API devolveu. O seu sistema não precisa saber qual adquirente gerou a cobrança.

O que o seu sistema deve fazer

Situação O que fazer
Sem resposta da API (a conexão caiu do seu lado) Repita o pedido com o mesmo Idempotency-Key e o mesmo corpo
502 charge_failed A cobrança não foi gerada. Espere um pouco e tente de novo com o mesmo Idempotency-Key
429 rate_limited Espere os segundos do cabeçalho retry-after e tente de novo
409 idempotency_conflict A chave foi usada com outro corpo. Use uma chave nova para um pedido novo
Webhook não chegou Consulte GET /api/v1/charges/{id} para confirmar o status

Exemplo de retry seguro em Node.js

js
async function criarCobranca(pedido, tentativas = 3) {
  const cred = Buffer.from(process.env.XFLOW_PUBLIC_KEY + ":" + process.env.XFLOW_SECRET_KEY).toString("base64");
  for (let i = 0; i < tentativas; i++) {
    try {
      const res = await fetch("https://app.xflowpayments.com/api/v1/charges", {
        method: "POST",
        headers: {
          Authorization: "Basic " + cred,
          "Content-Type": "application/json",
          "Idempotency-Key": "pedido-" + pedido.id, // a mesma chave em todas as tentativas
        },
        body: JSON.stringify({
          amountCents: pedido.valorCentavos,
          customer: pedido.cliente,
          external_reference: "pedido-" + pedido.id,
        }),
      });
      if (res.status === 429) {
        const espera = Number(res.headers.get("retry-after") || 1);
        await new Promise((r) => setTimeout(r, espera * 1000));
        continue;
      }
      if (res.status === 502) {
        await new Promise((r) => setTimeout(r, 2000 * (i + 1)));
        continue;
      }
      return await res.json();
    } catch (erro) {
      // a conexão falhou do seu lado: repete com a mesma Idempotency-Key
      await new Promise((r) => setTimeout(r, 2000 * (i + 1)));
    }
  }
  throw new Error("Não foi possível gerar a cobrança agora.");
}

Como a chave é a mesma em todas as tentativas, a API devolve a mesma cobrança se uma delas já tiver sido criada. Os detalhes estão na documentação.

Como acompanhar a operação

  • Página de status. A página de status mostra a situação da API, dos webhooks e do painel.
  • Logs da API. Em Integrações > Logs da API, cada requisição aparece com status, duração e código de erro, por 30 dias.
  • request_id. Toda resposta traz um request_id. Guarde-o nos seus logs para cruzar com os da xFlow e com o suporte.

Failover é uma das peças da orquestração de pagamentos. Se você ainda compara opções, veja a diferença entre orquestração e gateway.

Perguntas frequentes

O que é failover de pagamentos?

É a troca automática para outro provedor de pagamento quando o principal falha. No Pix, a cobrança é gerada em outra adquirente, e o pagador recebe o QR Code normalmente.

O que acontece com as vendas numa queda de adquirente?

Sem failover, as cobranças não são geradas até a adquirente voltar, e o checkout para. Com failover, a próxima adquirente da cadeia assume a geração das cobranças.

Como a xFlow faz failover?

Cada regra de roteamento tem uma cadeia de adquirentes em ordem. Se a adquirente escolhida não responde ao pedido da cobrança Pix, a xFlow tenta de novo e, se precisar, gera a cobrança na próxima da cadeia.

Meu sistema precisa fazer alguma coisa durante a queda?

O failover entre adquirentes é feito pela xFlow. Do seu lado, envie sempre um Idempotency-Key, repita o pedido com a mesma chave se não receber resposta e trate os erros 502 charge_failed e 429 rate_limited.

Continue lendo