Skip to main content
Um checkout white-label permite cobrar cartão dentro da sua própria experiência: sua URL, sua interface, sua marca e seus estados de pagamento. A Chargefy cuida da tokenização, do cartão salvo, da cobrança e dos webhooks. A regra de segurança é simples: o número do cartão e o CVC são tratados no navegador do comprador com Chargefy.js. O seu backend cria o cadastro e entrega o 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. Crie customer e setup intent no backend, colete o cartão com confirmSetup no navegador e cobre com o payment_method salvo. Valide valores e vínculo do comprador no servidor, implemente idempotência e webhooks e teste aprovação, recusa e retry em sandbox.
Para 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.

O que fica com quem

Como as peças se encaixam

Um payment intent é cobrado com um payment_method (pm_*). O número do cartão nunca chega ao seu backend: confirmSetup() tokeniza no navegador e devolve o cartão já salvo.

Pagamento imediato

1. Crie ou reutilize um customer

O cartão pertence a um customer. Para cartão no Brasil, crie o customer com document (CPF/CNPJ).
Reutilize o mesmo customer quando o comprador já existir no seu sistema. Assim você mantém cartões salvos, histórico e cobranças futuras no mesmo perfil.

2. Inicie o cadastro no backend

Crie um setup intent para o customer. Envie o client_secret retornado somente à página que vai coletar o cartão.
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.
Seu backend recebe apenas o pm_*; número e CVC não chegam à sua aplicação.

4. Cobre com o cartão salvo

Crie o payment intent com customer, payment_method e confirm: true.
Uma aprovação imediata retorna 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.
Mesmo em uma compra avulsa, o cartão salvo fica disponível no customer. Isso permite retry com consentimento, recompra e assinaturas sem pedir os dados de novo.

Parcelamento

Parcelas são definidas em payment_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:
Com 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.
Enviar installments no corpo do confirm retorna 400. Defina as parcelas no create ou update do payment intent.

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.
A resposta traz 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 o amount —, 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 HTTP 402, 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:
  1. Crie um novo setup intent no backend.
  2. Chame confirmSetup() com o novo client_secret e os dados corrigidos.
  3. Atualize o mesmo Payment Intent com esse pm_*.
  4. Confirme novamente o mesmo Payment Intent.
O SDK cria uma nova credencial intermediária a cada confirmação. Uma 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 retornar succeeded, 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.
Uma cobrança de cartão também emite charge.succeeded ou charge.failed. Para o estado do pagamento, escute payment.intent.*; charge.* é o detalhe da tentativa de cobrança.

Erros esperados

Todos seguem o formato de erro { error: { code, message, param, type } }.

Sandbox

Em test, 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

Esta seção só se aplica a contas com o produto Chargefy for Platforms habilitado, que operam pagamentos para suas organizações filhas.
Se você cobra em nome de organizações filhas, envie o header Organization 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

Substitua customer 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.
Execute 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

Os IDs são ilustrativos: use os recursos criados para aquela filha. O MCP conectado à organização dona da plataforma pode consultar suas organizações filhas; isso não permite executar cobranças nem criar recursos nelas. A API key de plataforma é usada pelo backend, e não para autenticar o MCP. Veja Autenticação para a matriz de chaves e escopos e Chargefy.js para o exemplo.

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 em payment_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.