Перейти к основному содержимому

Коллбэки

При каждом изменении статуса платежа в систему мерчанта отправляется POST-запрос на адрес notify_url, указанный при создании платежа.

Заголовки запроса

ЗаголовокОписание
Content-Typeapplication/json
X-Webhook-EventТип события. В настоящее время поддерживается payment.status_changed
X-SignatureПодпись тела запроса: HMAC-SHA256 секретным ключом мерчанта, в шестнадцатеричном виде
X-Notification-TokenЗначение notification_token, переданное при создании платежа

Тело запроса

{
"event": "payment.status_changed",
"paymentId": "550e8400-e29b-41d4-a716-446655440000",
"ext_id": "order_12345",
"status": "COMPLETED",
"amount": 5000,
"currency": "RUB",
"timestamp": "2026-01-30T12:22:00Z"
}
ПолеТипОписание
eventstringТип события
paymentIdstringИдентификатор платежа в системе
ext_idstringИдентификатор заказа мерчанта
statusstringНовый статус платежа — см. Статусы
amountnumberСумма платежа
currencystringВалюта суммы
timestampstringВремя события, ISO 8601

Коллбэк отправляется при переходе платежа в статусы COMPLETED, COMPLETED_APPEAL, CANCELLED, CANCELLED_APPEAL и DISPUTE.

Повторные попытки

Уведомление считается доставленным, если сервер мерчанта вернул код состояния 2xx. Время ожидания ответа — 30 секунд.

Если ответ не получен или код состояния отличается от 2xx, отправка повторяется до 3 раз с интервалом 60 секунд между попытками. Обработчик должен корректно обрабатывать повторную доставку одного и того же уведомления: признаком дубликата служит пара ext_id и status.

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

Предусмотрены два способа проверки.

По токену. Значение заголовка X-Notification-Token сравнивается с токеном, переданным при создании платежа. Способ не требует вычислений.

По подписи. Заголовок X-Signature содержит HMAC-SHA256 тела запроса, вычисленный на секретном ключе мерчанта.

const crypto = require('crypto');

app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const expected = crypto.createHmac('sha256', secret).update(req.body).digest('hex');

if (req.headers['x-signature'] !== expected) {
return res.sendStatus(403);
}

const payload = JSON.parse(req.body);
// обработка события
res.sendStatus(200);
});
предупреждение

Платёж считается оплаченным только при статусе COMPLETED или COMPLETED_APPEAL. Статус, полученный в коллбэке, рекомендуется подтверждать запросом GET /v1/payments/{id} перед выдачей товара или услуги.