/api/v1/integration/* (кроме GET /health) должен быть подписан.| Параметр | Где | Комментарий |
|---|---|---|
| API Key | заголовок X-Api-Key | публичный идентификатор ключа |
| API Secret | только на вашем сервере | пароль для HMAC; не в мобильном/фронтенде |
| Подпись | заголовок X-Signature | lowercase hex HMAC-SHA256 |
| Заголовок | Пример | Обязателен |
|---|---|---|
X-Api-Key | mk_... | да |
X-Timestamp | 1710000000 | да (Unix seconds) |
X-Request-Id | UUID | да, уникальный на каждый запрос |
X-Signature-Version | v2 | да |
X-Signature | hex | да |
Content-Type | application/json | для запросов с телом |
Idempotency-Key | свой ключ | для возвратов и части create в v2 |
X-Timestamp принимается в окне примерно ±300 секунд от серверного времени.X-Request-Id нельзя повторять (anti-replay, окно около 10 минут).bodyHash = SHA256(rawBody) → hex./api/v1/integration/transactions).SORT_STRING), для каждого:rawurlencode(key)=rawurlencode(value);json_encode(..., JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES), затем rawurlencode;&.\n:METHOD
path
canonicalQuery
requestId
timestamp
bodyHashMETHOD — в верхнем регистре (POST, GET, …).X-Signature = HMAC_SHA256(apiSecret, canonicalString) → lowercase hexMETHOD = POST
path = /api/v1/integration/transactions
canonicalQuery = # пусто, если query нет
requestId = 550e8400-e29b-41d4-a716-446655440000
timestamp = 1710000000
rawBody = {"amount":10000,"currency":"RUB",...}
bodyHash = sha256(rawBody)
canonical =
POST
/api/v1/integration/transactions
550e8400-e29b-41d4-a716-446655440000
1710000000
<bodyHash>
signature = hmac_sha256_hex(apiSecret, canonical)| Симптом | Что проверить |
|---|---|
| Invalid signature | path с query / другой body / другой порядок JSON / не тот secret |
| Timestamp skew | синхронизация часов сервера (NTP) |
| Request id already used | генерируйте новый X-Request-Id на каждый HTTP-вызов |
| HMAC v2 required | добавьте X-Signature-Version: v2 и X-Request-Id |
X-Api-Key, X-Timestamp, X-SignatureX-Signature-Version и без обязательного X-Request-Id)timestamp
METHOD
path
sha256(rawBody)HMAC_SHA256(apiSecret, canonical) → hex.X-Signature вместе с телом.