- o navegador volta para a
success_url; - a Chargefy entrega o webhook da sessão;
- seu backend ativa o produto, registra o pedido ou libera o serviço.
Este artigo é para uma Checkout Session criada pelo seu backend para um pedido
específico. Se você compartilha uma URL reutilizável, veja Após receber com
um Link de pagamento: cada acesso ao
link cria uma sessão diferente.
O fluxo depois do checkout
No checkout hospedado, a primeira tentativa de
checkout.session.completed é imediata. A Chargefy aguarda um 2xx por até 10
segundos antes de liberar o redirect; se não receber confirmação, redireciona o
comprador e mantém o evento na fila para novas tentativas.
Por isso, responda 2xx depois de persistir o evento, não depois de concluir
todo o trabalho de entrega.
1. Ligue a sessão ao pedido
Crie o pedido ou a tentativa local antes de chamar a API. Depois que a Checkout Session for criada, salve osession.id nessa mesma operação de negócio.
Você também pode enviar uma referência própria em
metadata. Esse objeto é
opcional, controlado pelo seu sistema e ecoado nos eventos da sessão. Mesmo
usando metadata, mantenha a relação entre pedido e cs_* no seu banco: ela é
mais direta para consultas e suporte.
2. Configure a página de retorno
Há duas formas seguras de identificar qual pedido voltou:
Com o placeholder:
state, gere um valor aleatório no backend, guarde apenas o hash quando
possível e defina uma expiração. Não coloque e-mail, CPF, ID de usuário ou outra
informação pessoal nesse valor.
Quando a página abrir, envie o identificador ao seu backend e peça o estado do
pedido. A interface não deve consultar a Chargefy diretamente nem liberar
acesso com base apenas no parâmetro da URL.
3. Escolha o evento que autoriza a entrega
status responde se o checkout foi concluído. payment_status responde se o
pagamento foi confirmado. Para Pix e boleto, esses estados mudam em momentos
diferentes.
status: "complete" não significa necessariamente payment_status: "paid".
Em Pix e boleto, o comprador pode concluir o formulário antes de o dinheiro
ser compensado.event.id com unicidade e execute o trabalho demorado fora da
resposta. Os detalhes ficam em Entrega de
webhooks.
4. Traduza o pagamento para estados do seu produto
O frontend entende melhor estados de produto do que estados financeiros. Seu backend pode expor uma resposta simples como:
Mantenha pagamento e entrega separados. Um pedido pode estar pago enquanto seu
worker ainda provisiona acesso; também pode estar entregue sem cobrança inicial
quando um trial válido começa.
5. Faça a página consultar o seu backend
A página de retorno deve consultar um endpoint autenticado do seu sistema. Esse endpoint resolve o pedido pelosession_id ou state e devolve apenas o estado
necessário para a interface.
Um polling curto pode usar intervalos progressivos, por exemplo 1, 2, 3 e 5
segundos. Depois disso, mostre que o processamento continua e ofereça uma forma
de atualizar a página. Não transforme ausência de resposta em falha e não envie
o comprador automaticamente para criar outra cobrança.
Uma mensagem útil é mais clara do que um spinner sem contexto:
Estamos confirmando seu pedido Seu checkout foi concluído. Isso normalmente leva alguns segundos. Você pode manter esta página aberta.Se o navegador for fechado, o backend continua processando o webhook. A entrega nunca deve depender de a página permanecer aberta.
6. Reconcilie atrasos sem duplicar efeitos
Webhook e página de retorno podem encontrar o mesmo pedido ao mesmo tempo. Os dois caminhos devem chamar a mesma operação idempotente. Quando o estado local parecer atrasado, seu backend pode:- consultar
GET /v1/checkout-sessions/{id}; - comparar
statusepayment_statuscom o pedido salvo; - consultar a subscription quando
session.subscriptionestiver preenchido; - chamar a mesma função de entrega usada pelo worker;
- devolver o estado local atualizado para a página.
7. Trate assinaturas depois da primeira sessão
Uma Checkout Session recorrente coordena apenas a entrada na assinatura. Depois da conclusão:- use
session.subscriptionpara relacionar a compra à assinatura criada; - libere trial quando a subscription estiver
trialinge essa for a regra do produto; - acompanhe renovações por
invoice.paid; - trate falhas e recuperação pelo lifecycle da assinatura, não criando outra Checkout Session a cada ciclo.
Chargefy for Platforms
Além do ID da sessão, use oorganization do topo do evento para validar qual
organização filha é dona do pedido. Nunca localize uma compra apenas pelo cs_*
sem confirmar esse vínculo no seu sistema.
Checklist de produção
- O pedido existe antes da criação da Checkout Session.
- O
cs_*retornado fica salvo no pedido. - A
success_urlusa{CHECKOUT_SESSION_ID}ou umstateopaco. - Nenhuma API key ou
client_secretaparece na URL ou no frontend. - A página consulta o estado do seu backend, não decide pagamento.
-
paid,unpaideno_payment_requiredtêm regras diferentes. - Pix e boleto aguardam o evento assíncrono de sucesso.
- O webhook é validado, persistido e deduplicado antes do
2xx. - Webhook, polling e retry chamam a mesma entrega idempotente.
- Uma falha de ativação não cria outra cobrança.
- Renovações de assinatura usam eventos de invoice.
Próximos passos
Criar uma Sessão de checkout
Configure itens, comprador, recorrência e URLs de retorno.
Entregar pedidos
Implemente persistência, idempotência, retry e compensação.
Entrega de webhooks
Valide assinatura, trate reentregas e monitore seu endpoint.
Consultar Checkout Session
Leia o estado atual da tentativa pelo backend.

