Параметр 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.hutko.org/checkout/responsepage
|
http://site.com/responseurl
|
server_callback_url |
string(2048) | URL сторінки мерчанта, на яку буде надіслано відповідь про результат оплати через сервер-сервер з’єднання. Детальніше про серверні колбеки див. п. Отримання Callback |
http://site.com/callbackurl
|
payment_systems |
string(1024) | Список платіжних систем, доступних клієнту при виборі способу оплати на сторінці hutko. Системи повинні бути розділені комою або крапкою з комою. Допустимі значення: див. Підтримувані платіжні системи За замовчуванням: береться з налаштувань мерчанта
|
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 – буде зроблено автоматичний реверс платежу системою hutko, якщо платіж успішний
Значення за замовчуванням: 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 — замовлення відхилено платіжним шлюзом hutko, зовнішньою платіжною системою або банком-еквайром 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) | Комісія, утримана із суми замовлення платіжним шлюзом hutko | |
payment_system |
string(50) | Платіжна система, через яку було здійснено платіж. Список допустимих платіжних систем див. у Підтримувані платіжні системи | Card |
sender_email |
string(254) | Email платника | |
payment_id |
integer(19) | Унікальний ідентифікатор платежу, присвоєний платіжним шлюзом hutko | |
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)); }
Приклад відповіді від hutko (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)); }
Запити на сервер hutko можна надсилати 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.hutko.org/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.hutko.org/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.hutko.org/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.hutko.org/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.hutko.org/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.hutko.org/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