Pular para o conteúdo

Assinatura HMAC

Cada POST inclui os headers:

HeaderConteúdo
Content-Typeapplication/json
X-Shatin-Evento tipo do evento (ex.: transaction.paid)
X-Shatin-Timestamptimestamp Unix em segundos usado na assinatura
X-Shatin-SignatureHMAC-SHA256 em hex

Cálculo da assinatura:

Cálculo da assinatura
signature = HMAC_SHA256(signing_secret, `${timestamp}.${rawBody}`) // hex

onde rawBody é o corpo JSON exato recebido e timestamp é o valor de X-Shatin-Timestamp.

Exemplo de verificação (Node.js):

Verificação em Node.js
const crypto = require('crypto');
function verifyWebhook(rawBody, headers, signingSecret) {
const timestamp = headers['x-shatin-timestamp'];
const signature = headers['x-shatin-signature'];
const expected = crypto
.createHmac('sha256', signingSecret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected),
);
}