P2P
Ввод денег переводом с карты на карту
Интеграция заключается во встраивании платежной кнопки в сайт партнера. При клике по этой кнопке производится отправка данных на адрес системы GarryPay.
Информация
Для обеспечения безопасности, отправляемые данные должны быть криптографически подписаны.
Правила использования платежного метода
1) После формирования инвойса, у плательщика есть 20 минут на то, чтобы совершить перевод средств и нажать кнопку «Оплата завершена». Если плательщик перевел средства и:
- не нажали кнопку «Оплата завершена».
- нажал кнопку «Отмена»
- не уложился в 20 минут
то вам, как мерчанту, необходимо об этом сообщить в поддержку GarryPay.
2) При переводе средств категорически запрещено
указывать любые комментарии к переводу (если это не оговорено правилами метода). При отправке платежа с комментарием, возможен перерасчет по такому инвойсу с удержанием штрафа до 10%.
3) Если плательщик отправил перевод на меньшую сумму, чем была указана в инвойсе, ему будет предложено доплатить. В случае отказа, запрашиваем у плательщика подтверждающие документы, что карта оформлена на него. И осуществляем возврат на те же реквизиты за вычетом штрафа в 10%.
4) Отправка денежных средств осуществляется, по возможности, внутрибанковским платежом. В случае отсутствия у плательщика счетов в предложенных банках, допускается межбанковский перевод (при наличии чека).
5) Перевод средств с электронных платежных кошельков Qiwi, Yoomoney и прочих – запрещен (если это не оговорено правилами метода). Такие платежи будут передаваться на арбитраж и зачисление по ним не гарантировано.
6) При попытке приложить фальшивые чеки об оплате – аккаунт плательщика необходимо заблокировать.
Интеграция через платежную кнопку
Код платежной кнопки должен выглядеть следующим образом:
<form action="https://merch-dev.garrypay.com/button" method="post">
<input
type="hidden"
name="data"
value="eyJtZXJjaGFudF9pZCI6IjE1YWU2Yzg4LWJiMGItNGY3Ny1hZjkxLTZhMGNkNWI0NGRlZCIsInB1cmNoYXNlX2lkIjozMTUsImFtb3VudCI6IjMzMTYuMDAiLCJjdXJyZW5jeSI6IlJVQiIsImxhbmciOiJydSIsInBheW1lbnRfbWV0aG9kIjoicDJwIiwiY2FsbGJhY2siOiJodHRwczpcL1wvbWVyY2hhbnQtc2l0ZS5jb21cL2NhbGxiYWNrX3VybCJ9"
>
<input
type="hidden"
name="sign"
value="YjNjOTNhOWE2ZmRlYjIyOTc5ZjMxMTdiMzQ1YmM3YmE2MGI1NjNhOTU0Zjc2NjcyNjc4ZTUzNmVmYjU4MWFjMQ=="
>
</form>
Данные для поля data готовятся следующим образом (псевдо-код):
Base64.encode('{
"merchant_id": "ef73bed1-2591-4a91-a74e-fe68b4e2e4e0",
"lang": "ru",
"purchase_id": "1eas123",
"user_id": "122",
"amount": "3000",
"currency": "RUB",
"payment_method": "p2p"
}');
Т.е. JSON объект нужно транслировать в строку и закодировать в Base64.
Допустимые поля
Имя | Тип | По умолчанию | Описание |
---|---|---|---|
merchant_id | string | Обязательное | ID вашего мерчанта |
purchase_id | string | Обязательное | Уникальный ID покупки |
amount | string | Обязательное | Сумма в указанной валюте (лимиты смотрите под таблицей) |
currency | string | Обязательное | Валюта в которой платим INR / KZT / UAH / RUB / AZN |
lang | string | en | Язык платежного интерфейса, en / ru |
callback | string | undefined | URL страницы на которую направляется пользователь после совершения платежа |
Лимиты для суммы
INR
: 500 - 167500
KZT
: 10000 – 2000000
UAH
: 100 - 50000
RUB
: 1500 – 2000000
AZN
: 36 – 900
Пример кода
- JS
- PHP
import crypto from "crypto";
const data = new Buffer(JSON.stringify({
merchant_id: "ef73bed1-2591-4a91-a74e-fe68b4e2e4e0"
purchase_id: "234-12",
amount: "3000",
currency: "RUB",
lang: 'ru',
callback: 'https://merchant_site.com/callback_url'
})).toString("base64")
const hmac = crypto.createHmac("sha256", key);
hmac.update(data);
const sign = Buffer.from(hmac.digest("hex")).toString("base64");
$params = [
'merchant_id' => 'ef73bed1-2591-4a91-a74e-fe68b4e2e4e0',
'purchase_id' => '234-12',
'amount' => 3000,
'currency' => 'RUB',
'lang' => $lang,
'callback' => 'https://merchant_site.com/callback_url',
];
$data = base64_encode(json_encode($params));
$sign = base64_encode(hash_hmac('sha256', $data), $secret));
Callback
Данные отправляются POST запросом на URL указанный в настройках мерчанта
IP сервера с которого поступают запросы: 185.49.70.96
Пример запроса
{
data: 'eyJhY3Rpb24iOiJwMnBfcHJkZXIiLCJkYXRhIjp7ImRhdGEiOnsiYWRfaWQiOjUyMSwiYW1vdW50IjoxMDAsImN1cnJlbmN5IjoiVVNEIiwibWVyY2hhbnRfaWQiOiI5MGYxZDE5OC05MjkzLTQwNjItYjc5NC05NDgxNmM3NWNjODYiLCJjb3VudHJ5IjoicnVzIn0sImVycm9yIjoiTUVSQ0hBTlRBQ0NPVU5UTk9URk9VTkQifX0=',
sign: 'MGM4NGIyZTY2OWMyNzYzNjFhODcyODdjZGViN2UxMWQ4MzY2ZmNiYmE4ZDRiOTVhMTU1ODMxYTZlYTMwYjJmZg=='
}
data - JSON закодированный в base64
sign - подпись данных
Проверка подлинности данных
- Сгенерируйте подпись используя закодированные в base64 полученные данные и ваш Secret Key
- Сверьте сгенерированную подпись с полученной из запроса.
- Если подпись совпадает, данные подлинные, их можно декодировать и обрабатывать далее
Генерация подписи на основе полученных данных:
- JS
- PHP
//secretKey - Секретный ключ вашего мерчанта
const hmac = crypto.createHmac("sha256", secretKey);
//base64data - Закодированные данные из запроса
hmac.update(base64data);
const sign = Buffer.from(hmac.digest("hex")).toString("base64");
//$secretKey - Секретный ключ вашего мерчанта
//$base64data - Закодированные данные из запроса
$sign = base64_encode(hash_hmac('sha256', $base64data), $secretKey));
Этапы операции
Каждый callback в объекте данных содержит параметр action
. Благодаря этому параметру можно определить на какой стадии процесс верификации / платежа
p2p_order | создание ордера (в момент, когда пользователь выбрал офер) |
p2p_completed | провайдер подтвердил поступление денег |
p2p_approved | трейдер подтвердил сделку |
p2p_canceled | отмена ордера |
Пример раскодированных данных
{
"action":"p2p_order",
"data":{
"data": {....исходные данные запроса API},
"result": {...результат выполнения запроса},
"error": "информация об ошибке, если есть"
}
}