Вебхуки

Проверка подлинности

Каждый вебхук содержит заголовки X-Api-Key и X-Secret. Сверьте их со своими учётными данными до обработки тела

Заголовки

ПолеТипОписание
X-Api-KeyобязательноеstringПубличный ключ мерчанта (pk_…) - тот же, что вы используете для запросов к API
X-SecretобязательноеstringСекрет мерчанта (sk_…)

Как проверять

Сравните оба заголовка с вашими сохранёнными значениями в постоянном времени(constant-time). Если хотя бы один не совпал - верните 401 и не обрабатывайте событие.

import crypto from "node:crypto";
function safeEqual(a, b) {
const ba = Buffer.from(String(a));
const bb = Buffer.from(String(b));
return ba.length === bb.length && crypto.timingSafeEqual(ba, bb);
}
export function verifyCasheraWebhook(req) {
const okKey = safeEqual(req.headers["x-api-key"], process.env.CASHERA_API_KEY);
const okSecret = safeEqual(req.headers["x-secret"], process.env.CASHERA_API_SECRET);
return okKey && okSecret;
}
Никогда не логируйте X-Secret

Секрет даёт доступ к приёму платежей и подписи выплат. Не пишите X-Secret в логи доступа, APM или трекеры ошибок. Храните ключ и секрет только в переменных окружения.

Если заголовки не совпали

Верните 401 и не обрабатывайте платёж/выплату. Несовпадение означает либо устаревший секрет (проверьте актуальные значения в кабинете), либо подделку запроса.

После проверки

Подтвердив подлинность, обработайте событие идемпотентно по ключу uuid + status и верните2xx. Подробнее о формате событий и повторах - на странице вебхуков.

Подпись запросов - это другое

HMAC-подпись (X-Timestamp / X-Signature) используется в обратную сторону - когда вы отправляете запросы к API выплат. См. подписанные запросы.