API
ДокументацияAPI и интеграции

Проверить подпись вебхука

Как убедиться, что событие отправил WAIX и его содержимое не изменилось.

WAIX API · Обновлено 22 сентября 2026

Алгоритм

Заголовки: 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 без повторного бизнес-действия. При ротации сразу обновите секрет получателя; согласуйте переключение, чтобы не терять события.

Остался вопрос по этой инструкции?Написать в поддержку →