Getting Started

Ключи для Payin

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

Ключи для Payin

Эта схема подписи применяется только к Payin Classic и Payin H2H.

Все запросы и ответы 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.

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

Ключи вы генерируете у себя — приватный ключ никогда не покидает вашу инфраструктуру.

Никогда не генерируйте ключи в онлайн-песочницах — Go Playground и аналоги кэшируют результат по исходному коду. Один и тот же сниппет возвращает всем один и тот же приватный ключ, и подписи под вашими запросами сможет подделать любой, кто запустил тот же код. Запускайте генератор только у себя.

Скрипт ниже создаёт в текущей папке два файла:

ФайлЧто внутриЧто с ним делать
private.keyприватный ключ ed25519 (64 байта) в Base64хранить у себя, права 600, никому не передавать
public.keyпубличный ключ ed25519 (32 байта) в Base64передать нам до начала работы

Содержимое private.key — это ровно та Base64-строка, которую ждёт конфиг SDK, а public.key — то, что вы присылаете нам.

Прямо здесь, в браузере

Скачаются private.key и public.key

Ключи создаёт ваш браузер, наружу они не уходят. Страницу можно сохранить и открыть без интернета.

Скриптом

Если генерировать ключи в браузере нельзя по вашим правилам безопасности — тот же результат даёт короткий скрипт. Он перезапишет существующие private.key и public.key без предупреждения, поэтому запускайте его в пустой папке.

// сохраните как main.go и запустите: go run main.go
package main

import (
    "crypto/ed25519"
    "crypto/rand"
    "encoding/base64"
    "os"
)

func main() {
    pub, priv, err := ed25519.GenerateKey(rand.Reader)
    if err != nil {
        panic(err)
    }

    if err := os.WriteFile("private.key", []byte(base64.StdEncoding.EncodeToString(priv)), 0o600); err != nil {
        panic(err)
    }

    if err := os.WriteFile("public.key", []byte(base64.StdEncoding.EncodeToString(pub)), 0o644); err != nil {
        panic(err)
    }
}
Не используйте openssl для генерации ed25519-ключей — утилита добавляет в файл служебные байты, которые сломают подпись.

Через SDK

Те же два файла создаёт готовый скрипт из SDK. В отличие от скриптов выше он остановится и ничего не перезапишет, если private.key или public.key уже существует:

go run examples/generate_keys/main.go

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

Подпись считается тем самым приватным ключом, который лежит в private.key — файл содержит Base64, поэтому перед использованием его нужно раскодировать.

$sign_secret = base64_decode(trim(file_get_contents('./private.key')));

$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