polling são a parte que ninguém adivinha. Vamos por partes.
Caminho A: você tem a fatura (checkout())
Você já tem invoiceId desde o começo, então é o caminho curto:
invoiceId → seu usuário antes de mostrar a tela. É como você
vai saber de quem era a compra quando o pagamento voltar.
Caminho B: você mandou um link de pagamento
O link é a recomendação pra quem não quer montar tela. Se você quiser controlar a experiência mesmo usando link — ou testar o fluxo por HTTP — são três passos, e a fatura só existe no terceiro.- A fatura não existe antes do passo 3. A sessão não tem
invoiceId— ele aparece na resposta do charge. Não procure antes. - O charge é na sessão, não na fatura.
/sessions/{id}/charge, não/invoices/{id}/charge. A segunda existe e serve pro caminho A. - Sem
email→400 "E-mail is required."; semtaxId→400 "A valid CPF or CNPJ is required."Os dois em português, os dois antes de qualquer cobrança acontecer.
Essas rotas não exigem
Idempotency-Key. A regra “todo método que não é GET exige a chave” vale pra API autenticada. As
rotas públicas de /pay/* — as que o navegador do comprador chama — aceitam sem.Descobrir que pagou
timeoutMs. O default é 600000 — dez minutos — então numa fatura
não paga, que é o caso normal, o seu handler trava em vez de responder.
Em produção o webhook payment.confirmed é o caminho certo; em sandbox o
registro responde 503, então é polling — detalhes em
webhooks.
Entregar — e o segundo polling
Aqui está o erro que dá pra cometer com a doc toda certa na mão: o grant não existe no mesmo instante que a fatura virapaid. A entrega roda depois do
pagamento confirmar, então a primeira leitura devolve [].
200, nunca 404 — de propósito, justamente pra isso ser
consultável num loop. O resto do entregável está em
entregar o produto.
Testar tudo isso de ponta a ponta
Em sandbox você fecha o loop sozinho, sem chave de provedor:pixPayload — em produção o campo não vem
e o payload é EMV. É o que separa um botão de teste de um bug em produção. Está
detalhado em testar no sandbox.
A página inteira, junta
download vindo undefined não é erro: é produto sem entregável, ou entrega que
ainda não rodou. Nos dois casos, mostrar “seu acesso chega por e-mail em
instantes” é melhor do que uma tela vazia — e o e-mail realmente sai, desde que o
endereço exista de verdade.