Getting Started

Ключи для Payin

Как сгенерировать ed25519-ключ и подписать тело запроса. Используется в Payin Classic и Payin H2H.

Ключи для Payin

Эта схема подписи применяется только к Payin Classic и Payin H2H. Для Payout используется другая схема — см. Ключи для Payout.

Все запросы и ответы Payin подписываются по алгоритму ed25519 (RFC 8032). Библиотеки для ed25519 есть практически во всех языках.

Примеры на этой странице используют имена заголовков Payin Classic — Key-Id и Signature. В Payin H2H те же значения передаются в заголовках X-KeyId и X-Signature. Алгоритм подписи, формат ключей и порядок проверки полностью идентичны — отличается только название заголовков.

Как считается подпись

  • Для HTTP POST — подпись вычисляется из тела запроса (request body).
  • Для WebSocket — подпись вычисляется от значения поля body сообщения.

Результат кодируется в Base64 и передаётся:

  • в HTTP — в заголовке Signature (Payin Classic) или X-Signature (Payin H2H);
  • в WebSocket — в поле Signature сообщения.

Вместе с подписью передаётся идентификатор публичного ключа: Key-Id (Payin Classic) или X-KeyId (Payin H2H). Значение фиксированное и выдаётся вручную до начала работы.

Разные пары ключей для запросов и ответов

Ответы сервера тоже подписаны — но другой парой ключей. Не путайте направления.
НаправлениеПриватный ключПубличный ключ
Клиент → сервер (ваши запросы)у клиентау сервера (вы передаёте его нам вручную)
Сервер → клиент (наши ответы)у серверау клиента (мы передаём его вам вручную)

Все ключи и подписи ходят в Base64.

Генерация ключей

<?php
$sign_seed   = random_bytes(SODIUM_CRYPTO_SIGN_SEEDBYTES);
$sign_pair   = sodium_crypto_sign_seed_keypair($sign_seed);
$sign_secret = sodium_crypto_sign_secretkey($sign_pair);
$sign_public = sodium_crypto_sign_publickey($sign_pair);

file_put_contents('./private.key', $sign_secret);

$sign_public_base64 = base64_encode($sign_public);
file_put_contents('./public.key', $sign_public_base64);
Не используйте openssl для генерации ed25519-ключей — утилита добавляет в файл служебные байты, которые сломают подпись.

Формирование подписи

$sign_secret = file_get_contents('./private.key', true);

$message   = '{"Id":"1643731972","Kind":"BankCard","Currency":"RUB","Sum100":10000}';
$signature = sodium_crypto_sign_detached($message, $sign_secret);
$signature_base64 = base64_encode($signature);

// $signature_base64 -> заголовок "Signature"
// $message          -> тело HTTP-запроса

Проверка ответа

Сервер присылает заголовки Key-Id и Signature (в Payin H2H — X-KeyId и X-Signature). Декодируйте подпись из Base64 и проверьте её для тела ответа нашим публичным ключом (который вы получили вручную).

Copyright © 2026