Toda notificação de webhook é assinada com HMAC-SHA256, enviada no cabeçalho X-ParceleMais-Signature, para confirmar que a requisição veio da Parcele+ e não foi forjada por terceiros.
t — timestamp Unix (segundos) de quando a notificação foi enviada.
v1 — HMAC-SHA256 em hexadecimal, calculado sobre a string {t}.{corpo_bruto_da_requisição}, usando a chaveAssinatura do webhook.
SDK .NET
ParceleMaisWebhookEvent.Parse(rawJson, signatureHeader, signingSecret) já valida a assinatura e a janela de replay para você.
Se você não usa o SDK .NET, recalcule manualmente:
Extraia t e v1 do cabeçalho X-ParceleMais-Signature.
Calcule HMACSHA256("{t}.{corpo_bruto}", chaveAssinatura) em hexadecimal.
Compare o resultado com v1 usando uma comparação de tempo constante (timingSafeEqual/CryptographicOperations.FixedTimeEquals — nunca == ou Equals).
Rejeite se t estiver a mais de 5 minutos de distância do horário atual (proteção contra replay).
Sempre valide a assinatura contra o corpo bruto da requisição, antes de desserializar. Reformatar o JSON altera o hash calculado e invalida a comparação.
Além da assinatura, você pode exigir uma credencial própria (Basic ou Bearer JWT) na configuração do webhook — veja os tipos de autenticação disponíveis.
Se o seu endpoint responder com erro ou timeout, a notificação não é reenviada automaticamente. Trate seu endpoint como não confiável por padrão: responda rápido (2xx) e processe de forma assíncrona, e use GET /v1/order/{id} para reconciliar o status caso desconfie de uma notificação perdida.
Use a combinação id_pedido + enum_status (+ o t do cabeçalho de assinatura, se quiser distinguir reenvios do mesmo status) como chave de deduplicação antes de processar.