Совершение выплаты
Метод проведения выплаты на карту.
URL
Метод: POST
- Production:
https://api.pay.kvell.group/v1/orders/account2card - Stage:
https://api.pay.stage.kvell.group/v1/orders/account2card
Параметры запроса
Название |
Тип данных | Обязательно | Описание |
|---|---|---|---|
amount |
integer | Да | Сумма в копейках |
recipient_pan |
string | Да | PAN карты получателя |
description |
string | Да | Описание к транзакции |
transaction |
string | Да | Уникальный номер транзакции на стороне мерчанта |
customer |
string | Нет | Email / телефон клиента |
extra_data |
json | Нет | Дополнительные данные |
fiscal_data |
json | Нет | Фискализация чека по Ф3-54 |
Пример запроса
{
"recipient_pan": "4111111111111111",
"amount": 100,
"transaction": "344frge530jm",
"description": "Выплата",
"customer": "user@user.com"
}
Заголовки запроса
| Название | Тип данных | Обязательно | Описание |
|---|---|---|---|
X-Api-Key |
string | Да | Уникальный идентификатор магазина |
X-Signature |
string | Да | Подпись |
Формирование подписи
При формировании запроса необходимо использовать ЭЦП. Используется алгоритм RSA/SHA256.
Данное сообщение необходимо передавать в заголовке HTTP запроса в параметре X-Signature.
Ключ для ЭЦП
- Мерчант на своей стороне генерирует ключ:
- Получает от ключа публичную часть:
- Публичную часть ключа необходимо отправить в тех-поддержку, которая загружает
содержимое в систему. проверка подписи мерчанта
X-signatureпроисходит при запросе. Все параметры запроса должны быть отсортированы по ключам.
Примеры кода
import base64
import json
import requests
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
x_api_key = '7d1f800c-ec7d-4597-a65f-cd7896934b5a'
secret_key = 'ddee181d-f8e8-4f3f-90bf-1d7e8f122d9a'
params = {
"recipient_pan": "4111111111111111",
"amount": 10000,
"transaction": "f4462ba6-37c5-4455-b0b2-53b179f7a25c",
"description": "test_transaction_1",
"customer": "test@test.com"
}
# сортировка по ключам параметров
data = json.dumps(params, separators=(',', ':'), sort_keys=True)
key = RSA.importKey(open('privatekey.pem').read())
digest = SHA256.new('{}{}'.format(data, secret_key).encode('utf8'))
signer = PKCS1_v1_5.new(key)
signature = signer.sign(digest)
x_signature = base64.b64encode(signature)
response = requests.post(
'https://api.host/v1/orders/account2card',
data=data,
headers={
'Content-Type': 'application/json; charset=UTF-8',
'x-api-key': x_api_key,
'x-signature': x_signature,
}
)
<?php
function recursive_ksort( &$array) {
foreach($array as & $value) {
if (is_array($value)) recursive_ksort($value);
}
return ksort($array);
}
$secret_key = 'ddee181d-f8e8-4f3f-90bf-1d7e8f122d9a';
$params = [
"recipient_pan" = > "4111111111111111"
"amount" = > 10000,
"transaction" = > "f4462ba6-37c5-4455-b0b2-53b179f7a25c",
"description" = > "test_transaction_1",
"customer" = > "test@test.com"
];
// сортировка по ключам параметров
recursive_ksort($params);
$data = json_encode($params);
$digest = $data. $secret_key;
$key = openssl_pkey_get_private(file_get_contents('privatekey.pem'));
$signature = "";
openssl_sign($digest, $signature, $key, "sha256WithRSAEncryption");
$x_signature = base64_encode($signature);
print("x-signature: " . $x_signature . "\n");
?>
Пример на openssl
Подпись для запроса на выплату можно сформировать с помощью команды openssl
openssl dgst -sha256 -sign /path/to/private_key.pem /path/to/data_to_be_signed | base64 | tr -d '\n'
Где:
/path/to/private_key.pem- полный путь к файлу приватного ключа/path/to/data_to_be_signed- полный путь к файлу с данными, которые требуется подписать, т.е. в файле будет тело POST-запроса с прибавленным секретным ключом (secret_key).
Содержание файла с данными для подписи data_to_be_signed:
{"amount":100,"customer":"123","description":"test","recipient_pan":"4111111111111111","transaction":"4faf68bf-d484-40a0-968e-db867e1fd41d"}ef6710b3-b9dc-47ab-9f64-71a002e26a91
Пример сформированной подписи:
i/4LlP2lh5gr8vgKaWjvXZtlgIEpNvyWvbfv3U7XbZNw/F+hHvlDIMO7UlFd5hranniT8APE+RF5tS5dhOIfZ/Ks7GurvnTz6ZcfplOVKen4LeEXRzgA8pDsBj78aPOOoyy8wWl3AgsuqFEI+xu5V/XLIYVgMocCgn5YSg6bfuFW3SAdcj5sGpwg8v9YJ7uf6Kze7ScXuMViE7e+NCK0Qtzr5ZmOOHg2f/QKfnLzOLhro0lK+Ma5yBJWy/0Udv4l53xbsgVwROsm6WfXJRgMUsFpGVGTLytezDUnclIkJam7l9auUYkmI2yPiXtT2RnMZynAsh1zcVTuJC3hyeuKNAUm93qOwossSAjKMW1p48Ecy9vOd66FHvErgYWGXCZL2IhWHNwA1QsM+9t7KqrsRROeFgIs/lw6UwKUmrQlGftbZOsJx/0Jlr8A2jf5bNoiVyUlyz9PNFJkTqH1l5usAt/egf6M/uOmyKk1L9VV+uet7W+2vYbAqhTVgWmUyonuIBM4xTU6wzGCW1uQL+XzjTm8YORZOhBZwYa4qX+PWqPA45eULqkFG+cA7MLFZEWVZwswEsmpMCkuHaf4T3/jGmE1slrUONj8RxXUS200olFUk6buS1ymn1+KyeNEbETKRRuJeKLe5MSE5wR96CPhXJ1Lu5081+UdF5M46RPnhDk=
Ответ запроса
Пример ответа
- Если получен ответ со статусом
5XX, транзакцию необходимо оставить в обработке и отправить запрос на метод получения статуса транзакции. - Данные ошибки могут возникнуть по различным причинам: на стороне взаимодействия сети, технических сбоев сервера или ПО.
- В случае повторного возникновения данной проблемы рекомендуется обратиться в службу поддержки.
В ответ приходит объект order, который служит получением статуса выплаты и параметр order.status.
Если выплаты на карту настроены с помощью подтверждения через OTP-код, то ответ будет следующим:
Параметры ответа
| Название | Тип данных | Описание |
|---|---|---|
id |
string | ID платежа в системе |
amount |
integer | Сумма в копейках |
status |
string | Статус транзакции |
description |
string | Описание к транзакции |
transaction |
string | Уникальный номер транзакции на стороне мерчанта |
created_at |
string | Дата создания транзакции |
commission |
string | Комиссия в копейках |
Список статусов
| Название | Описание |
|---|---|
new |
Новая транзакция |
processing |
Транзакция обрабатывается |
canceled |
Транзакция отклонена |
completed |
Транзакция выполнена |