Webhooks
Receba notificacoes em tempo real sobre mudancas nos pagamentos. Configure uma URL para receber eventos automaticamente.
Configuracao
Para configurar webhooks, acesse o dashboard em Configuracoes > Webhooks e adicione a URL do seu endpoint.
Exemplo de URL:
https://seusite.com/api/webhooks/sellxEventos Disponiveis
order.createdPedido foi criado (aguardando pagamento)order.paidPagamento foi confirmadoorder.failedPagamento falhou ou foi recusadoorder.refundedPagamento foi estornadoPayload do Webhook
// Payload do webhook - order.paid
{
"event": "order.paid",
"timestamp": "2024-01-15T14:30:00Z",
"data": {
"order": {
"id": "uuid-do-pedido",
"orderNumber": "ORD-123456",
"status": "paid",
"paymentMethod": "pix",
"amount": 9900,
"paidAt": "2024-01-15T14:30:00Z"
},
"customer": {
"name": "Joao Silva",
"email": "joao@email.com"
},
"product": {
"name": "Curso Online"
}
}
}Verificacao de Assinatura
Importante
Sempre verifique a assinatura do webhook antes de processar o evento. Isso garante que a requisicao veio realmente do SellX Checkout.
Cada requisicao inclui os headers X-Webhook-Signature (assinatura HMAC-SHA256) e X-Webhook-Event (tipo do evento).
// Verificar assinatura do webhook
import crypto from 'crypto';
function verifyWebhookSignature(payload, signature, secret) {
// Remove o prefixo 'sha256=' se presente
const sig = signature.replace('sha256=', '');
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(sig),
Buffer.from(expectedSignature)
);
}
// No seu endpoint (Express.js)
app.post('/webhook', (req, res) => {
const signature = req.headers['x-webhook-signature'];
const event = req.headers['x-webhook-event'];
if (!verifyWebhookSignature(req.body, signature, WEBHOOK_SECRET)) {
return res.status(401).json({ error: 'Invalid signature' });
}
// Processar evento
const { data } = req.body;
switch (event) {
case 'order.paid':
// Liberar acesso ao produto
console.log('Pedido pago:', data.order.orderNumber);
break;
case 'order.failed':
// Notificar cliente
break;
}
res.json({ received: true });
});Boas Praticas
Responda rapidamente
Retorne uma resposta 200 em ate 5 segundos. Processe eventos pesados de forma assincrona.
Seja idempotente
O mesmo evento pode ser enviado mais de uma vez. Use o orderId para evitar processamento duplicado.
Trate falhas
Em caso de falha, reenviaremos o webhook ate 5 vezes com backoff exponencial.