Подпись Webhook
CocoLime подписывает тело Webhook HMAC-SHA256. Секрет — webhook_secret из ЛК (API ключи → Webhook secret).
Алгоритм
- Возьмите JSON-тело как объект, отсортируйте ключи рекурсивно по алфавиту.
- Сериализуйте в компактный JSON (без пробелов).
- Вычислите
HMAC-SHA256(secret, json)в hex. - Сравните с заголовком
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;
}