Обзор
Redirect-интеграция позволяет перенаправить клиента на hosted-страницу оплаты Meridian. Клиент увидит реквизиты, таймер обратного отсчёта и кнопку для открытия банковского приложения (deeplink). После завершения платежа клиент автоматически перенаправляется обратно на ваш сайт.
Поддерживаемые банки: Сбербанк, ВТБ, Т-Банк, Газпромбанк, Солидарность
Поддержка deeplink (открытие банковского приложения)
| Код | Банк | Deeplink |
|---|
1 | ВТБ | ✅ |
2 | Сбербанк | ✅ |
3 | Газпромбанк | ❌ |
4 | Т-Банк | ✅ |
5 | Солидарность | ❌ |
Создание платежа
POST https://api.meridian.vip/api/v1/transgran/redirect-payments
Обязательные параметры
| Параметр | Тип | Описание |
|---|
amount | number | Сумма платежа в рублях (не в копейках). Пример: 1000 = 1000 RUB |
currency | string | Код валюты. Только "RUB" |
bank | number | Предпочтительный банк клиента. См. Коды банков |
internalId | string | Уникальный идентификатор заказа в вашей системе (ключ идемпотентности) |
customerEmail | string | Email клиента |
notificationUrl | string | URL для webhook-уведомлений |
notificationToken | string | Секретный токен для подписи webhook-уведомлений |
successUrl | string | URL для перенаправления при успешной оплате |
cancelUrl | string | URL для перенаправления при отмене |
errorUrl | string | URL для перенаправления при ошибке/истечении |
Пример запроса
const crypto = require('crypto');
function calculateSignature(method, url, body, secret) {
const stringToSign = method + url + (body || '');
const hmac = crypto.createHmac('sha256', secret);
hmac.update(stringToSign);
return hmac.digest('base64');
}
const method = 'POST';
const url = 'https://api.meridian.vip/api/v1/transgran/redirect-payments';
const body = JSON.stringify({
amount: 1000,
currency: 'RUB',
bank: 2, // Sberbank
internalId: 'order-12345',
customerEmail: '[email protected]',
notificationUrl: 'https://your-site.com/webhooks/transgran',
notificationToken: 'your-webhook-secret-token',
successUrl: 'https://your-site.com/payment/success',
cancelUrl: 'https://your-site.com/payment/cancel',
errorUrl: 'https://your-site.com/payment/error'
});
const apiKey = 'meridian_abc123...:meridian_xyz789...';
const [keyId, secret] = apiKey.split(':');
const signature = calculateSignature(method, url, body, secret);
const response = await fetch(url, {
method,
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey,
'X-Signature': signature
},
body
});
const result = await response.json();
// Перенаправьте клиента на страницу оплаты
console.log('Redirect URL:', result.paymentUrl);
// → "https://securepaymer.com/pay/aB3xK9mN..."
Пример ответа (успех)
HTTP Status: 201 Created
{
"id": "cm3k8x7y80001z8j4k5m6n7o8",
"status": "new",
"bankName": "sberbank",
"amount": "1000",
"currency": "RUB",
"expireAt": "2025-11-03T15:10:00.000Z",
"dealRequisites": "{\"bankName\":\"garant_bank\",\"cardNumber\":\"**** 1234\",\"fullName\":\"Ivan Ivanov\"}",
"dealRate": "95.50",
"createdAt": "2025-11-03T15:00:00.000Z",
"updatedAt": "2025-11-03T15:00:00.000Z",
"internalId": "order-12345",
"merchantName": "MerchantName",
"clientEmail": "[email protected]",
"paymentUrl": "https://securepaymer.com/pay/aB3xK9mNpQ7rS2tU4vW6xY8z"
}
Важно: Поле paymentUrl — это ссылка для перенаправления клиента. Токен в URL является единственным способом авторизации на странице оплаты. Не передавайте его третьим лицам.
Поля ответа
| Поле | Тип | Описание |
|---|
id | string | Уникальный идентификатор платежа в системе Meridian |
status | string | Статус: new, processing, paid, expired, failed |
bankName | string | Запрошенный банк из параметра bank. Не является банком назначения — см. dealRequisites |
amount | string | Сумма платежа |
currency | string | Валюта (RUB) |
expireAt | string | Время истечения платежа. ISO 8601 |
dealRequisites | string | JSON-строка с реквизитами. См. Структура dealRequisites |
dealRate | string | Курс сделки |
createdAt | string | Время создания платежа. ISO 8601 |
updatedAt | string | Время последнего обновления. ISO 8601 |
internalId | string | Ваш идентификатор заказа |
merchantName | string | Название мерчанта |
clientEmail | string | Email клиента |
paymentUrl | string | URL для перенаправления клиента на hosted-страницу оплаты |
Структура dealRequisites
Поле dealRequisites содержит JSON-строку с реквизитами, куда клиент должен отправить платёж.
Важно: Поле bankName в ответе — это запрошенный банк. Фактический банк назначения находится в dealRequisites.bankName.
| Поле | Тип | Описание |
|---|
bankName | string | Банк назначения |
cardNumber | string | Номер карты (может быть частично скрыт) |
fullName | string | ФИО получателя |
phoneNumber | string | Номер телефона (для СБП-переводов, опционально) |
Проверка статуса
GET https://api.meridian.vip/api/v1/transgran/payments/:id
Используется тот же endpoint, что и для H2H интеграции.
Пример запроса
const method = 'GET';
const paymentId = 'cm3k8x7y80001z8j4k5m6n7o8';
const url = `https://api.meridian.vip/api/v1/transgran/payments/${paymentId}`;
const signature = calculateSignature(method, url, '', secret);
const response = await fetch(url, {
method,
headers: {
'X-API-Key': apiKey,
'X-Signature': signature
}
});
const payment = await response.json();
console.log('Status:', payment.status);
Webhook-уведомления
Webhook-уведомления работают идентично H2H интеграции. При изменении статуса платежа система отправляет POST-запрос на указанный notificationUrl.
Формат и верификация
См. полную документацию в разделе Трансграничные платежи — Webhook.
Создание апелляции
Если клиент оплатил, но статус не изменился, создайте апелляцию. Процесс идентичен H2H интеграции.
POST https://api.meridian.vip/api/v1/transgran/payments/:id/disputes