Skip to main content
Um 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 em create, 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.
Os motivos se dividem em dois grupos. Os informados por você são os que você envia em POST /v1/payment-intents/:id/cancel — disponível para os intents que você criou direto pela API. Se o intent nasceu de um checkout, quem encerra é a sessão, e o motivo vem do segundo grupo:
  • 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.
Os gerados pela Chargefy são somente de leitura. Você recebe esses valores, nunca os envia:
  • 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

O status diz qual ação ainda falta ou qual foi o desfecho. Nem todo intent passa por todos os estados.
Um timeout ou erro 5xx durante a confirmação não transforma automaticamente a tentativa em failed. Ela pode continuar processing enquanto a Chargefy confirma o resultado externo. Consulte o mesmo Payment Intent e aguarde o webhook; não inicie outra cobrança enquanto esse estado persistir.
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 único expires_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, com cancellation_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 em pending 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 eventos payment.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_charge aponta 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 succeeded por outra Charge.
  • Depois do processamento financeiro, transaction registra os movimentos do extrato, taxas, líquido e liquidação.
  • invoice vem preenchida quando a cobrança nasceu de uma invoice.

Operações

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.