Проверить подпись вебхука
Как убедиться, что событие отправил WAIX и его содержимое не изменилось.
Алгоритм
Заголовки: X-Waix-Timestamp, X-Waix-Signature, X-Waix-Delivery и X-Waix-Event. Подписывается строка timestamp + точка + исходные байты тела. Формат подписи: v1= и hex HMAC-SHA256 с секретом вебхука.
Пример Node.js
javascript
import crypto from 'node:crypto';
// rawBody — исходный Buffer тела запроса до JSON.parse.
const timestamp = req.headers['x-waix-timestamp'];
const received = req.headers['x-waix-signature'] || '';
const seconds = Number(timestamp);
if (!/^\d+$/.test(timestamp || '') ||
Math.abs(Date.now() / 1000 - seconds) > 300) {
return res.sendStatus(401);
}
const expected = 'v1=' + crypto
.createHmac('sha256', process.env.WAIX_WEBHOOK_SECRET)
.update(timestamp + '.').update(rawBody).digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(received);
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
return res.sendStatus(401);
}
// Сохраните событие в устойчивую очередь.
// X-Waix-Delivery используйте для защиты от повторов.
await persistEvent(req.headers['x-waix-delivery'], rawBody);
res.sendStatus(200);Защита от повтора
Проверьте допустимую разницу времени, затем HMAC сравнением постоянного времени. Сохраните event ID с UNIQUE-ограничением в базе. Повтор уже сохранённого события подтверждайте 2xx без повторного бизнес-действия. При ротации сразу обновите секрет получателя; согласуйте переключение, чтобы не терять события.
Остался вопрос по этой инструкции?Написать в поддержку →