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 для програмного РРО -> Фіскалізація розщеплення