Сервіси "Плати частинами" та "Розстрочка"
Сервіси "Плати частинами" та "Розстрочка"
Тестування на передпроді включає в себе взаємодію API та мобільного застосунку Абанк24. Можливо пройти всі кейси тестування аналогічно продовим налаштуванням, але без реального відкриття кредиту.
Для тестування на передпроді використовуйте:
"url": https://midgard.a-bank.com.ua/partpay/common/
"key": "testSecretKey"
“store”: "TestMagaz"
Протокол
Тип запитів: POST
Формат відповідей: JSON
Схема взаємодії при оплаті в магазині:
Клієнт вибирає товар, який він хоче придбати
Продавець формує кошик платежів клієнта
Касир оформляє Плати частинами для Клієнта
Магазин відправляємо запит в банк, використовуючи сервіс Подача заявки на оплату частинами
Банк приймає заявку на створення платежу за програмою Плати частинами
Банк приймає рішення на оформлення розстрочки протягом 20 секунд і відправляє в мобільний додаток Push клієнту з інформацій про розстрочку за програмою Плати частинами для підтвердження
Клієнт ознайомлюється з умовами розстрочки і підтверджує відкриття
Банк відправляє Магазину відповідь (Callback) з результатом оформлення клієнтом Плати частинами
Відправляється два колбэка.
1. Результат по заявці (або FAIL або віддали на підтвердження клієнту) - це до 5с
2. Другий - коли клієнт вже підтвердив ( щоб швидко змогли обновити дані в системі і завершити угоду)
Касир друкує чек.
Магазин завершує замовлення
Магазин інформує банк про результат завершення операції
Проведена видача товару клієнту
Товар клієнту не видано
Авторизація
Всі запити підписуються за допомогою ключа і передаються в Headers запиту Headers: "signature": "{{hashInBase64}}"
Реалізація JS:
var json = JSON.stringify(request);
var hash = CryptoJS.HmacSHA256(json, secret);
var hashInBase64 = hash.toString(CryptoJS.enc.Base64);
Реалізація PHP:
public static function genMidgardHash(array $data) :string
{
$key = config('test.key');
return base64_encode(hex2bin(hash_hmac('sha256', json_encode($data), $key))
}
Реалізація Java:
public String createSignatureByBody(String bodyRequest, String secretKey) {
log .info ( "Start createSignatureByBody: BODY = {}" , bodyRequest) ;
byte[] body = bodyRequest .getBytes (StandardCharsets .UTF _8) ;
String signature = null ;
try {
Mac hasher = Mac .getInstance ( "HmacSHA256" ) ;
hasher .init (new SecretKeySpec(secretKey .getBytes (), "HmacSHA256" )) ;
signature = new
String(Base64 .getEncoder () .encode (hasher .doFinal (body)),
StandardCharsets .UTF _8) ;
} catch (Exception ex) {
log .error ( "ERROR createSignatureByBody: {}" , ex .toString (), ex) ;
}l
og .info ( "End createSignatureByBody: MY_SIGNATURE = {}" , signature) ;
return signature ;
}
Приклад:
Для запита {"order_id": "123456789"}
сформовано підпис з ключом "secret"
"hashInBase64":"TXFbtdiTiR/bSbB6b9EVE/bd7lqUGcdTBv6VesoSZYk="
Вхідні параметри
Вихідні параметри
Приклад
Запит
{
"store": "TestMagaz",
"store_name": "Товари для дому",
"store_order_id": "0914157144050283",
"client_phone": "+30888888888",
"total_sum": 100,
"invoice": {
"date": "2020-04-10",
"number": "0914-000100",
"point_id": "1234",
"source": "STORE"
},
"available_programs": [
{
"available_parts_count": [
3
],
"type": "payment_installments"
}
],
"products": [
{
"name": "Термінал Samsung Galaxy J3 Duos SM-J320 Gold",
"count": 1,
"sum": 2000
}
],
"result_callback":"https://shop/callback"
}
Успішна відповідь
{
"order_id": "1591268625254"
}
Приклад
Запит
{
"store": "TestMagaz",
"order_id": "1591268625254"
}
Успішна відповідь
{
"state": "SUCCESS",
"order_sub_state": "ACTIVE"
}
Приклад
Запит
{
"store": "TestMagaz",
"order_id": "1591268625254"
}
Успішна відповідь
{
"state": "FAIL",
"order_sub_state": "REJECTED_BY_STORE"
}
Приклад
Запит
{
"store": "TestMagaz",
"order_id": "1591268625254"
}
Успішна відповідь
{
"state": "IN_PROCESS",
"order_sub_state": "WAITING_FOR_STORE_CONFIRM"
}
Приклад
Запит
{
"store": "TestMagaz",
"order_id": "1591268625254"
}
Успішна відповідь
{
"bank_can_return_money_to_card": true,
"fully_paid": false
}
Приклад
Запит
{
"store": "TestMagaz",
"store_return_id": "2020-06-04:ВНKHS-000000569",
"return_money_to_card": true,
"sum": 5499,
"order_id": "1591117701745"
}
Успішна відповідь
{
"status": "OK"
}
Вихідні параметри
Статус HTTP 200 у випадку успішної обробки
Приклад
Запит
{
"state": "IN_PROCESS",
"order_sub_stateorder_sub_state": "WAITING_FOR_CLIENT",
"message": "Повідомлення надіслано клієнту в мобільний додаток",
"order_id": "1591117701745"
}
Статус по callback відправляється один раз у випадку:
Заявка перейшла в під статус WAITING_FOR_CLIENT - інформуємо про те, що Банк обробив заявку і готовий видати кредит клієнту, для початку якого чекає підтвердження в мобільному додатку А24.
Заявка перейшла до фінального статусу (FAIL) - з якої-небудь з причин, подальший рух поданої заявки завершено. Причина повідомляється в запиті, а так само клієнту в А24.
Відповідь з помилкою
{
"state": "FAIL",
"order_sub_state": " FAIL",
"message": "Внутренняя ошибка",
"order_id": "1591117701745"
}
Канал продажів: [Channel]
STORE - продажу тільки у каналі магазин
INTERNET - продажі лише в каналі інтернет
Total - загальні продажі по ОКПО
Період: вибір за датою Date
дата начальна - 01.06.2021
дата кінцева - 30.06.2021
Тип операції: [TypeOperation]
Sale - видача кредиту
Return - повернення кредиту
Total - всі операції (Видача та повернення)
Запит
{
"store": " TestMagaz",
"okpo":"12345678",
"date_start":"2021-07-25",
"date_end":"2021-08-25",
"channel":"Total",
"type":"Total"
}
Електронна форма гарантійного листа (pdf)
Запит
{
"store":"magaz",
"order_id":"1591268625254",
"invoice":{
"date":"2021-12-06"
}
}
у відповіді буде файл в base64
{
"content":"MIKFtwYJKoZIhvcNAQcCoIKFqDCChaQCAQExDjAMBgoqhiQCAQEBAQIBMIJ......."
}
Електронна форма гарантійного листа (xml)
Формат XML:
<?xml version="1.0" encoding="UTF-8"?>
<guarantee>
<header>
<request_id>ID заявки в системе банка. Строка</request_id>
<answer_datetime>Дата и время отправки данного письма банком. YYYY-MM- DDThh:mm:ss</answer_datetime>
<from_organization>Организация-отправитель</from_organization>
<organization_id>ОКПО организации-отправителя. 8 цифр</organization_id>
</header>
-- ЗОНА “РОЗШИРЕННЯ”
<expansion>
-- ДАННЫЕ О КЛИЕНТЕ
<customer>
<last_name>Фамилия клиента. Строка</last_name>
<first_name>Имя клиента. Строка</first_name>
<middle_name>Отчество клиента. Строка</middle_name>
<inn>Код ИНН клиента. 10 цифр или конкатенация полей series и Number, если клиент отказался от получения ИНН</inn>
<document>
<passport>
<series>Серия документа клиента. 2 знака, буквы кириллицы</series>
<number>Номер документа клиента</number>
<issued>Орган выдачи документа клиента</issued>
<date_of_issue>Дата выдачи документа клиента, YYYY-MM-DD</date_of_issue>
</passport>
<id_card>
<number>Номер документа клиента</number>
<issued>Орган выдачи документа клиента</issued>
<date_of_issue>Дата выдачи документа клиента, YYYY-MM-DD</date_of_issue>
<valid_until>Срок действия документа клиента, YYYY-MM-DD</valid_until>
<registry_number>№ записи паспорта в реестре. 13 цифр или 8 цифр дефис 5 цифр</registry_number>
</id_card>
<residence_permit>
<series>Серия документа клиента</series>
<number>Номер документа клиента</number>
<issued>Орган выдачи документа клиента</issued>
<date_of_issue>Дата выдачи документа клиента, YYYY-MM- DD</date_of_issue>
</residence_permit>
</document>
</customer>
-- ДАННЫЕ СЧЕТА НА ОПЛАТУ ТОВАРА
<invoice>
<invoice_number>Номер счета-фактуры. Строка</invoice_number>
<invoice_date>Дата счета-фактуры. YYYY-MM-DD</invoice_date>
<invoice_amount>Сумма счета-фактуры. Число, 2 знака после запятой, разделитель десятичной части - точка</invoice_amount>
</invoice>
-- ПЛАТЕЖНЫЕ РЕКВИЗИТЫ ДЛЯ ЗАЧИСЛЕНИЯ КРЕДИТНЫХ СРЕДСТВ
<payment_destination>
<dest_id>ОКПО компании, на счет которой будут зачислены средства. 8 цифр</dest_id>
<dest_name>Наименование компании, на счет которой будут зачислены средства. Строка</dest_name>
<dest_mfo>МФО банка, в котором открыт счет для зачисления средств. 6 цифр</dest_mfo>
<dest_bank_name>Наименование банка, в котором открыт счет для зачисления средств.
Строка</dest_bank_name>
<dest_acc_number>Номер счета для зачисления средств. Строка</dest_acc_number>
</payment_destination>
-- ДАННЫЕ ПРИНЯТОГО КРЕДИТНОГО РЕШЕНИЯ И БАНКА, ВЫДАЮЩЕГО КРЕДИТ
<bank>
<agreement>Номер кредитного договора между банком и клиентом.
Строка</agreement>
<agreement_date>Дата кредитного договора между банком и клиентом. YYYY-MM- DD</agreement_date>
<decision_description>Описание кредитного решения (если есть). Строка</decision_description>
<credit_amount>Одобренная сумма кредита. Число, 2 знака после запятой, разделитель десятичной части - точка</credit_amount>
<product_types>Тип кредита. Строка</product_types>
<available_parts_count>Количество платежей по кредиту</available_parts_count>
<credit_product>Вид кредитного продукта в программе Продавца.
Строка </credit_product>
<customer_pay_amount>Одобренная сумма первоначального взноса. Число, 2 знака после запятой, разделитель десятичной части - точка</customer_pay_amount>
<bank_id>ОКПО банка, выдающего кредит. 8 цифр</bank_id>
<bank_name>Наименование банка, выдающего кредит. Строка</bank_name>
<bank_executive>ФИО уполномоченного лица банка. Строка</bank_executive>
</bank>
-- ЦИФРОВАЯ ПОДПИСЬ И ПЕЧАТЬ
<sign>Электронная цифровая подпись банка. Строка в кодировке Base64</sign>
<stamp>Электронная цифровая печать банка. Строка в кодировке Base64</stamp>
</expansion>
</guarantee>
Засвідчення ЕЦП
Для наложения цифровой подписи и печати используется алгоритм ДСТУ4145.
Электронная цифровая подпись и печать накладываются на строку, которая составляется путем конкатенации значений следующих
атрибутов ответа (в случае паспорта-книжечки):
"customer"."last_name" "customer"."first_name" "customer"."middle_name" "customer"."inn" "customer"."document"."passport"."series" "customer"."document"."passport"."number" "customer"."document"."passport"."issued"
"customer"."document"."passport"."date_of_issue"
"invoice"."invoice_number" "invoice"."invoice_date" "invoice"."invoice_amount" "payment_destination"."dest_id" "payment_destination"."dest_name" "payment_destination"."dest_mfo" "payment_destination"."dest_bank_name" "payment_destination"."dest_acc_number" "header"."answer_datetime" "bank"."agreement" "bank"."agreement_date" "bank"."credit_amount" "bank"."product_types" "bank"."available_parts_count" "bank"."credit_product" "bank"."customer_pay_amount" "bank"."bank_id"
"bank"."bank_name"
"bank"."bank_executive"
или (в случае ID card): "customer"."last_name" "customer"."first_name"
"customer"."middle_name" "customer"."inn" "customer"."document"."id_card"."number" "customer"."document"."id_card"."issued"
"customer"."document"."id_card"."date_of_issue" "customer"."document"."id_card"."valid_until" "customer"."document"."id_card"."registry_number" "invoice"."invoice_number" "invoice"."invoice_date" "invoice"."invoice_amount" "payment_destination"."dest_id" "payment_destination"."dest_name" "payment_destination"."dest_mfo" "payment_destination"."dest_bank_name" "payment_destination"."dest_acc_number" "header"."answer_datetime"
"bank"."agreement" "bank"."agreement_date" "bank"."credit_amount" "bank"."product_types" "bank"."available_parts_count" "bank"."credit_product" "bank"."customer_pay_amount"
"bank"."bank_id" "bank"."bank_name" "bank"."bank_executive"
или (в случае Вида на жительство): "customer"."last_name" "customer"."first_name"
"customer"."middle_name"
"customer"."inn" "customer"."document"."residence_permit"."series" "customer"."document"."residence_permit"."number" "customer"."document"."residence_permit"."issued" "customer"."document"."residence_permit"."date_of_issue" "invoice"."invoice_number"
"invoice"."invoice_date" "invoice"."invoice_amount" "payment_destination"."dest_id" "payment_destination"."dest_name"
"payment_destination"."dest_mfo" "payment_destination"."dest_bank_name" "payment_destination"."dest_acc_number" "header"."answer_datetime" "bank"."agreement"
"bank"."agreement_date" "bank"."credit_amount" "bank"."product_types" "bank"."available_parts_count" "bank"."credit_product"
"bank"."customer_pay_amount" "bank"."bank_id" "bank"."bank_name" "bank"."bank_executive"
Значения атрибутов должны быть перечислены именно в указанном порядке, без пробелов или иных разделителей.
Пример строки, на которую должна накладываться ЭЦП:
ІвановІванІвановичАІ123456Дніпровським РВ ДМУ УМВС у Дніпропетровській області2000-01-121234567890СФ0386-00012016-01-201925000.0030012848
ТОВ "Компанія" 300528 АТ "АБАНК"260090000000000-07- 0212:05:101КД-00012018-07-203500.00БР7Р30.0012345678ПАТ "БАНК"Петренко І.В.