Параметр version необхідно передавати зі значенням 1.0.1
Параметр | Тип | Опис | Приклад переданого мерчантом значення |
---|---|---|---|
order_id | string(1024) | Ідентифікатор замовлення, що призначається мерчантом. обов’язковий | ID1234 |
merchant_id | integer(12) | Унікальний ідентифікатор мерчанта. Видається торговцю після реєстрації. обов’язковий | 1 |
order_desc | string(1024) | Опис замовлення. Передається мерчантом завжди в кодуванні UTF-8 обов’язковий | Придбати квиток на поїзд № 1234 Київ – Львів |
signature | string(40) | Підпис замовлення. Слугує для перевірки цілісності та автентичності запиту від мерчанта на стороні сервера платіжного шлюзу. Алгоритм формування підпису див. Формування підпису запиту і відповіді обов’язковий | 1773cf135bd89656131134b98637894dad42f808 |
amount | integer(12) | Сума замовлення в копійках / центах без роздільників обов’язковий | 1020 (USD) — означає 10 доларів 20 центів |
currency | string(3) | Валюта замовлення. Допустимі значення: UAH — українська гривня USD — долар США EUR — євро GBP — фунт стерлінгів обов’язковий CZK — чеська крона | USD |
version | string(10) | Версія протоколу. Значення за замовчуванням: 1.0.1 Версія 1.0 – застаріла | 1.0.1 |
response_url | string(2048) | URL сторінки мерчанта, на яку буде перенаправлений клієнт у браузері після завершення оплати Значення за замовчуванням: https://pay.fondy.eu/checkout/responsepage | http://site.com/responseurl |
server_callback_url | string(2048) | URL сторінки мерчанта, на яку буде надіслано відповідь про результат оплати через сервер-сервер з’єднання. Детальніше про серверні колбеки див. п. Отримання Callback | http://site.com/callbackurl |
payment_systems | string(1024) | Список платіжних систем, доступних клієнту при виборі способу оплати на сторінці FONDY. Системи повинні бути розділені комою або крапкою з комою. Допустимі значення: див. Підтримувані платіжні системи За замовчуванням: береться з налаштувань мерчанта | card |
payment_method | string(1024) | Платіжний метод, який необхідно відобразити платнику на платіжній сторінці за замовчуванням. Наприклад monobank_ua За замовчуванням: береться з налаштувань мерчанта | card |
default_payment_system | string(25) | Платіжна система, яка першою відобразиться платнику на платіжній сторінці. Допустимі значення: див. Підтримувані платіжні системи | card |
lifetime | integer(9) | Час життя замовлення в секундах. Після закінчення цього часу, замовленню буде присвоєно статус ‘expired’ якщо клієнт його не оплатив Значення за замовчуванням: 36000 Максимально-допустиме значення: 69120000 | 600 |
merchant_data | string(2048) | Будь-який довільний набір даних, який мерчант хоче отримати назад у відповіді на response_url та/або server_callback_url , а також у звітах | |
preauth | string(1) | Параметр застосовується тільки при оплаті карткою Visa/MasterCard N — сума списується з картки клієнта відразу і відшкодовується на рахунок мерчанта відповідно до регламенту зарахування. Y — сума блокується на картці клієнта і не списується доти, доки мерчант не надішле запит capture для підтвердження списання Значення за замовчуванням: N | N |
sender_email | string(254) | Email платника | |
delayed | string(1) | Ознака відкладеного платежу. Y — дозволити клієнту оплатити платіж пізніше в межах ліміту часу, зазначеного в параметрі lifetime . Торговець повинен бути готовим до отримання декількох колбеків і редиректів з результатом оплати для одного і того ж платежу. Клієнту буде дозволено повторити спробу оплати одного і того ж order_id , якщо попередня спроба була не успішнаN — у разі спроби оплатити платіж з одним і тим самим order_id повторно клієнт отримуватиме помилку з проханням перейти на сайт торговця і створити платіж заново. У цьому випадку буде тільки один колбек на server_callback_url Значення за замовчуванням: Y | |
lang | string(2) | Мова платіжної сторінки. Доступні значення: uk — українська ru — російська en — англійська lv — латиська fr — французька cs — чеська ro — румунська it — італійська sk — словацька pl — польська es — іспанська hu — угорська de — німецька | |
product_id | string(1024) | Ідентифікатор оплачуваного товару/послуги | |
required_rectoken | string(1) | Прапор, що вказує на необхідність повертати токен картки – токен, за яким можна списувати кошти з картки без подальшої участі клієнта Значення за замовчуванням: N | Y |
verification | string(1) | Y – буде зроблено автоматичний реверс платежу системою FONDY, якщо платіж успішний Значення за замовчуванням: N | Y |
verification_type | string(25) | amount – на карті блокується зазначена сума без додаткових перевірок code – на картці блокується зазначена сума, з випадковим 4-х символьним кодом, який клієнт повинен ввести для завершення верифікації Значення за замовчуванням: amount | Y |
rectoken | string(40) | Токен картки, за яким можна списувати кошти з картки без подальшої участі клієнта | 544d3f86237886b6404d8b000f6a7d71c45410b7 |
receiver_rectoken | string(40) | Токен картки, за яким можна кредитувати картку, не передаючи повний номер картки | 544d3f86237886b6404d8b000f6a7d71c45410b7 |
design_id | integer(6) | ID дизайну, налаштованого в мерчант-порталі | 123 |
subscription | string(1) | Y – активувати регулярні платежі (за календарем) N – значення за замовчуванням, деактивувати регулярні платежі | Y/N |
subscription_callback_url | string(2048) | URL сторінки мерчанта, на яку буде надіслано відповідь про результат запланованої оплати через сервер-сервер з’єднання |
Параметр | Тип | Опис | Приклад відповіді |
---|---|---|---|
order_id | string(1024) | Ідентифікатор замовлення. Призначається мерчантом. | |
merchant_id | integer(12) | Унікальний ідентифікатор мерчанта. Видається торговцю після реєстрації. | 1 |
amount | integer(12) | Сума замовлення в копійках / центах без роздільників | 1020 (USD) — означає 10 доларів 20 центів |
currency | string(3) | Валюта замовлення. Допустимі значення: UAH — українська гривня USD — долар США GBP — фунт стерлінгів EUR — євро | |
order_status | string(50) | Статус обробки замовлення. Може містити такі значення: created — замовлення було створено, але клієнт ще не ввів платіжні реквізити; необхідно продовжувати опитувати статус замовлення processing — замовлення все ще перебуває в процесі обробки платіжним шлюзом; необхідно продовжувати опитувати статус замовлення declined — замовлення відхилено платіжним шлюзом FONDY, зовнішньою платіжною системою або банком-еквайром approved — замовлення успішно здійснене, кошти заблоковані на рахунку платника і незабаром будуть зараховані мерчанту; мерчант може надавати послугу або “відвантажувати” товар expired — час життя замовлення, зазначений у параметрі lifetime , минув. reversed — раніше успішна транзакція була повністю скасована. У такому разі параметр reversal_amount буде еквівалентний actual_amount | |
response_status | string(50) | Статус обробки запиту. Якщо виникла помилка під час валідації переданих параметрів, то повертається failure , інакше success | |
signature | string(40) | Підпис замовлення. Слугує для перевірки мерчантом цілісності та автентичності відповіді від сервера платіжного шлюзу. Алгоритм формування підпису див. у Формування підпису запиту та відповіді | 1773cf135bd89656131134b98637894dad42f808 |
tran_type | string(50) | Допустимі значення: purchase — покупка reverse — скасування / повернення | |
sender_cell_phone | string(16) | Мобільний телефон платника | |
sender_account | string(50) | Номер рахунку платника | |
masked_card | string(19) | Маскований номер картки | 444444XXXXXX5555 |
card_bin | integer(6) | Бін картки – зазвичай перші 6 цифр номера картки | 444444 |
card_type | string(50) | Допустимі значення: VISA, MasterCard | |
rrn | string(50) | У загальному випадку не унікальний ідентифікатор транзакції, присвоєний банком-еквайром. | |
approval_code | string(6) | У загальному випадку не унікальні код авторизації, присвоєний банком-емітентом | |
response_code | integer(4) | Код відхилення замовлення. Допустимі коди див. у Коди відмов. | |
response_description | string(1024) | Опис коду відхилення замовлення. Див. Коди відмов. | |
reversal_amount | integer(12) | Сума всіх реверсів за цим замовленням | |
settlement_amount | integer(12) | Сума відшкодованих коштів за цим мерчантом | |
settlement_currency | string(3) | Валюта відшкодування мерчанту | |
order_time | string(19) | Дата створення замовлення у форматі ДД.ММ.РРРР гг:хх:сс | 21.12.2014 11:21:30 |
settlement_date | string(10) | Дата відшкодування на рахунок продавця у форматі ДД.ММ.РРРР | 21.12.2014 |
eci | integer(2) | Ecommerce Indicator – параметр, що вказує на те, чи була 3DS-автентифікація власника картки чи ні. Допустимі значення: 5 — було проведено повну автентифікацію кардхолдера 6 — мерчант підтримує 3D Secure, але банк-емітент не підтримує 7 — ні мерчант ні банк-емітент не підтримують 3D Secure | |
fee | integer(12) | Комісія, утримана із суми замовлення платіжним шлюзом FONDY | |
payment_system | string(50) | Платіжна система, через яку було здійснено платіж. Список допустимих платіжних систем див. у Підтримувані платіжні системи | Card |
sender_email | string(254) | Email платника | |
payment_id | integer(19) | Унікальний ідентифікатор платежу, присвоєний платіжним шлюзом FONDY | |
actual_amount | integer(12) | Фактична сума замовлення після конвертації валют та врахування комісій. | |
actual_currency | string(3) | Фактична валюта замовлення, в якій відбулася авторизація суми на рахунку клієнта після конвертації валюти. | |
product_id | string(1024) | Ідентифікатор оплачуваного товару / послуги | |
merchant_data | string(2048) | Будь-який довільний набір даних, який мерчант передав у запиті | |
verification_status | string(50) | Результат перевірки коду під час верифікації картки Допустимі значення: verified — картку успішно перевірено кодом incorrect — введено неправильний код верифікації, але ще не вичерпано ліміт спроб failed — вичерпано ліміт невдалих спроб введення коду перевірки created — код перевірки створений, але не вводився клієнтом | |
rectoken | string(40) | Токен картки – токен, за яким можна списувати кошти з картки без подальшої участі клієнта | da39a3ee5e6b4b0d3255bfef95601890afd80709 |
rectoken_lifetime | string(19) | Час життя токена у форматі ДД.ММ.РРРР гг:хх:сс | 01.01.2018 00:00:00 |
additional_info | string(20480) | Додаткові дані у форматі JSON | { |
Параметр | Тип | Опис | Приклад значення, що повертається |
---|---|---|---|
response_status | string(50) | завжди повертається failure | failure |
error_code | integer(4) | Код відхилення замовлення. Допустимі значення описані в Коди відмов. | |
error_message | string(1024) | Опис коду відхилення замовлення. Див. Коди відмов. |
Підпис формується шляхом застосування функції SHA1 до рядка, що складається з пароля мерчанта і всіх параметрів, приконкатенованих до нього в алфавітному порядку та розділених символом вертикальної риски |
Запит від мерчанта:
{ "request":{ "order_id":"test123456", "order_desc":"test order", "currency":"USD", "amount":"125", "signature":"f0ee6288b9295d3b808bcd8d720211c7201245e1", "merchant_id":"1396424"} }
рядок, використаний для формування підпису:
test|125|USD|1396424|test order|test123456
Якщо параметр порожній і не містить даних, то приєднувати вертикальну риску не потрібно.
<?php function getSignature( $merchant_id , $password , $params = array() ){ $params['merchant_id'] = $merchant_id; $params = array_filter($params,'strlen'); ksort($params); $params = array_values($params); array_unshift( $params , $password ); $params = join('|',$params); return(sha1($params)); }
namespace Ipsp; /** * Class Signature * @package Ipsp */ class Signature { /** * @var */ private static $password; /** * @var */ private static $merchant; /** * Set merchant password * @param String $password * @return mixed */ public static function password($password){ self::$password = $password; } /** * Set merchant id * @param String $merchant * @return mixed */ public static function merchant( $merchant ){ self::$merchant = $merchant; } /** * Generate request params signature * @param array $params * @return string */ public static function generate(Array $params){ $params['merchant_id'] = self::$merchant; $params = array_filter($params,'strlen'); ksort($params); $params = array_values($params); array_unshift( $params , self::$password ); $params = join('|',$params); return(sha1($params)); } /** * Sign params with signature * @param array $params * @return array */ public static function sign(Array $params){ if(array_key_exists('signature',$params)) return $params; $params['signature'] = self::generate($params); return $params; } /** * Clean array params * @param array $data * @return array */ public static function clean(Array $data){ if( array_key_exists('response_signature_string',$data) ) unset( $data['response_signature_string'] ); unset( $data['signature'] ); return $data; } /** * Check response params signature * @param array $response * @return bool */ public static function check(Array $response){ if(!array_key_exists('signature',$response)) return FALSE; $signature = $response['signature']; $response = self::clean($response); return $signature == self::generate($response); } }
require_once 'Signature.php'; # import Signature class from namespace use Ipsp\Signature; # setup merchant id and password Signature::merchant(1396424); Signature::password('test'); if(Signature::check($response)){ echo 'signature is valid. Now we can complete purchase'; } else{ echo 'bad signature throw error' }
Існує дві типові ситуації, коли виникає помилка перевірки параметра signature.
Розглянемо обидва випадки:
<?php function getSignature( $merchant_id , $password , $params = array() ){ $params['merchant_id'] = $merchant_id; $params = array_filter($params,'strlen'); ksort($params); $params = array_values($params); array_unshift( $params , $password ); $params = join('|',$params); return(sha1($params)); }
Приклад відповіді від FONDY (JSON):
{
"rrn": "429417347068",
"masked_card": "444455XXXXXX6666",
"sender_cell_phone": "",
"response_signature_string": "**********|3324000|UAH|3324000|027440|444455|VISA|UAH|444455XXXXXX6666|1396424|
14#1500639628|approved|21.07.2017 15:20:27|51247263|card|success|0|429417347068|test@taskombank.ua|0|purchase",
"response_status": "success",
"sender_account": "",
"fee": "",
"rectoken_lifetime": "",
"reversal_amount": "0",
"settlement_amount": "0",
"actual_amount": "3324000",
"order_status": "approved",
"response_description": "",
"verification_status": "",
"order_time": "21.07.2017 15:20:27",
"actual_currency": "UAH",
"order_id": "14#1500639628",
"parent_order_id": "",
"merchant_data": "",
"tran_type": "purchase",
"eci": "",
"settlement_date": "",
"payment_system": "card",
"rectoken": "",
"approval_code": "027440",
"merchant_id": 1396424,
"settlement_currency": "",
"payment_id": 51247263,
"product_id": "",
"currency": "UAH",
"card_bin": 444455,
"response_code": "",
"card_type": "VISA",
"amount": "3324000",
"sender_email": "test@taskombank.eu",
"signature": "47bdcaf61b99edd31e3ec7913225a14d2ce07575"
}
Щоб діагностувати причину розбіжності підпису, виконайте такі дії:
<?php function getSignature( $merchant_id , $password , $params = array() ){ $params['merchant_id'] = $merchant_id; $params = array_filter($params,'strlen'); ksort($params); $params = array_values($params); array_unshift( $params , $password ); $params = join('|',$params); return(sha1($params)); }
Запити на сервер FONDY можна надсилати 2-ма способами
Схема взаємодії B API підтримує такі текстові формати запитів: HTML FORM, XML, JSON. Цей варіант зручно використовувати для:
У контексті запиту завжди повертається відповідь у тому ж форматі, що й запит. Тобто якщо запит був у форматі JSON, то і відповідь повернеться у форматі JSON. Відповідь на такий запит є проміжною і містить URL, на який необхідно перенаправити клієнта для введення реквізитів платежу.
Надсилання запиту за схемою взаємодії A не передбачає проміжної відповіді в контексті запиту. Фінальна відповідь буде повернута на URL мерчанта, вказаний у параметрах response_url
і server_callback_url
.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <form name="tocheckout"method="POST"action="https://pay.fondy.eu/api/checkout/redirect/"> <input type="text"name="server_callback_url"value="https://site.com/callback/"> <input type="text"name="response_url"value="https://site.com/responsepage/"> <input type="text"name="order_id"value="test4207135583"> <input type="text"name="order_desc"value="Test payment"> <input type="text"name="currency"value="UAH"> <input type="text"name="amount"value="100"> <input type="text"name="signature"value="1773cf135bd89656131134b98637894dad42f808"> <input type="text"name="merchant_id"value="1"> <input type="submit"> </form> </body> </html>
Content Type: application/json
Запит
{ "request": { "response_url":"https://pay.fondy.eu/responsepage/", "order_id":"test8037875286", "order_desc":"Test payment", "currency":"UAH", "amount":"100", "signature":"07bc309047a56275f8d89ae222e2af0ceb94fe79", "merchant_id":"1"} }
Нормальна проміжна відповідь
{ "response":{ "response_status":"success", "checkout_url":"https://pay.fondy.eu/checkout?token=afcb21aef707b1fea2565b66bac7dc41d7833390"} }
Відповідь у разі помилки
{ "response":{ "response_status":"failure", "error_message":"Parameter `amount` is mandatory", "error_code":"1008"} }
Content Type: application/xml
Запит
<?xml version="1.0"encoding="UTF-8"?> <request> <response_url>https://pay.fondy.eu/responsepage/</response_url> <order_id>test622138965</order_id> <order_desc>Test payment</order_desc> <currency>UAH</currency> <amount>100</amount> <signature>fad685643ed5375d6d08c27f4f600e848549b0c5</signature> <merchant_id>1</merchant_id> </request>
Нормальна проміжна відповідь
<?xml version="1.0" encoding="UTF-8"?> <response> <response_status>success</response_status> <checkout_url>https://pay.fondy.eu/checkout?token=6c67efad5fd68921f58836cabc2a3d27c5f02b23</checkout_url> </response>
Відповідь у разі помилки
<?xml version="1.0" encoding="UTF-8"?> <response> <response_status>failure</response_status> <error_message>Parameter `amount` is mandatory</error_message> <error_code>1008</error_code> </response>
Content Type: application/x-www-form-urlencoded
Запит
response_url=https://pay.fondy.eu/responsepage/&order_id=test3600040034&order_desc=Test payment¤cy=UAH&amount=100&merchant_id=1&signature=ea326b841f9a1e2e90fb392392d3ed6255a6698d
Нормальна проміжна відповідь
response_status=success&checkout_url=http%3A%2F%2Flocalhost%2Fcheckout%3Ftoken%3D643f3cea682e066f142099a76b0fa9d1613969dc
Відповідь у разі помилки
response_status=failure&error_message=Parameter%20%60amount%60%20is%20mandatory&error_code=1008