Вебхуки

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

Каждый вебхук содержит заголовки 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 выплат. См. подписанные запросы.