Fluxo seguro para produção
- Desabilite envios duplicados no navegador.
- Chame
elements.submit(...)apenas uma vez por tentativa de checkout. - Deixe o back-end criar a transaction.
- Deixe
elements.submit(...)concluir a autenticação do cartão quando o pagamento exigir. - Retome a transaction se o comprador for interrompido no meio do pagamento.
- 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:Payload do token
O callbackcreateTransaction recebe metadados não sensíveis do cartão junto com o token:
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
next_action é opaco — elements.submit(...) o lê
e conclui a autenticação do cartão para você.
Erro comum
Tratamento de estado inválido
Mantenha o botão de submit desabilitado até que o campo de cartão reporte um estado válido: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.

