ID мерчанта | Ключ платежу | Опис |
---|---|---|
1396424 | test | Основний (технічний) мерчант. Від імені цього мерчанта будуватиметься запит на API розщеплення і формуватиметься сигнатура |
500001 | Мерчант контрагента 1, на якого необхідно розщепити першу частину суми | |
600001 | Мерчант контрагента 2, на якого необхідно розщепити другу частину суми |
АПІ розрахункового центру дає змогу розщеплювати платіж, оплачений платником, на кілька одержувачів – контрагентів.
У прикладі показано роботу з двома контрагентами, але їх може бути більше.
Реквізити всіх контрагентів передаються в запиті в параметрі receiver і можуть бути будь-якою з таких сутностей:
приклад:
"receiver":{
"requisites": {
"amount": 100,
"settlement_description": "Призначення платежу для банківського переказу",
"account": 123456789,
"okpo": 1234567,
"jur_name": "ТОВ Ромашка",
"fee_partner_amount": 102
},
"type": "bank_account"
}
приклад:
"receiver":{
"requisites": {
"amount": 200,
"settlement_description": "Призначення платежу для банківського переказу",
"merchant_id": 600001,
"fee_partner_amount": 102
},
"type": "merchant"
}
приклад:
"receiver":{
"requisites": {
"rectoken": "da82035bc13c78f2eb74df7caf81decc3601061c",
"amount": 500,
"fee_partner_amount": 102
},
"type": "rectoken"
}
приклад:
"receiver":{
"requisites": {
"amount": 500,
"card_number": 4444555511116666,
"fee_partner_amount": 102
},
"type": "card"
}
Крок 1. Купівля
Покупець здійснює купівлю будь-яким із методів інтеграції.
При цьому, платежу присвоюється унікальний order_id.
Якщо суму потрібно тільки заблокувати, але не списувати з картки, під час здійснення покупки, потрібно передати параметр preauth = Y
Сума, заблокована з параметром preauth = Y надалі може бути змінена в менший бік за допомогою операції capture.
Платіж, здійснений з параметром preauth = Y не списується з картки і не зараховується на рахунок Fondy до отримання запиту на операцію capture.
Платіж, здійснений з параметром preauth = N або без параметра preauth, списується з картки і зараховується на рахунок Fondy в очікуванні інструкції на розщеплення.
Крок 2. Capture (не обов’язковий)
Якщо на кроці 1 платіж було здійснено з параметром preauth = Y, його необхідно завершити операцією capture.
Крок 3. Розщеплення
Надіслати запит розщеплення на https://pay.fondy.eu/api/settlement передаючи параметр operation_id ідентичний order_id з кроку 1 та інструкцію розщеплення в параметрі receiver.
Запит надсилається методом POST у форматі JSON на endpoint:
https://pay.fondy.eu/api/settlement
Формат запиту
{
"request": {
"version": 2.0,
"data": "ewogIm9yZGVyIjogewogICAic2VydmVyX2NhbGxiYWNrX3VybCI6ICJodHRwOi8vc2l0ZS5jb20vY2FsbGJhY2siLAogICAicmVjdG9rZW4iOiAiOTg5YmI5MzRiZTZiMWEwYjRmZDc1YzU5YWRhZTczOTRlNTZmNGM2MCIsIC8vINC00LvRjyDQodGF0LXQvNCwIDIuINCf0L7RgdGA0LXQtNGB0YLQstC+0Lwg0YLQvtC60LXQvdCwCiAgICJjdXJyZW5jeSI6ICJVQUgiLAogICAiYW1vdW50IjogIjE0MDAiLAogICAib3JkZXJfdHlwZSI6ICJzZXR0bGVtZW50IiwKICAgInJlc3BvbnNlX3VybCI6ICJodHRwOi8vc2l0ZS5jb20vdGVzdC9yZXNwb25zZXBhZ2UvIiwKICAgIm9yZGVyX2lkIjogInRlc3QxMjM0NTYxNDY3NDYyMDk5LjE5IiwKICAgIm9wZXJhdGlvbl9pZCI6ICJ0ZXN0MTIzNDU2MTQ2NzQ2MjA5OS4xOSIsCiAgICJvcmRlcl9kZXNjIjogInRlc3Qgb3JkZXIiLAogICAibWVyY2hhbnRfaWQiOiAxMzk2NDI0LAogICAicmVjZWl2ZXIiOiBbCiAgICAgewogICAgICAgInJlcXVpc2l0ZXMiOiB7CiAgICAgICAgICJhbW91bnQiOiAxMDAsCiAgICAgICAgICJzZXR0bGVtZW50X2Rlc2NyaXB0aW9uIjogItCd0LDQt9C90LDRh9C10L3QuNC1INC/0LvQsNGC0LXQttCwINC00LvRjyDQsdCw0L3QutC+0LLRgdC60L7Qs9C+INC/0LXRgNC10LLQvtC00LAiLAogICAgICAgICAibWVyY2hhbnRfaWQiOiA1MDAwMDEKICAgICAgIH0sCiAgICAgICAidHlwZSI6ICJtZXJjaGFudCIKICAgICB9LHsKICAgICAgICJyZXF1aXNpdGVzIjogewogICAgICAgICAiYW1vdW50IjogMjAwLAogICAgICAgICAic2V0dGxlbWVudF9kZXNjcmlwdGlvbiI6ICLQndCw0LfQvdCw0YfQtdC90LjQtSDQv9C70LDRgtC10LbQsCDQtNC70Y8g0LHQsNC90LrQvtCy0YHQutC+0LPQviDQv9C10YDQtdCy0L7QtNCwIiwKICAgICAgICAgIm1lcmNoYW50X2lkIjogNjAwMDAxCiAgICAgICB9LAogICAgICAgInR5cGUiOiAibWVyY2hhbnQiCiAgICAgfSwKICAgICB7CiAgICAgICAicmVxdWlzaXRlcyI6IHsKICAgICAgICAgImFtb3VudCI6IDEwMCwKICAgICAgICAgInNldHRsZW1lbnRfZGVzY3JpcHRpb24iOiAi0J3QsNC30L3QsNGH0LXQvdC40LUg0L/Qu9Cw0YLQtdC20LAg0LTQu9GPINCx0LDQvdC60L7QstGB0LrQvtCz0L4g0L/QtdGA0LXQstC+0LTQsCIsCiAgICAgICAgICJhY2NvdW50IjogMTIzNDU2Nzg5LAogICAgICAgICAibWZvIjogMTIzNDUsCiAgICAgICAgICJva3BvIjogMTIzNDU2Nzg5LAogICAgICAgICAianVyX25hbWUiOiAi0J7QntCeINCg0L7QvNCw0YjQutCwIgogICAgICAgfSwKICAgICAgICJ0eXBlIjogImJhbmtfYWNjb3VudCIKICAgICB9LAogICAgIHsKICAgICAgICJyZXF1aXNpdGVzIjogewogICAgICAgICAicmVjdG9rZW4iOiAiZGE4MjAzNWJjMTNjNzhmMmViNzRkZjdjYWY4MWRlY2MzNjAxMDYxYyIsCiAgICAgICAgICJhbW91bnQiOiA1MDAKICAgICAgIH0sCiAgICAgICAidHlwZSI6ICJyZWN0b2tlbiIKICAgICB9LAogICAgIHsKICAgICAgICJyZXF1aXNpdGVzIjogewogICAgICAgICAiYW1vdW50IjogNTAwLAogICAgICAgICAiY2FyZF9udW1iZXIiOiA0NDQ0NTU1NTExMTE2NjY2CiAgICAgICB9LAogICAgICAgInR5cGUiOiAiY2FyZCIKICAgICB9CiAgIF0KIH0KfQo=",
"signature": "943571471619207087eb57e2b4ef69affd337b1a"
}
}
data – це base64 кодований набір даних формату:
{
"order": {
"server_callback_url": "http://site.com/callback",
"currency": "UAH",
"amount": 1400,
"order_type": "settlement",
"response_url": "http://site.com/test/responsepage/",
"order_id": "settlement_test1234561467462099.19",
"operation_id": "test1234561467462099.19",
"order_desc": "test order",
"merchant_id": 1396424,
"receiver": [
{
"requisites": {
"amount": 100,
"settlement_description": "Призначення платежу для банківського переказу",
"merchant_id": 500001,
"fee_partner_amount": 102
},
"type": "merchant"
},{
"requisites": {
"amount": 200,
"settlement_description": "Призначення платежу для банківського переказу",
"merchant_id": 600001,
"fee_partner_amount": 90
},
"type": "merchant"
},
{
"requisites": {
"amount": 100,
"settlement_description": "Призначення платежу для банківського переказу",
"account": 123456789,
"okpo": 1234567,
"jur_name": "ТОВ Ромашка",
"fee_partner_amount": 70
},
"type": "bank_account"
},
{
"requisites": {
"rectoken": "da82035bc13c78f2eb74df7caf81decc3601061c",
"amount": 500,
"fee_partner_amount": 50
},
"type": "rectoken"
},
{
"requisites": {
"amount": 500,
"card_number": 4444555511116666,
"fee_partner_amount": 40
},
"type": "card"
}
]
}
}
Відповідь повертається у форматі JSON на server_callback_url та response_url після того, як клієнт завершить оплату
Формат кінцевої відповіді:
{
"response": {
"version": "2.0",
"data": "ewogICJvcmRlciI6IHsKICAgICJycm4iOiAiIiwKICAgICJtYXNrZWRfY2FyZCI6ICI0NDQ0NTVYWFhYWFg2NjY2IiwKICAgICJzZW5kZXJfY2VsbF9waG9uZSI6ICIiLAogICAgInJlc3BvbnNlX3N0YXR1cyI6ICJzdWNjZXNzIiwKICAgICJzZW5kZXJfYWNjb3VudCI6ICIiLAogICAgImZlZSI6ICIiLAogICAgInJlY3Rva2VuX2xpZmV0aW1lIjogIiIsCiAgICAicmV2ZXJzYWxfYW1vdW50IjogIjAiLAogICAgInNldHRsZW1lbnRfYW1vdW50IjogIjAiLAogICAgImFjdHVhbF9hbW91bnQiOiAiMjAwMCIsCiAgICAib3JkZXJfc3RhdHVzIjogImFwcHJvdmVkIiwKICAgICJyZXNwb25zZV9kZXNjcmlwdGlvbiI6ICIiLAogICAgInZlcmlmaWNhdGlvbl9zdGF0dXMiOiAiIiwKICAgICJvcmRlcl90aW1lIjogIjAyLjA3LjIwMTYgMTU6MjE6MzkiLAogICAgImFjdHVhbF9jdXJyZW5jeSI6ICJVQUgiLAogICAgIm9yZGVyX2lkIjogInRlc3QxMjM0NTYxNDY3NDYyMDk5LjE5IiwKICAgICJwYXJlbnRfb3JkZXJfaWQiOiAiIiwKICAgICJtZXJjaGFudF9kYXRhIjogIiIsCiAgICAidHJhbl90eXBlIjogInB1cmNoYXNlIiwKICAgICJlY2kiOiAiIiwKICAgICJzZXR0bGVtZW50X2RhdGUiOiAiIiwKICAgICJwYXltZW50X3N5c3RlbSI6ICJjYXJkIiwKICAgICJyZWN0b2tlbiI6ICIiLAogICAgImFwcHJvdmFsX2NvZGUiOiAiNDc4NDUwIiwKICAgICJtZXJjaGFudF9pZCI6IDEzOTY0MjQsCiAgICAic2V0dGxlbWVudF9jdXJyZW5jeSI6ICIiLAogICAgInBheW1lbnRfaWQiOiAxNTg2MTkzLAogICAgInRyYW5zYWN0aW9uIjogWwogICAgICB7CiAgICAgICAgInN0YXR1cyI6ICJhcHByb3ZlZCIsCiAgICAgICAgImFtb3VudCI6IDIwLjAsCiAgICAgICAgImZlZSI6IDAuMCwKICAgICAgICAicmV2ZXJzYWxfYW1vdW50IjogMC4wLAogICAgICAgICJwYXJlbnRfdHJhbl9pZCI6IG51bGwsCiAgICAgICAgInJlY2VpdmVyIjoge30sCiAgICAgICAgIm1lcmNoYW50X2lkIjogNjAwMDAxLAogICAgICAgICJ0eXBlIjogInB1cmNoYXNlIiwKICAgICAgICAiaWQiOiAxMDAxNTQzOTYwLAogICAgICAgICJkb2Nfbm8iOiBudWxsCiAgICAgIH0KICAgIF0sCiAgICAicHJvZHVjdF9pZCI6ICIiLAogICAgImN1cnJlbmN5IjogIlVBSCIsCiAgICAiY2FyZF9iaW4iOiA0NDQ0NTUsCiAgICAicmVzcG9uc2VfY29kZSI6ICIiLAogICAgImNhcmRfdHlwZSI6ICJWSVNBIiwKICAgICJhbW91bnQiOiAiMjAwMCIsCiAgICAic2VuZGVyX2VtYWlsIjogImRlbW9AZm9uZHkuZXUiCiAgfQp9",
"signature": "54aeeadf05b04e2e4097a4aa5907c3a62684d058"
}
}
де data – це base64 кодований набір даних, що містять інформацію про всі фінансові операції та їхній статус
{
"order": {
"rrn": "",
"masked_card": "444455XXXXXX6666",
"sender_cell_phone": "",
"response_status": "success",
"sender_account": "",
"fee": "",
"rectoken_lifetime": "",
"reversal_amount": "0",
"settlement_amount": "0",
"actual_amount": "2000",
"order_status": "approved",
"response_description": "",
"verification_status": "",
"order_time": "02.07.2016 15:21:39",
"actual_currency": "UAH",
"order_id": "test1234561467462099.19",
"parent_order_id": "",
"merchant_data": "",
"tran_type": "purchase",
"eci": "",
"settlement_date": "",
"payment_system": "card",
"rectoken": "",
"approval_code": "478450",
"merchant_id": 1396424,
"settlement_currency": "",
"payment_id": 1586193,
"transaction": [
{
"status": "approved",
"amount": 20.0,
"fee": 0.0,
"reversal_amount": 0.0,
"parent_tran_id": null,
"receiver": {},
"merchant_id": 600001,
"type": "purchase",
"id": 1001543960,
"doc_no": null
}
],
"product_id": "",
"currency": "UAH",
"card_bin": 444455,
"response_code": "",
"card_type": "VISA",
"amount": "2000",
"sender_email": "demo@fondy.eu"
}
}
Параметр signature розраховується як функція sha1(password + ‘|’ +data)
При поверненні коштів, в параметрах receiver->requisites-> потрібно вказувати, з якого мерчанта яка частина основної суми має бути утримана.
Наприклад, якщо основна сума “amount”: 300, то потрібно в запиті вказати receiver->receiver->amount таким чином, щоб усі їхні значення разом дорівнювали основній сумі.
Основна сума повернеться на картку платника або в режимі онлайн, або за регламентом банку протягом декількох днів, якщо онлайн реверс неможливий.
POST: https://pay.fondy.eu/api/reverse/order_id
Приклад параметра data:
{
"order": {
"order_id": "test1234561467462099.19",
"currency": "UAH",
"amount": 300,
"merchant_id": 1396424,
"receiver": [
{
"requisites": {
"amount": 100,
"merchant_id": 500001
},
"type": "merchant"
},
{
"requisites": {
"amount": 200,
"merchant_id": 600001
},
"type": "merchant"
}
]
}
}
де: order_id і merchant_id – ідентифікатори оригінального платежу Приклад відповіді в разі успішного повернення:
{
"order": {
"reverse_status": "approved",
"reversal_amount": "300",
"order_id": "test1234561467462099.19",
"response_status": "success",
"response_code": "",
"response_description": "",
"merchant_id": 1396424
}
}
Приклад відповіді у разі відмови:
{
"order": {
"reverse_status": "declined",
"reversal_amount": "300",
"order_id": "test1234561467462099.19",
"response_status": "success",
"response_code": "1016",
"response_description": "Merchant not found",
"merchant_id": 1396424
}
}
При створенні на боці FONDY платіжної інструкції на розщеплення, процес обробки інструкції проходить у три статуси: created -> processing -> approved
created: інструкція отримана та поставлена в чергу на розщеплення
approved: система СЕП НБУ підтвердила, що кошти зараховані отримувачам
Для отримання статусу розщеплення, потрібно використовувати API Отримання списку транзакцій. В параметрах order_id та merchant_id потрібно передавати значення того ордера, який містив інструкцію розщеплення в параметрі receiver.
При успішному розщепленні у списку транзакцій будуть транзакції з tran_type=settlement та transaction_status=approved які відповідають розщепленим сумам.
Розщеплення проходить за регламентом у термін, вказаний у договорі між мерчантом та FONDY.
Після отримання запиту на розщеплення, на server_callback_url, вказаний при покупці, буде повернений колбек у форматі
{
"version": "2.0",
"data": "eyJvcmRl...tZW50X2N1cnJlbmN5IjogIiJ9fQ==",
"signature": "21fdf2e7938a7c6b7b883b4d7698e55e781b2445"
}
де параметр data містить структуру:
{
"order": {
"payment_id": 248671633,
"fee": "",
"order_type": "settlement",
"reversal_amount": "0",
"order_id": "1299382-settlement-test1595856030",
"settlement_amount": "0",
"merchant_data": "",
"settlement_date": "",
"transaction": [
{
"status": "approved",
"odb_ref": null,
"doc_no": null,
"currency": "UAH",
"settlement_response_code": "",
"merchant_id": 700001,
"id": 1241093791,
"settlement_currency": "UAH",
"settlement_fee": 0.01,
"fee": 1,
"reversal_amount": 0,
"settlement_amount": 0.25,
"settlement_status": "created",
"amount": 25,
"settlement_response_description": "",
"parent_tran_id": null,
"receiver": {
"requisites": {
"merchant_id": 500001
},
"type": "merchant"
},
"payouttime": "28.07.2020 08:00:00",
"type": "settlement"
},
{
"status": "approved",
"odb_ref": null,
"doc_no": null,
"currency": "UAH",
"settlement_response_code": "",
"merchant_id": 700001,
"id": 1241093793,
"settlement_currency": "UAH",
"settlement_fee": 10.38,
"fee": 1038,
"reversal_amount": 0,
"settlement_amount": 374.0,
"settlement_status": "created",
"amount": 37400,
"settlement_response_description": "",
"parent_tran_id": null,
"receiver": {
"requisites": {
"merchant_id": 600001
},
"type": "merchant"
},
"payouttime": "28.07.2020 08:00:00",
"type": "settlement"
}
],
"operation_id": "1299382-test",
"order_status": "approved",
"response_description": "",
"merchant_id": 1396424,
"order_time": "27.07.2020 16:20:30",
"response_code": "",
"settlement_currency": ""
}
}
У колбеці за таким запитом буде повернений об’єкт order, який містить тип замовлення order_type = settlement.
Параметр order_status вказує на те, чи оброблено запит на розщеплення, чи відхилено.
order_status об’єкта order може приймати 2 значення:
approved – запит на розщеплення оброблено
declined – запит на розщеплення відхилено
Причина та опис відмови при статусі declined повертається в параметрах response_code та response_description.
Об’єкт order також складається з масиву об’єктів transaction, який містить список транзакцій, на які розщепилась покупка. У кожній такій транзакції вказано type = settlement.
Параметр status об’єкта transaction може приймати такі значення:
created – транзакція розщеплення ще не оброблена
approved – транзакція розщеплення успішно оброблена, і кошти надійдуть на рахунок отримувача
Перед запуском у робочому режимі, потрібно переконатися, що інтеграція проведена відповідно до документації.
Для цього потрібно виконати ряд тестових операцій та надати ідентифікатори order_id команді технічної підтримки Fondy.
Тестові операції повинні бути виконані за реальною картою на невелику суму, зазвичай у межах 1-2 грн.
Тести:
Для моніторингу платежів та фінансових звітів використовуйте звіти в особистому кабінеті Мерчант-портала. Для цього увійдіть до Мерчант-портал і перейдіть в меню Звіти -> Користувацькі звіти. У цьому меню вам будуть доступні два основних звіти:
Нерозщеплені платежі
Як правило, основними причинами, через які платежі не розщеплюються, є:
Розщеплення
Звіт по розщепленням відображає детальну інформацію про те, куди надійшли кошти, в якому обсязі, в які дати.
Цей звіт можна використовувати як в ручному режимі, так і для автоматизованих фінансових підборів через API звітів. Для цього в звіті потрібно використовувати report_id = 595
Дивіться розділ API для програмного РРО -> Фіскалізація розщеплення