Коллбэки
При каждом изменении статуса платежа в систему мерчанта отправляется POST-запрос
на адрес notify_url, указанный при создании платежа.
Заголовки запроса
| Заголовок | Описание |
|---|---|
Content-Type | application/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"
}
| Поле | Тип | Описание |
|---|---|---|
event | string | Тип события |
paymentId | string | Идентификатор платежа в системе |
ext_id | string | Идентификатор заказа мерчанта |
status | string | Новый статус платежа — см. Статусы |
amount | number | Сумма платежа |
currency | string | Валюта суммы |
timestamp | string | Время события, 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} перед выдачей товара или услуги.