Chaque webhook est signé avec votre api_secret, en HMAC-SHA256 sur le corps brut de la requête (avant tout parsing JSON). Vérifiez toujours cette signature avant de traiter un webhook.
X-CaurisPay-Signature: <signature hmac-sha256>
webhook-handler.js
const crypto = require('crypto');
function verifySignature(rawBody, signatureHeader, apiSecret) {
const expected = crypto
.createHmac('sha256', apiSecret)
.update(rawBody)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signatureHeader)
);
}
app.post('/webhooks/caurispay', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-caurispay-signature'];
const isValid = verifySignature(req.body, signature, process.env.CAURISPAY_API_SECRET);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(req.body);
// traitez l'événement ici
res.status(200).send('OK');
});