Appearance
Аутентификация
Каждый запрос к Merchant API должен содержать два обязательных заголовка:
| Заголовок | Описание |
|---|---|
merchant-id | Идентификатор мерчанта (числовая строка) |
x-signature | HMAC-SHA256 подпись запроса |
Мерчант должен быть в статусе Active, пройти верификацию KYB и подписать сервисное соглашение. Если любое из условий не выполнено, API вернет ошибку 403 Forbidden.
Подпись запросов
Все запросы подписываются с помощью HMAC-SHA256. У мерчанта есть отдельные секретные ключи для разных типов операций (депозиты, выводы).
Алгоритм формирования подписи
- Сформировать строку
payloadв формате:
{merchantId}:{path}:{body}где:
merchantId-- идентификатор мерчантаpath-- полный путь запроса (например,/api/v1/deposits)body-- JSON-строка тела запроса с отсортированными по алфавиту ключами
- Вычислить HMAC-SHA256 от
payload, используя секретный ключ:
signature = HMAC-SHA256(secretKey, payload)- Результат закодировать в 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()