Перейти к содержанию

Формирование ключа для ЭЦП

  1. Мерчант на своей стороне генерирует ключ:

    $ openssl genrsa -out privatekey.pem 4096
    

  2. Получает от ключа публичную часть:

    $ openssl rsa -in privatekey.pem -pubout -out publickey.pem
    

  3. Публичную часть ключа необходимо отправить в тех-поддержку, которая загружает содержимое в систему. После чего уже происходит проверка подписи мерчанта X-Sign при запросе. Все параметры запроса должны быть отсортированы по ключам.

Примеры

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import json
import base64
import requests
import collections

from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5

params = {
    "api_key": "e467511f-e0c64ae5-b9ec-ebbe0b4dbbee",
    "transaction": "f4462ba637c54455-b0b253b179f7a25c",
    "signature": "675e785dcf5b77a27e3fad0353078b078f5c6f1bdaaba4b150bd339b832cda5d",
    "amount": 512000,
    "payer_fio": "Иван Иванов Иванович",
    "payer_phone": "79999999123",
    "recipient_pan": "5555555555555599"
}

# сортировка по ключам параметров
o_params = collections.OrderedDict(sorted(params.items()))

data = json.dumps(o_params)
crypto_key = 'oLNzC#tP2LO3h$kc@j$U'
key = RSA.importKey(open('privatekey.pem').read())
digest = SHA256.new('{}{}'.format(data, crypto_key).encode('utf8'))
signer = PKCS1_v1_5.new(key)
signature = signer.sign(digest)

x_sign = base64.b64encode(signature)

response = requests.post(
    'https://b2b.rubikonpay.ru/api/v1/payments/account2card',
    data=data,
    headers={
        'Content-Type': 'application/json; charset=UTF8',
        'X-Sign': x_sign
    }
)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$params = [
 "api_key" "e467511f-e0c64ae5-b9ec-ebbe0b4dbbee",
 "transaction" "f4462ba637c54455-b0b253b179f7a25c",
 "signature" "675e785dcf5b77a27e3fad0353078b078f5c6f1bdaaba4b150bd339b832cda5d",
 "amount": 512000,
 "payer_fio" "Иван Иванов Иванович",
 "payer_phone" "79999999123",
 "recipient_pan" "5555555555555599"
];

// сортировка по ключам параметров
ksort($params);

$data = json_encode($params);
$crypto_key = 'oLNzC#tP2LO3h$kc@j$U';
$digest = $data . $crypto_key;

$key = openssl_pkey_get_private(file_get_contents('privatekey.pem'));

$signature = "";

openssl_sign($digest, $signature, $key, "sha256WithRSAEncryption");

$x_sign = base64_encode($signature);

print("X-Sign: " . $x_sign . "\n");

Пример ответов:

1
2
3
4
5
6
7
8
9
{
    "transaction": "ae8afc3e-b081401a-9dde-5c618de21be3",
    "payment": {
        "id": 98625,
        "state": "processing",
        "error_description": null,
        "created_at": "20210223T120025.822792Z"
    }
}
1
2
3
4
5
6
7
{
    "errors": {
        "transaction": [
            "Обязательное поле."
        ]
    }
}
1
2
3
{
    "message": "Hеизвестная ошибка."
}

Параметры успешного ответа:

Параметр Описание
transaction Идентификатор транзакции мерчанта. Формат UUID.
payment.id ID платежа в системе.
payment.state Статус платежа. Список статусов платежа:
processing — в обработке
declined — отклонен
deposited — оплачен
Если статус платежа был получен processing, то необходимо вызывать метод получения статуса платежа п.2. Данный метод рекомендуется вызывать через каждые 5 минут для получения окончательного статуса платежа. Если платеж спустя 24 часа висит "в обработке", то необходимо обратиться к менеджеру.
payment.error_description Описание ошибки.
payment.created_at Дата создания платежа.