payment_intent representa uma cobrança ao longo de todo o ciclo de vida:
criação, escolha do método, confirmação, ação do comprador e desfecho. Ele
concentra o valor, o customer, os métodos permitidos, a Charge mais recente,
o estado atual e a próxima ação. Cada tentativa concreta de pagar essa cobrança
é registrada por uma charge.
Use o Payment Intent como fonte do estado da cobrança. Cartão costuma resolver
na confirmação; PIX e boleto podem ficar pending até o resultado assíncrono.
Não use redirect ou callback do frontend como prova de pagamento.
Implementar Payment Intents
Fluxo completo de criação, PIX, webhook, cancelamento e nova tentativa.
Estados e lifecycle
Relação entre Payment Intent, Charge, Transaction e Invoice.
Criar Payment Intent
Parâmetros para cartão e PIX, confirmação imediata e respostas.
Eventos de Payment Intent
Os cinco eventos, quando usar cada um e os payloads completos.
Objeto payment_intent
Este é o formato completo retornado emcreate, get, update, confirm,
capture, cancel, itens de list e em data.object dos webhooks
payment.intent.*.
string
Identificador do payment intent. Usa o prefixo
pi_*.string
Sempre
"payment_intent".integer
Valor total do intent em centavos. Quando há juros de parcelamento, pode ser
maior que o valor principal original.
integer
Valor autorizado e ainda não capturado. Fica preenchido em captura manual.
object
Quebra do valor usado na cobrança.
integer
Valor já recebido. Em geral fica
0 antes do pagamento e igual a amount
quando o intent chega a succeeded.string | null
Data de cancelamento em ISO 8601.
string | null
Motivo do cancelamento. Vem
null enquanto o intent não foi cancelado.duplicate— cobrança duplicada de outro intent.fraudulent— suspeita de fraude.requested_by_customer— o cliente pediu o cancelamento.abandoned— o fluxo de pagamento foi abandonado sem uma causa mais específica.
automatic— a Chargefy encerrou a tentativa por uma regra interna, sem uma causa mais específica.expired— o prazo da compra acabou. É o motivo de um checkout que expirou com o intent ainda aberto.failed_invoice— a cobrança da fatura não foi concluída.void_invoice— a fatura foi cancelada.
Um código PIX ou boleto que vence sem pagamento não cancela o intent: ele
encerra apenas aquela tentativa e o intent volta a
requires_payment_method,
pronto para um novo código no mesmo objeto. Veja Expiração automática de PIX
e boleto.string
automatic para capturar na confirmação, ou manual para autorizar agora e
capturar depois.string
Credencial de runtime do intent. Use apenas em contexto controlado pelo seu
frontend quando o fluxo exigir confirmação client-side.
string
Como o intent é confirmado. Hoje retorna
automatic ou manual.string
Data de criação em ISO 8601.
string
Moeda em ISO 4217 minúsculo, como
brl.string | null
Customer associado ao pagamento, quando houver.
integer
Juros de parcelamento cobrados do comprador, em centavos. Retorna
0 quando
não há juros repassados ao comprador.integer | null
Quantidade de parcelas escolhida. Vem
null quando parcelamento não se
aplica.string | null
Invoice associada, quando o intent nasceu de uma invoice.
object | null
Motivo da recusa da última tentativa, quando houver. Vem
null enquanto não
houve falha. Veja Códigos de falhas
para a lista completa de códigos e categorias.string | object | null
Tentativa de cobrança mais recente. Por padrão vem como ID
ch_*; pode vir
expandida quando você usa expand[]=latest_charge.boolean
true em produção; false em ambiente de teste.object
Pares
string → string para correlacionar o intent com o seu sistema. Aceita
até 50 chaves; cada chave tem até 40 caracteres e usa letras, números, _,
- ou .; cada valor tem até 500 caracteres. Quando vazio, retorna {}.object | null
Próxima ação para o comprador. Vem preenchido em fluxos assíncronos como PIX
e boleto. Depois que a ação deixa de ser válida, o campo pode voltar a
null. Em particular, a expiração automática de PIX limpa next_action.string | object | null
Método de pagamento salvo usado no intent. Por padrão vem como ID
pm_*; pode
vir expandido quando você usa expand[]=payment_method.object
Opções por método de pagamento, como parcelamento de cartão.
array
Métodos permitidos para a cobrança. Hoje pode incluir
credit_card, pix e
boleto, conforme o fluxo.integer
Valor do produto ou serviço, em centavos, sem o
surcharge_amount nem os
juros de parcelamento. Sempre vale amount = principal_amount + surcharge_amount + installment_interest_amount.string
Estado atual da cobrança.
integer
Valor da taxa repassada ao comprador, em centavos. Retorna
0 quando não há
repasse. O detalhamento equivalente aparece em
amount_details.surcharge_amount.string | null
Data da última atualização em ISO 8601.
Estados e transições
Ostatus diz qual ação ainda falta ou qual foi o desfecho. Nem todo intent
passa por todos os estados.
Os únicos estados terminais são
succeeded e canceled. Uma recusa devolve o
intent a requires_payment_method com o motivo em last_payment_error — o
mesmo objeto aceita nova confirmação, com o mesmo cartão corrigido ou outro
método. Cada tentativa executada vira uma
charge; um intent aceita até 10 tentativas,
e além disso a confirmação responde 409.Datas e expiração
Não existe um únicoexpires_at top-level no Payment Intent. Cada timestamp
responde a uma pergunta diferente:
O prazo comercial para concluir a operação pertence ao seu sistema. Ele pode
ser menor que a validade do meio de pagamento; nesse caso, encerre a tentativa
quando o prazo local terminar — com
POST /v1/payment-intents/:id/cancel se
você criou o intent direto, ou com
POST /v1/checkout-sessions/:id/expire
se a tentativa nasceu de um checkout.
Intents criados por um checkout
Quando o intent nasceu de uma sessão de checkout, a sessão é a dona do ciclo de vida dele: enquanto a sessão está aberta o intent fica aberto — é isso que permite ao comprador voltar ao link, trocar de meio de pagamento ou pedir um novo código PIX. Quando a sessão expira, o intent é cancelado junto, comcancellation_reason: "expired".
Por isso o cancelamento direto desse intent é recusado com 409, exceto em
requires_capture. Para encerrar a tentativa antes do prazo, expire a sessão.
Expiração automática de PIX e boleto
O código tem prazo; o intent não. Quando um PIX ou boleto empending vence
sem pagamento, apenas aquela tentativa termina — o Payment Intent continua
vivo e pronto para um novo código:
Para emitir um novo código no mesmo intent, use
/regenerate_pix ou
/regenerate_boleto — cada
código novo é uma nova charge sob o mesmo pi_*.
Antes disso, a confirmação que levou o intent de requires_confirmation para
pending emitiu payment.intent.updated com o código completo. Persista
next_action.pix_display_qr_code.expires_at nesse momento: o payload da
expiração não repete o prazo.
A ordem acima descreve o lifecycle. As entregas HTTP podem chegar duplicadas
ou fora de ordem; deduplique por
event.id e use o objeto completo de
data.object para reconciliar o estado.Objeto completo nos webhooks
Nos eventospayment.intent.*, data.object usa este mesmo contrato completo.
Ele não é um patch. Quando data.previous_attributes estiver presente, apenas
esse campo é parcial: ele contém os valores anteriores dos campos alterados.
Relação com Charge e Transaction
- O Payment Intent representa o ciclo da cobrança.
- Cada confirmação pode materializar uma
charge, que registra a tentativa concreta de cobrar o método. latest_chargeaponta para a tentativa mais recente.- Regenerar PIX ou boleto mantém o mesmo Payment Intent e cria uma nova Charge.
- Uma Charge antiga que falha ou expira não rebaixa um Payment Intent que já
chegou a
succeededpor outra Charge. - Depois do processamento financeiro,
transactionregistra os movimentos do extrato, taxas, líquido e liquidação. invoicevem preenchida quando a cobrança nasceu de uma invoice.
Operações
- Listar payment intents
- Criar payment intent
- Consultar payment intent
- Atualizar payment intent
- Confirmar payment intent
- Capturar payment intent
- Cancelar payment intent
- Regenerar PIX
- Regenerar boleto
Testar em sandbox
Para PIX e boleto, associe um customer com um dos e-mails de teste do sandbox. O resultado passa pelo fluxo normal de confirmação e, nos cenários delayed, muda automaticamente após cerca de 3 minutos.Webhooks
Para liberar produto, crédito, assinatura ou acesso, prefira webhooks em vez de depender só da resposta síncrona. Eventos principais:Entrega e assinatura
Assinatura oficial, timeout, retries, duplicação e ordem.
Cadastrar endpoint
Inscreva os tipos exatos; wildcards não são aceitos.

