Payment with saved card
Оплата по сохраненной карте с вводом CVC
Создание заказа
В системе ioka у мерчанта есть возможность создать заказ для оплаты по сохраненной карте с предзаполненными карточными данными (PAN, срок действия карты), но с подтверждением CVC. Для этого при создании заказа необходимо передавать:
- amount (сумму) необходимо указывать в минорных денежных единицах, т.е. для создания заказа на сумму 500 тенге, необходимо ввести 50000 (1 тенге = 100 тиын)
- customer_id - идентификатор плательщика, полученный при создании плательщика или при оплате заказа с сохранением карточных данных
- card_id - идентификатор сохраненной карты, привязанной к данному плательщику. Может быть получен при сохранении карты или при оплате заказа с сохранением карточных данных
Пример запроса:
- HTTP
- cURL
- Python
- PHP
POST /v2/orders HTTP/1.1
Host: stage-api.ioka.kz
API-KEY: eyJ0eXAiOiJKV1..
Content-Type: application/json
{
"amount": 50000,
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK"
}
curl --location --request POST 'https://stage-api.ioka.kz/v2/orders' \
--header 'API-KEY: eyJ0eXAiOiJKV1..' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 50000,
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK"
}'
import requests
import json
url = "https://stage-api.ioka.kz/v2/orders"
payload = json.dumps({
"amount": 50000,
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK"
})
headers = {
'API-KEY': 'eyJ0eXAiOiJKV1..',
'Content-Type': 'application/json'
}
response = requests.post(url, headers=headers, data=payload)
order = response.json()['order']
print(order['checkout_url'])
<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://stage-api.ioka.kz/v2/orders');
$request->setRequestMethod('POST');
$body = new http\Message\Body;
$body->append('{
"amount": 50000,
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK"
}');
$request->setBody($body);
$request->setOptions(array());
$request->setHeaders(array(
'API-KEY' => 'eyJ0eXAiOiJKV..',
'Content-Type' => 'application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
Пример ответа:
{
"order": {
"id": "ord_test",
"shop_id": "shp_test",
"status": "UNPAID",
"created_at": "2022-01-01T10:00:00.00000",
"amount": 50000,
"display_amount": 50000,
"currency": "KZT",
"mcc": null,
"acquirer": null,
"capture_method": "AUTO",
"external_id": null,
"description": null,
"extra_info": null,
"attempts": 10,
"due_date": null,
"split": null,
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK",
"back_url": null,
"success_url": null,
"failure_url": null,
"template": null,
"access_token": "ord_QNQcGTrfEV_secret_502253104a5f360e68834b827057b60181e5f5a149635e18cf28e5dfc7d71e98",
"checkout_url": "https://test.ioka.kz/orders/ord_test",
"payment_link_url": null,
"payments": []
},
"order_access_token": "ord_QNQcGTrfEV_secret_502253104a5f360e68834b827057b60181e5f5a149635e18cf28e5dfc7d71e98"
}
Проведение платежа
Для проведения оплаты необходимо перенаправить пользователя на адрес checkout_url, полученный в теле ответа на создание заказа, где находится платежная форма с предзаполненными PAN и сроком действия карты.
Для завершения оплаты клиенту необходимо ввести CVC и в случае наличии двухэтапной аутентификации пройти 3DS проверку.
Вы можете проверить статус платежа, используя те же методы, что и при оплате по полным карточными данным.
Оплата по сохраненной карте без участия плательщика
У мерчанта при использовании данного способа есть возможность произвести платеж по ранее сохраненной платежной карте без подтверждения операции пользователем (ввод CVV/CVC или прохождение 3-D Secure).
Для этого необходимо:
- Создать заказ на оплату
- Создать платеж по
order_id
Пример запроса:
- HTTP
- cURL
- Python
- PHP
POST /v2/orders/{{order_id}}/payments/card HTTP/1.1
Host: stage-api.ioka.kz
Content-Type: application/json
{
"card_id": "t3i2tPViLK"
}
curl --location --request POST 'https://stage-api.ioka.kz/v2/orders/{{order_id}}/payments/card' \
--header 'Content-Type: application/json' \
--data-raw '{
"card_id": "t3i2tPViLK"
}'
import requests
import json
url = "https://stage-api.ioka.kz/v2/orders/{{order_id}}/payments/card"
payload = json.dumps({
"card_id": "t3i2tPViLK"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.post(url, headers=headers, data=payload)
order = response.json()['order']
print(order['checkout_url'])
<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://stage-api.ioka.kz/v2/orders/{{order_id}}/payments/card');
$request->setRequestMethod('POST');
$body = new http\Message\Body;
$body->append('{
"card_id": "t3i2tPViLK"
}');
$request->setBody($body);
$request->setOptions(array());
$request->setHeaders(array(
'Content-Type' => 'application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
Примеры ответов:
- Авторизован
- Списан
- Отклонен
{
"id": "pay_test",
"order_id": "ord_test",
"status": "APPROVED",
"created_at": "2022-01-01T10:00:00.00000",
"approved_amount": 50000,
"captured_amount": 0,
"refunded_amount": 0,
"processing_fee": 0.0,
"tds": false,
"payer": {
"type": "BINDING",
"pan_masked": "555555******5599",
"expiry_date": "12/24",
"holder": "holder",
"payment_system": "VISA",
"emitter": "halykbank",
"email": "test@ioka.kz",
"phone": "77771112233",
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK",
"iin": null
},
"acquirer": {
"name": "jusan",
"reference": "111111111111"
},
"error": null,
"action": null
}
{
"id": "pay_test",
"order_id": "ord_test",
"status": "CAPTURED",
"created_at": "2022-01-01T10:00:00.00000",
"approved_amount": 500,
"captured_amount": 500,
"refunded_amount": 0,
"processing_fee": 12.5,
"tds": false,
"payer": {
"type": "BINDING",
"pan_masked": "555555******5599",
"expiry_date": "12/24",
"holder": "holder",
"payment_system": "VISA",
"emitter": "halykbank",
"email": "test@ioka.kz",
"phone": "77771112233",
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK",
"iin": null
},
"acquirer": {
"name": "jusan",
"reference": "111111111111"
},
"error": null,
"action": null
}
{
"id": "pay_test",
"order_id": "ord_test",
"status": "DECLINED",
"created_at": "2022-01-01T10:00:00.00000",
"approved_amount": 0,
"captured_amount": 0,
"refunded_amount": 0,
"processing_fee": 0.0,
"tds": false,
"payer": {
"type": "BINDING",
"pan_masked": "555555******5599",
"expiry_date": "12/24",
"holder": "holder",
"payment_system": "VISA",
"emitter": "halykbank",
"email": "test@ioka.kz",
"phone": "77771112233",
"customer_id": "mn4ZgB5XTb",
"card_id": "t3i2tPViLK",
"iin": null
},
"acquirer": null,
"error": {
"code": "WRONG_CARD_DATA_INPUT",
"message": "Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию."
},
"action": null
}
Если платеж был отклонен (payment_status = DECLINED
), то в теле ответа придет объект error
:
"error": {
"code": "WRONG_CARD_DATA_INPUT",
"message": "Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию."
}
Более подробно ознакомиться со всеми возможными ошибками платежа можно ознакомиться в Справочнике по API.