Параметр 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) | Язык платежной страницы. Доступные значения: ru — русский uk — украинский 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 — параметр, указывающий на то, была ли 3dsecure аутентификация держателя карты или нет. Допустимые значения: 5 — была проведена полная аутентификация кардхолдера 6 — мерчант поддерживает 3dsecure, но банк-эмитент не поддерживает 7 — ни мерчант ни банк-эмитент не поддерживают 3dsecure | |
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 АПИ поддерживает следующие текстовые форматы запросов: 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