Выплата на банковскую карту с PCI DSS
Этот сценарий описывает отправку выплаты на банковскую карту, если вы можете получать и хранить данные банковских карт на своей стороне (у вас есть сертификат PCI DSS).
В этом случае у вас есть два варианта:
- создать платежную сессию и отправить выплату одним запросом;
- сначала создать платежную сессию, а потом отправить выплату.
Здесь описан только один вариант — с отдельным созданием сессии.
Выплата на карту с отдельным созданием сессии
Шаг 1. Создайте платежную сессию
Отправьте запрос на создание сессии session/create
. В ответе придет
идентификатор платежной сессии. Подробнее о платежной сессии
В заголовках запроса следует передать идентификатор вашего проекта и подпись запроса. Подробнее о формате запросов
Пример создания сессии
- cURL
- PHP
curl -X POST \
https://demo.bank131.ru/api/v1/session/create \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"metadata": "order123"
}'
use Bank131\SDK\API\Request\Builder\RequestBuilderFactory;
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$request = RequestBuilderFactory::create()
->createPayoutSession()
->setMetadata('order123')
->build();
$response = $client->session()->create($request);
Шаг 2. Начните выплату
Отправьте запрос на проведение выплаты с помощью метода session/start/payout
(этот метод подходит, если сессия уже была создана). В параметре session_id
передайте идентификатор сессии, созданной на первом шаге. В параметре
type
объекта payment_method
передайте значение card
. В объекте bank_card
передайте данные банковской карты получателя.
Если вы отправляете деньги на карту российского банка, вам понадобится:
- номер карты;
- имя получателя;
- сумма в копейках (чтобы передать 100 рублей, в поле
amount_details.amount
укажите10000
).
Посмотреть параметры для выплаты на российские карты
Пример запроса
- cURL
- PHP
curl -X POST \
https://demo.bank131.ru/api/v1/session/start/payout \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id": "ps_3230",
"payment_method": {
"type": "card",
"card": {
"type": "bank_card",
"bank_card": {
"number": "4242424242424242"
}
}
},
"participant_details": {
"recipient": {
"full_name": "Иванов Иван Иванович"
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"metadata": "good"
}'
use Bank131\SDK\API\Request\Builder\RequestBuilderFactory;
use Bank131\SDK\Client;
use Bank131\SDK\Config;
use Bank131\SDK\DTO\Card\BankCard;
use Bank131\SDK\DTO\Participant;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$participant = new Participant();
$participant->setFullName('Иванов Иван Иванович');
$request = RequestBuilderFactory::create()
->startPayoutSession('3230')
->setCard(new BankCard('4242424242424242'))
->setRecipient($participant)
->setAmount(1000, 'rub')
->setMetadata('good')
->build();
$response = $client->session()->startPayout($request);
Шаг 3. Дождитесь уведомления о готовности сделать выплату
Банк 131 отправит вам вебхук
ready_to_confirm
(на адрес
для вебхуков, который вы заранее передали менеджеру Банка). Это значит,
что выплату можно провести и Банк ждет вашего подтверждения (или отмены).
В теле вебхука придут все данные для выплаты.
В ответ следует отдавать HTTP-код 200.
Пример вебхука
curl -X POST \
https://partner.ru \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"type": "ready_to_confirm",
"session": {
"id": "ps_3230",
"status": "in_progress",
"created_at": "2018-05-27T02:03:00.000000Z",
"updated_at": "2018-05-27T02:03:00.000000Z",
"next_action": "confirm",
"payments": [
{
"id": "po_2018",
"status": "pending",
"created_at": "2018-05-27T02:03:00.000000Z",
"customer": {
"reference": "user123",
"contacts": [
{
"email": "user@gmail.com"
}
]
},
"payment_method": {
"type": "card",
"card": {
"last4": "4242",
"brand": "visa"
}
},
"amount_details": {
"amount": 10000,
"currency": "rub"
},
"metadata": "good"
}
]
}
}'
Пример обработки вебхука с помощью SDK
use Bank131\SDK\Client;
use Bank131\SDK\Config;
use Bank131\SDK\Services\WebHook\Hook\WebHookTypeEnum;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem'),
file_get_contents('/path/to/bank131/public_key.pem')
);
$client = new Client($config);
$hook = $client->handleWebHook('sign from headers', 'request body');
if ($hook->getType() === WebHookTypeEnum::READY_TO_CONFIRM) {
$session = $hook->getSession();
//do your logic here
}
Шаг 4. Подтвердите или отмените выплату
Проверьте данные для выплаты и подтвердите, что готовы её провести (с помощью
запроса session/confirm
) или отмените (отправьте запрос session/cancel
).
Пример запроса session/confirm
- cURL
- PHP
curl -X POST \
https://demo.bank131.ru/api/v1/session/confirm \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id": "ps_3230"
}'
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$response = $client->session()->confirm('session_id');
Пример запроса session/cancel
- cURL
- PHP
curl -X POST \
https://demo.bank131.ru/api/v1/session/cancel \
-H 'Content-Type: application/json' \
-H 'X-PARTNER-PROJECT: your_project_name' \
-H 'X-PARTNER-SIGN: signature' \
-d '{
"session_id": "ps_3230"
}'
use Bank131\SDK\Client;
use Bank131\SDK\Config;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem')
);
$client = new Client($config);
$response = $client->session()->cancel('session_id');
Шаг 5. Дождитесь уведомления о результате выплаты
Банк 131 отправит вам вебхук payment_finished
.
В теле вебхука придут все данные, с которыми
проводилась выплата. Результат выплаты приходит в поле payment.status
.
Если статус succeeded
, значит, выплата прошла успешно.
Если статус failed
— выплата не прошла из-за ошибки.
Пример обработки вебхука с помощью SDK
use Bank131\SDK\Client;
use Bank131\SDK\Config;
use Bank131\SDK\Services\WebHook\Hook\WebHookTypeEnum;
$config = new Config(
'https://demo.bank131.ru',
'your_project_name',
file_get_contents('/path/to/your/private_key.pem'),
file_get_contents('/path/to/bank131/public_key.pem')
);
$client = new Client($config);
$hook = $client->handleWebHook('sign from headers', 'request body');
if ($hook->getType() === WebHookTypeEnum::PAYMENT_FINISHED) {
$session = $hook->getSession();
//do your logic here
}