Параметр 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