Skip to main content
Use esta página quando estiver saindo de uma integração de demonstração para um checkout seguro para produção.

Fluxo seguro para produção

  1. Desabilite envios duplicados no navegador.
  2. Chame elements.submit(...) apenas uma vez por tentativa de checkout.
  3. Deixe o back-end criar a transaction.
  4. Deixe elements.submit(...) concluir a autenticação do cartão quando o pagamento exigir.
  5. Retome a transaction se o comprador for interrompido no meio do pagamento.
  6. Libere o pedido apenas a partir de webhook ou reconciliação.

Padrão de submit no front-end

elements.submit(...) conduz a tentativa inteira. Ele cria uma sessão de Element se necessário, solicita a tokenização ao campo hospedado, chama o callback createTransaction com o payload do token e então conclui qualquer autenticação de cartão que o pagamento exija antes de resolver. A autenticação não precisa de nenhum campo extra no seu formulário de checkout. Ela usa o buyer e os products que o seu back-end já envia ao criar a transaction. Veja 3D Secure.

Retomar um pagamento interrompido

Se o comprador recarregar a página ou sair no meio do pagamento, retome a mesma transaction em vez de iniciar uma nova tentativa:
Persista o id da transaction assim que o seu back-end retorná-lo.
resume() não recupera um pagamento que estava aguardando autenticação de cartão. Ele retorna failed — inicie uma nova tentativa. Veja 3D Secure.

Payload do token

O callback createTransaction recebe metadados não sensíveis do cartão junto com o token:
Envie tokenData.token ao seu back-end para criar a transação. Use brand, last4, exp_month e exp_year apenas para UI provisória do checkout ou bookkeeping do seu próprio back-end; o estado final do pagamento continua vindo da resposta da transação, webhook ou reconciliação.

Exemplo de requisição do back-end

Exemplo de resposta do back-end

Retorne esse payload ao navegador sem alterações. next_action é opaco — elements.submit(...) o lê e conclui a autenticação do cartão para você.

Erro comum

Como corrigir: não crie a transaction antes de o navegador ter um token do Payment Element. Se um fluxo de challenge for interrompido, reconcilie a transaction antes de permitir nova tentativa.

Tratamento de estado inválido

Mantenha o botão de submit desabilitado até que o campo de cartão reporte um estado válido:
Se elements.submit(...) retornar { "status": "error" }, não chame seu back-end novamente com um token ausente ou antigo. Mostre o erro retornado, deixe o comprador corrigir os dados do cartão e execute uma nova tentativa de checkout.

Regra de estado final

Uma mensagem de sucesso no navegador não basta para liberar o pedido. A liberação final depende do estado do pagamento confirmado por webhook ou reconciliação.