Skip to content

Аутентификация

Каждый запрос к Merchant API должен содержать два обязательных заголовка:

ЗаголовокОписание
merchant-idИдентификатор мерчанта (числовая строка)
x-signatureHMAC-SHA256 подпись запроса

Мерчант должен быть в статусе Active, пройти верификацию KYB и подписать сервисное соглашение. Если любое из условий не выполнено, API вернет ошибку 403 Forbidden.

Подпись запросов

Все запросы подписываются с помощью HMAC-SHA256. У мерчанта есть отдельные секретные ключи для разных типов операций (депозиты, выводы).

Алгоритм формирования подписи

  1. Сформировать строку payload в формате:
{merchantId}:{path}:{body}

где:

  • merchantId -- идентификатор мерчанта
  • path -- полный путь запроса (например, /api/v1/deposits)
  • body -- JSON-строка тела запроса с отсортированными по алфавиту ключами
  1. Вычислить HMAC-SHA256 от payload, используя секретный ключ:
signature = HMAC-SHA256(secretKey, payload)
  1. Результат закодировать в HEX.

Пример

merchantId = "12345"
path       = "/api/v1/deposits"
body       = {"amount":"100.00","currency":"RUB","paymentMethod":"card","userId":"user-123"}

Payload (ключи тела отсортированы по алфавиту):

12345:/api/v1/deposits:{"amount":"100.00","currency":"RUB","paymentMethod":"card","userId":"user-123"}

Важно: для GET-запросов тело считается пустым объектом {}.

Пример реализации

javascript
const crypto = require('crypto');

function generateSignature(secretKey, merchantId, path, body) {
  const sortedBody = JSON.stringify(body, Object.keys(body).sort());
  const payload = `${merchantId}:${path}:${sortedBody}`;
  return crypto
    .createHmac('sha256', secretKey)
    .update(payload)
    .digest('hex');
}

// Использование
const signature = generateSignature(
  'your-secret-key',
  '12345',
  '/api/v1/deposits',
  { amount: '100.00', currency: 'RUB', paymentMethod: 'card', userId: 'user-123' }
);
python
import hmac
import hashlib
import json

def generate_signature(secret_key, merchant_id, path, body):
    sorted_body = json.dumps(body, sort_keys=True)
    payload = f"{merchant_id}:{path}:{sorted_body}"
    return hmac.new(
        secret_key.encode(),
        payload.encode(),
        hashlib.sha256
    ).hexdigest()