Подпись Webhook

CocoLime подписывает тело Webhook HMAC-SHA256. Секрет — webhook_secret из ЛК (API ключи → Webhook secret).

Алгоритм

  1. Возьмите JSON-тело как объект, отсортируйте ключи рекурсивно по алфавиту.
  2. Сериализуйте в компактный JSON (без пробелов).
  3. Вычислите HMAC-SHA256(secret, json) в hex.
  4. Сравните с заголовком X-Signature (constant-time).
const crypto = require('crypto');
function sortKeys(v) {
  if (Array.isArray(v)) return v.map(sortKeys);
  if (v && typeof v === 'object') {
    return Object.keys(v).sort().reduce((o, k) => ({ ...o, [k]: sortKeys(v[k]) }), {});
  }
  return v;
}
function verify(secret, body, signature) {
  const json = JSON.stringify(sortKeys(body));
  const expected = crypto.createHmac('sha256', secret).update(json, 'utf8').digest('hex');
  return expected === signature;
}