Smerch — API интеграции для мерчантов
    • Быстрый старт
    • Возвраты
    • Песочница, ошибки и go-live
    • Вебхуки (исходящие колбэки)
    • Авторизация и HMAC
    • Балансы и курсы
    • Платежи
    • Выводы (выплаты)
    • Авторизация
      • Проверить, что API отвечает
        GET
    • Балансы
      • Посмотреть балансы
        GET
    • Выводы
      • Создать вывод средств
        POST
      • Посчитать вывод без списания
        GET
      • Получить вывод по UUID
        GET
    • Возвраты
      • Сделать возврат по платежу
        POST
    • Песочница
      • Песочница: симулировать отказ оплаты
        POST
      • Песочница: отказ, затем запоздавшая оплата
        POST
      • Песочница: симулировать успешную оплату
        POST
      • Песочница: симулировать истечение платежа
        POST
    • Платежи
      • Список платежей
        GET
      • Создать платёж
        POST
      • Найти платёж по вашему external_id
        GET
      • Получить платёж по UUID
        GET
    • Вебхуки
      • Посмотреть настройки webhook
        GET
      • Задать URL для колбэков
        PUT
      • Журнал доставок webhook
        GET
      • Сменить secret подписи webhook
        POST
      • Отправить тестовый колбэк
        POST
      • Событие: изменился статус платежа
      • Событие: изменился статус вывода
    • Balances
      • Service method
    • Payments
      • Service method
    • Schemas
      • CreatePayoutRequest
      • CreateRefundRequest
      • CreateTransactionRequest
      • CursorMeta
      • ErrorResponse
      • HealthResponse
      • IntegrationBalancesResponse
      • MerchantBalance
      • MerchantPayoutCallback
      • MerchantTransactionCallback
      • PayoutQuoteResponse
      • PayoutResponse
      • RatesResponse
      • RefundResponse
      • StructuredError
      • TransactionResponse
      • TransactionCursorPage
      • ValidationErrorResponse

    Авторизация и HMAC

    Каждый запрос к /api/v1/integration/* (кроме GET /health) должен быть подписан.

    Что нужно#

    ПараметрГдеКомментарий
    API Keyзаголовок X-Api-Keyпубличный идентификатор ключа
    API Secretтолько на вашем серверепароль для HMAC; не в мобильном/фронтенде
    Подписьзаголовок X-Signaturelowercase hex HMAC-SHA256
    Рекомендуемый режим: HMAC v2.

    HMAC v2 (рекомендуется)#

    Заголовки#

    ЗаголовокПримерОбязателен
    X-Api-Keymk_...да
    X-Timestamp1710000000да (Unix seconds)
    X-Request-IdUUIDда, уникальный на каждый запрос
    X-Signature-Versionv2да
    X-Signaturehexда
    Content-Typeapplication/jsonдля запросов с телом
    Idempotency-Keyсвой ключдля возвратов и части create в v2
    X-Timestamp принимается в окне примерно ±300 секунд от серверного времени.
    X-Request-Id нельзя повторять (anti-replay, окно около 10 минут).

    Как собрать подпись#

    1.
    Возьмите сырое тело запроса ровно как отправите (для GET/HEAD тело = пустая строка).
    2.
    Посчитайте bodyHash = SHA256(rawBody) → hex.
    3.
    Соберите path как path info без query (например /api/v1/integration/transactions).
    4.
    Соберите canonical query:
    нет query → пустая строка;
    иначе отсортируйте ключи (SORT_STRING), для каждого:
    скаляр: rawurlencode(key)=rawurlencode(value);
    массив: value = json_encode(..., JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES), затем rawurlencode;
    склейте через &.
    5.
    Соберите canonical string из шести строк, разделённых \n:
    METHOD
    path
    canonicalQuery
    requestId
    timestamp
    bodyHash
    METHOD — в верхнем регистре (POST, GET, …).
    6.
    Подпись:
    X-Signature = HMAC_SHA256(apiSecret, canonicalString)  → lowercase hex

    Пример (псевдокод)#

    METHOD = 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)

    Частые ошибки 401#

    СимптомЧто проверить
    Invalid signaturepath с 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

    HMAC v1 (устаревший)#

    Использовать только если платформа явно ещё принимает v1 для вашего ключа.
    В production часто включено требование v2.

    Заголовки#

    X-Api-Key, X-Timestamp, X-Signature
    (без X-Signature-Version и без обязательного X-Request-Id)

    Canonical string (4 строки)#

    timestamp
    METHOD
    path
    sha256(rawBody)
    Подпись: HMAC_SHA256(apiSecret, canonical) → hex.

    Практика безопасности#

    Храните secret только на backend (KMS / secrets manager / env).
    Не логируйте secret и полный X-Signature вместе с телом.
    Ротируйте ключи при утечке.
    Для мерчанта может быть включён IP allowlist — добавляйте egress IP ваших серверов.
    Modified at 2026-07-23 06:43:53
    Previous
    Вебхуки (исходящие колбэки)
    Next
    Балансы и курсы
    Built with