client_secret; o SDK conclui a coleta e devolve
somente um payment_method reutilizável.
Use Checkout white-label quando você quer controlar a tela de pagamento
inteira. Se preferir uma página pronta com sua marca e domínio, use Checkout
Sessions e configure a
apresentação.
Quando usar
Implementar com um assistente MCP
O MCP da Chargefy ajuda o assistente a pesquisar esta documentação, detalhar os contratos disponíveis e consultar o resultado. Criar setup intents e payment intents e confirmar pagamentos são chamadas da API pública no seu backend; coletar o cartão é responsabilidade do Chargefy.js no navegador. Essas ações não são ferramentas de execução do MCP. Um pedido que preserva a escolha de interface própria:Implemente um checkout próprio com Chargefy.js seguindo este guia. Use o MCP para consultar a documentação e os recursos permitidos. CriePara operar pagamentos de organizações filhas, siga também a seção Chargefy for Platforms: o escopo do MCP e as credenciais da API têm papéis diferentes.customere setup intent no backend, colete o cartão comconfirmSetupno navegador e cobre com opayment_methodsalvo. Valide valores e vínculo do comprador no servidor, implemente idempotência e webhooks e teste aprovação, recusa e retry em sandbox.
O que fica com quem
Como as peças se encaixam
Pagamento imediato
1. Crie ou reutilize um customer
O cartão pertence a um customer. Para cartão no Brasil, crie o customer comdocument (CPF/CNPJ).
2. Inicie o cadastro no backend
Crie um setup intent para o customer. Envie oclient_secret retornado somente
à página que vai coletar o cartão.
client_secret, combinado com a chave publicável, autoriza consultar e
concluir somente esse cadastro. Envie-o à página do comprador, mas não o
coloque em analytics, logs ou mensagens.
3. Salve o cartão no navegador
Na sua tela de pagamento, carregue o Chargefy.js, use a chave publicável do mesmo ambiente e conclua o cadastro.pm_*; número e CVC não chegam à sua aplicação.
4. Cobre com o cartão salvo
Crie o payment intent comcustomer, payment_method e confirm: true.
200 com status: "succeeded", como abaixo.
Confira também o status HTTP: em uma recusa, o intent vem dentro de
error.payment_intent, conforme a seção Recusa e retry.
Parcelamento
Parcelas são definidas empayment_method_options.credit_card.installments no create ou update do payment intent. Não envie parcelamento no confirm.
O objeto retornado detalha o cálculo do parcelamento:
interest_payer: "organization", o mesmo pedido volta com amount: 120000
e o mesmo installment_interest_amount: 3600: o juro existe, mas é descontado
do seu líquido em vez de entrar no total do comprador.
Exiba o valor exato das parcelas
No Brasil, Payment Previews serve basicamente para uma coisa: exibir no seu checkout a quantidade de parcelas e o valor exato de cada uma, já com o acréscimo calculado — antes de criar o payment intent, sem você calcular juro na mão.payment_methods.credit_card.installments.options[] com
count, per_installment_amount, amount e interest_payer de cada opção —
a tabela pronta para o seu seletor de parcelas — além dos totais de pix e boleto no mesmo
payload. Quando o comprador escolher, envie o count no create ou update do
payment intent. A Chargefy recalcula tudo no servidor; a preview serve apenas
para exibição.
Repasse de taxa (surcharge)
Se você quer que o comprador cubra a taxa da organização — a organização recebe líquido exatamente oamount —, envie has_surcharge: true na preview
e no payment intent. Os totais passam a incluir surcharge_amount, e no
intent a decomposição fica em amount_details — amount = principal_amount + surcharge_amount + installment_interest_amount quando o comprador paga o juro
(interest_payer: "buyer"), ou amount = principal_amount + surcharge_amount
quando a organização paga (interest_payer: "organization").
UX recomendada
Recusa e retry
Uma recusa de cartão retorna HTTP402, com o motivo em error.code e o
Payment Intent completo em error.payment_intent. Esse intent volta para
requires_payment_method, com o motivo também em last_payment_error.
Guarde o ID mesmo quando a criação com confirm: true responder com erro;
assim a próxima tentativa pode usar o mesmo pagamento. Para trocar o cartão:
- Crie um novo setup intent no backend.
- Chame
confirmSetup()com o novoclient_secrete os dados corrigidos. - Atualize o mesmo Payment Intent com esse
pm_*. - Confirme novamente o mesmo Payment Intent.
charge
recusada é terminal; o Payment Intent em requires_payment_method continua
sendo o mesmo pagamento e aceita uma nova tentativa com dados corrigidos ou
outro método.
Falhas técnicas podem retornar 502 api_error. Confira error.code,
error.advice_code e o estado do intent antes de oferecer outra tentativa.
Se o resultado estiver indefinido ou o status for processing, aguarde os
webhooks e consulte o mesmo intent. Em timeout, preserve a chave de
idempotência da operação; não crie outro pagamento para contornar a falta de
resposta.
O objeto abaixo é o estado do intent consultado por GET ou obtido em
error.payment_intent; não é uma resposta de sucesso da confirmação recusada.
3DS e autenticação
A confirmação pode retornarsucceeded, requires_capture (quando
capture_method: manual) ou uma resposta de erro com o intent em
requires_payment_method. Se o estado for processing, mantenha a tela em
processamento e aguarde a confirmação. Não há etapa de redirecionamento ou
desafio 3DS no fluxo de cartão.
Cartão não usa
next_action neste checkout white-label. O campo aparece em
métodos assíncronos: Pix no fluxo direto e boleto quando o intent nasce de
checkout hospedado ou invoice.Webhooks são a fonte da verdade
A resposta síncrona ajuda a atualizar a tela, mas o estado final da sua operação deve vir dos webhooks. Verifique a assinatura antes de processar eventos — veja Entrega de webhooks.Erros esperados
Todos seguem o formato de erro{ error: { code, message, param, type } }.
Sandbox
Emtest, o número do cartão escolhe o cenário (aprovado, recusado, saldo
insuficiente etc.). Use ch_test_* no backend e pk_test_* no Chargefy.js.
Veja os cartões de teste em Chargefy.js e os cenários completos em Sandbox.
Chargefy for Platforms
Se você cobra em nome de organizações filhas, envie o headerOrganization em
todas as chamadas do backend com a chave secreta da plataforma.
Customer, setup intent, cartão salvo e payment intent devem pertencer à mesma
organização filha e ao mesmo ambiente. No backend, obtenha a organização a
partir do vendedor autorizado no seu sistema e confira o vínculo do customer e
do payment_method com aquela compra antes de cobrar.
Customer na organização filha
Use a API key da plataforma em{{API_KEY}} nestes exemplos:
Setup intent e coleta do cartão
Substituacustomer pelo ID retornado na etapa anterior:
No navegador, use a chave publicável própria da plataforma, emitida no
console de Platforms, e o
client_secret do setup intent criado na
organização filha. Não use a chave publicável da organização dona da
plataforma: ela continua restrita aos cadastros daquela organização. A PK e o
setup intent devem estar no mesmo ambiente, e a plataforma e o vínculo com a
filha devem estar ativos. O navegador não envia o header Organization.confirmSetup() como no exemplo de navegador acima, com essa chave
publicável e esse client_secret, e envie o payment_method retornado ao seu
backend.
Cobrança na organização filha
Sessões próprias, vários produtos e assinaturas
Quando sua aplicação hospeda a página, ela também pode manter sua própria sessão de compra. Salve uma cópia dos produtos, quantidades, valores e condições antes do pagamento; alterações posteriores na oferta não devem alterar essa sessão. Proteja os dados do comprador com uma credencial de acesso aleatória, e não apenas com o ID público do link. Para uma venda avulsa com vários produtos, some os itens no backend e crie um payment intent para a compra. Consulte as parcelas em Payment previews; envie o número escolhido empayment_method_options.credit_card.installments.count na criação
ou atualização do intent, antes de confirmar. Recalcule e confira o total antes
de cobrar. O preview segue a configuração de parcelamento da organização,
inclusive quem paga o juro (interest_payer).
Para uma assinatura, salve o cartão com o mesmo fluxo de setup intent e crie a
subscription, com o cartão em
default_payment_method, os produtos em items e
payment_behavior: "allow_incomplete". A criação já tenta cobrar a primeira
invoice. Não crie outro payment intent para essa primeira cobrança. Se a
assinatura ficar incompleta, reutilize-a, atualize o cartão padrão e pague sua
invoice aberta com o cartão corrigido. Produtos
recorrentes da mesma assinatura devem compartilhar moeda e período.
Grave a operação antes de enviar a requisição e use
Idempotency-Key. Após um timeout, repita a mesma
operação com a mesma chave e corpo; não trate a ausência da resposta como uma
recusa. O prazo de retenção de idempotência da API não substitui o vínculo
durável entre sua sessão e os IDs financeiros já criados.
Os webhooks assinados podem chegar repetidos ou
fora de ordem. Registre o ID do evento, confira organização e ambiente e releia
o recurso para confirmar o estado. Para recorrência, estenda o acesso com o
período da invoice paga: leia line_items[].period_start e
line_items[].period_end em Obter uma fatura.
Não use subscription.current_period_end como prova de uma renovação paga.
Mantenha recuperação para eventos perdidos ou falhas temporárias de entrega.
Próximos passos
Chargefy.js
Referência do script de tokenização no navegador.
Tokenização de cartão
Salve cartão para assinaturas, recompra e cobrança futura.
Payment Intents
Contrato completo de create, confirm, capture e cancel.
Webhooks
Entrega, assinatura e processamento idempotente.

