Документация/Начало/Подпись запросов
Подпись запросов HMAC
Каждый запрос к Client API подписывается HMAC-SHA256 по канонической строке из шести строк.
Заголовки
| Заголовок | Значение |
|---|---|
| X-Access-Key | access_key вашего API-ключа. |
| X-Timestamp | Текущее Unix-время в секундах. Допустимое отклонение — 5 минут. |
| X-Nonce | Новый UUID для каждого запроса, включая ретраи. |
| X-Signature | HMAC-SHA256 канонической строки, lowercase hex. |
| Idempotency-Keyтолько POST | Уникальный ключ бизнес-операции. Не меняется при ретрае. |
Каноническая строка
# ровно 6 строк, без \n в конце
HTTP_METHOD
PATH_WITH_SORTED_QUERY
X_TIMESTAMP
X_NONCE
IDEMPOTENCY_KEY_OR_EMPTY
SHA256_OF_EXACT_RAW_BODY_IN_LOWERCASE_HEX
# подпись
X-Signature = hmac_sha256(secret_key, canonical_string) # lowercase hexЧасто ломается здесь
Подписывайте точные bytes отправляемого body. Для GET — пустой Idempotency-Key и SHA-256 пустого body. Для каждой сетевой попытки — новые timestamp, nonce и подпись. Допустимое расхождение часов — 5 минут.
Проверочный вектор
Фиксированный вектор для отладки реализации: если ваша функция даёт эту же подпись, каноническая строка и хеш тела собраны верно.
secret = test-secret-32-bytes-minimum-0001
body = {"amount_minor":1001,"currency":"EUR","order_id":"order-123"}
body_sha256 = 1be84d4eaa50cc4dc8edcfd73ad5969e406de4ee22405bd6d8f308b7b0dd89e2
signature = 447c9d4d5d413dcffcc16bc45799dbb793fb2fd2fc487547b466417f45ba2944Это тестовое значение, а не ключ
Вектор существует только для проверки алгоритма. Ваш secret_key приходит из кабинета и живёт в secret manager.
Повторы
Повтор запроса — отдельная тема со своими правилами: тело и Idempotency-Key неизменны, а timestamp, nonce и подпись создаются заново. Подробно — на странице идемпотентности и повторов.