Документация/Начало/Подпись запросов

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

Каждый запрос к Client API подписывается HMAC-SHA256 по канонической строке из шести строк.

Заголовки

ЗаголовокЗначение
X-Access-Keyaccess_key вашего API-ключа.
X-TimestampТекущее Unix-время в секундах. Допустимое отклонение — 5 минут.
X-NonceНовый UUID для каждого запроса, включая ретраи.
X-SignatureHMAC-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 и подпись создаются заново. Подробно — на странице идемпотентности и повторов.

Была ли страница полезной?