customer, os métodos permitidos, a tentativa mais recente, o status atual e a próxima ação que cabe ao comprador. É por ele que o seu sistema sabe se o dinheiro entrou, está em trânsito ou foi recusado.
Implementar Payment Intents
Passo a passo com PIX, cartão salvo, webhook e estado local.
Contrato do objeto
Campos, tipos, enums, timestamps e payload completo.
Payment Intent ≠ Charge ≠ Cadastro de cartãoO payment intent é o processo da cobrança — vive por todo o ciclo. Cada tentativa concreta de mover dinheiro vira uma
charge, e o intent aponta a mais recente em latest_charge. Já um cadastro de cartão (setup_intent) apenas salva um cartão para uso futuro, sem cobrar ou reservar limite.Como os recursos se relacionam
O schema público completo está em Objeto Payment Intent.
Para que serve
Use payment intents quando você quer controlar a cobrança diretamente pela API, sem depender de uma Checkout Session:- você tem Checkout white-label e quer confirmar a cobrança via API;
- precisa cobrar um meio de pagamento salvo (
payment_method); - quer separar a criação da cobrança da confirmação;
- precisa autorizar agora e capturar depois (cartão);
- quer acompanhar tentativas, falhas e sucesso de forma previsível, reagindo por webhook.
Quem prefere uma página de pagamento pronta e hospedada não precisa orquestrar
o intent manualmente — uma Checkout Session
cria e confirma o payment intent por baixo dos panos.
Práticas de integração
- Crie um Payment Intent quando o valor da compra estiver definido.
- Reutilize o mesmo intent quando o comprador retomar a mesma tentativa.
- Envie
Idempotency-Keyem escritas que podem ser repetidas após timeout ou falha de rede. - Mantenha a API key no servidor e use
metadataapenas para referências como o ID do pedido, nunca para regra de negócio ou dado sensível. - Confirme o resultado por webhook; retorno do navegador não prova pagamento.
Anatomia do payment intent
Ciclo de vida e status
Ostatus reflete o que falta para concluir o pagamento. Cartão costuma resolver na hora; PIX e boleto ficam pendentes até a confirmação assíncrona chegar.
Numa cobrança de cartão confirmada,
latest_charge aponta a tentativa e
last_payment_error registra o motivo quando ela é recusada. A recusa não
encerra o intent: ele volta a requires_payment_method e o mesmo objeto
aceita nova confirmação — com o cartão corrigido ou outro cartão. Cada
tentativa executada vira uma charge, até o limite de 10 por intent.Como funciona
1
Crie o payment intent
Informe
amount, currency, customer e payment_method_types. Sem
método definido, ele nasce em requires_payment_method; com método salvo ou
PIX, já em requires_confirmation. O create direto aceita cartão e Pix;
intents de boleto são materializados por checkout hospedado ou invoice.2
Confirme a cobrança
POST /v1/payment-intents/{id}/confirm inicia a tentativa. Você também pode
criar e confirmar de uma vez com confirm: true no create.3
Apresente a próxima ação (se houver)
Pix direto retorna
next_action com o QR code. Um intent de boleto criado
por checkout hospedado ou invoice pode trazer a linha digitável. Mostre a
ação ao comprador e aguarde a confirmação assíncrona.4
Reaja ao resultado
O intent termina em
succeeded, volta para requires_payment_method
(recusa), fica em requires_capture (captura manual) ou em canceled.
Confie nos webhooks para liberar o produto.Criar e confirmar
Opayment_method_types aceita credit_card e pix no create direto pela API; boleto é resolvido nos fluxos hospedados de checkout e fatura. Cada caminho de criação tem um comportamento distinto.
(a) Cartão salvo, cobrando na hora
Passe umpayment_method salvo do customer e confirm: true. O cartão resolve de forma síncrona.
(b) PIX, com QR code para o comprador
PIX nasce emrequires_confirmation. Ao confirmar, o intent vai para pending e devolve o next_action com o código a exibir.
(c) Cartão a definir, parcelado
Sempayment_method, o intent nasce em requires_payment_method. Defina o número de parcelas em payment_method_options.credit_card.installments — o amount final reflete os juros aplicados.
installments.count vai de 1 a 12 e respeita um teto calculado pelo valor da
cobrança. Quando omitido, usa 1. has_interest define quem absorve o juro:
true faz o comprador pagar o acréscimo e false mantém a venda sem juros
para o comprador. Quando omitido, vale a configuração da organização. Os juros
de parcelamento aparecem em amount_details.Próxima ação do comprador
Métodos assíncronos preenchemnext_action. Use o type para decidir o que renderizar.
PIX — pix_display_qr_code
PIX — pix_display_qr_code
Traz
qr_code (código EMV copia-e-cola), qr_code_url (imagem do QR,
quando disponível) e expires_at. Exiba o QR e o botão de copiar; o
pagamento confirma de forma assíncrona.Boleto — boleto_display_details
Boleto — boleto_display_details
Traz
hosted_voucher_url, pdf, number (linha digitável), barcode e
expires_at. O boleto pode ser regerado enquanto está pending com POST /v1/payment-intents/{id}/regenerate_boleto.Captura manual
Comcapture_method: "manual" (hoje, somente credit_card), a confirmação autoriza o valor e o intent fica em requires_capture, com amount_capturable preenchido. Você captura depois:
requires_capture libera a autorização do cartão. A captura e o cancelamento retornam o payment intent completo atualizado.
Atualizar e cancelar
Eventos
Para liberar produto, crédito, assinatura ou acesso, prefira reagir por webhook em vez de depender só da resposta síncrona:Próximos passos
Objeto payment_intent
Schema público completo e campos retornados.
Charges
A tentativa concreta de cobrança gerada pelo intent.
Criar payment intent (API)
Contrato do
POST /v1/payment-intents.Checkout Sessions
Página hospedada que cria e confirma o intent por você.
Entrega de webhooks
Assinatura, timeout, retries, duplicação e ordem.

