Segurança
A chave live não está no bundle do front
A chave live não está no bundle do front
Procure por
ps_live_ no build final, não só no código. Um console.log esquecido ou
uma variável sem prefixo de servidor já entrega a chave.Se ela estiver exposta, alguém pode criar cobrança em seu nome e, com saque
turbo, mandar dinheiro pra fora.O webhook valida a assinatura
O webhook valida a assinatura
A sua
callbackUrl é pública. Sem validar o
X-Webhook-Signature, qualquer pessoa manda um JSON com
"status": "paid" e leva o produto de graça.Confira também que você está assinando o corpo cru, antes do parse. Um
express.json() no lugar errado quebra a validação de um jeito que passa em teste e
falha em produção.O valor é conferido antes da entrega
O valor é conferido antes da entrega
Não basta o
status ser paid. Compare o amountCents recebido com o valor que você
esperava para aquele pedido antes de liberar qualquer coisa.O webhook secret está fora do repositório
O webhook secret está fora do repositório
Variável de ambiente ou cofre. Se vazou, regenere no painel: o antigo para de funcionar
na hora.
Confiabilidade
O handler é idempotente
O handler é idempotente
Webhook é reentregue quando a entrega falha, e a mesma confirmação pode chegar mais de
uma vez. Deduplique pelo header
X-Webhook-Id, que é estável entre as tentativas.O teste é simples: mande o mesmo payload duas vezes e veja se o cliente recebe o
produto duas vezes.Você responde 200 rápido e processa depois
Você responde 200 rápido e processa depois
O timeout é de 5 segundos. Se o seu handler manda e-mail, gera licença e escreve em
três tabelas antes de responder, ele vai estourar e você vai receber reentrega de
coisa que já processou.Grave o evento, responda
200, processe em fila.Existe reconciliação além do webhook
Existe reconciliação além do webhook
Webhook é notificação, não fonte da verdade. Tenha um job que varre pedidos parados em
pending há mais de uma hora e confirma o estado por GET.Você não faz retry de 202 e processing
Você não faz retry de 202 e processing
Em saques,
202 e status: "processing" significam que o dinheiro
pode já ter saído. Reenviar paga duas vezes.Configuração da conta
1
Chave PIX verificada
Sem verificação, o primeiro saque devolve
403. Resolva isso antes de precisar do
dinheiro, não depois.2
3
Valor mínimo conferido
O painel permite subir o mínimo da loja acima de R$ 0,80. Se o seu produto mais barato
fica abaixo dele, a cobrança falha em produção e passava em sandbox.
4
Carteira LTC configurada, se for usar cripto
Sem carteira,
paymentMethod: "ltc" devolve 503.Operação
Log com o tripé certo
Código HTTP, corpo do erro e
paymentId. Com esses três, uma dúvida
no Discord vira uma resposta em vez de cinco.Alerta de disputa
Rode
GET /v1/disputes?status=aberta diariamente. Contestação tem prazo.Uma chave por serviço
Dá pra revogar uma sem derrubar o resto, e dá pra saber quem gastou o limite.
Backoff no cliente
Com jitter. Sem ele, seus workers batem no
429 todos juntos.O teste final
Faça uma venda real de valor baixo, do início ao fim: cobrança, pagamento, webhook, entrega e saque. É o único teste que cobre configuração de conta, e leva dez minutos.Travou em algum ponto?
Chama no Discord com o código HTTP, o corpo do erro e o
paymentId. Costuma sair na
primeira resposta.
