Skip to content

Instantly share code, notes, and snippets.

@morozVA
Created March 26, 2018 07:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save morozVA/091636663b66de29f2ff13ebfa7b5d37 to your computer and use it in GitHub Desktop.
Save morozVA/091636663b66de29f2ff13ebfa7b5d37 to your computer and use it in GitHub Desktop.
Подключение платежных систем - пример webpay и bepaid
Подключение эквайринга
Необходимо получить от клиента доступы в кабинет пользователя нужной платежной системы.
Для webpay сначала дается доступ к тестовому кабинету. В нем проверяется правильность подключения и деньги не списываются при оплате. Когда все готово и работает – клиент пишет в webpay, и ему дают доступы от рабочего кабинета.
Для bepaid кабинет один.
Произвести необходимую настройку в кабинете пользователя платежной системы.
Для webpay - задать секретный ключ, прописать страницы error, success, notify. Забираем из кабинета id магазина.
Для bepaid надо в кабинете настроить данные тестового платежа – срок действия тестовой карточки и прочее. Также забираем id магазина.
СТРАНИЦА КОРЗИНЫ
На сайте создаем сниппет formSetCookie. В нем формируем куки с информацией об оплате.
function toSetCookie(&$fields){
global $modx;
$modx->clearCache();
$delivery = $fields['sumDelivery'];
$total = $fields['totalPrice1'];
$email = $fields['order-email'];
$phone = $fields['order-phone'];
$wsb_order = $fields['wsb_order'];
$discount = $fields['discountRubl'];
setcookie ("delivery", $delivery);
setcookie ("total",$total);
setcookie ("email",$email);
setcookie ("phone",$phone);
setcookie ("wsb_order",$wsb_order);
setcookie ("discount",$discount);
}
Вызываем его на странице корзины. В параметре &eFormOnValidate сниппета eform вызываем функцию из сниппета.
[!formSetCookie!]
[!eForm? &formid=`shopOrderForm` &tpl=`shopOrderForm` &report=`shopOrderReport` &to=`[!GetField? &docid=`58` &field=`send`!]` &from=`Заказ на сайте [(site_url)]` &gotoid=`60` &ccsender=`1` &subject=`Новый заказ` &protectSubmit=`0` &submitLimit=`1` &eFormOnBeforeMailSent=`populateOrderData` &eFormOnMailSent=`sendOrderToManager` &eFormOnValidate=`toSetCookie`!]`+]
Страница “Спасибо за заказ”.
При оформлении заказа происходит редирект на страницу “Спасибо за заказ”. В нем происходит проверка выбранного способа оплаты. Если выбран webpay/bepaid:
А. Выводим текст «Ваш заказ оформлен! Сейчас вы будете перенаправлены на безопасную
для оплаты страницу.»
Б.
Если webpay:
Выводим форму.
<form id="payOrderForm" method="post" action="https://payment.webpay.by/">
<input type="text" style="display:none;" value="" name="special" class="special" eform="Спец:date:0">
<input type="hidden" name="wsb_order" value="[!wsb_order!]" eform="::0::" />
[!toGetCookie!]
<button type="submit" id="submit" class="btn-color hidden"><span><span>Оплатить заказ</span></span></button>
</form>
В форме вызываем сниппет toGetCookie. В нем формируем поля формы из сохраненных кук – id магазина, сумма заказа, код валюты, адреса страниц error, success, notify, хешированная строка с секретным ключом для проверки подлинности, поле варианта платежа – тестовый или рабочий.
<?php
if (isset($_COOKIE['delivery'])) {
$delivery = $_COOKIE['delivery'];
}
if (isset($_COOKIE['discount'])) {
$discount = $_COOKIE['discount'];
}
$wsb_total= $_COOKIE['coockie_totalPrice'];
$wsb_email= $_COOKIE['email'];
$wsb_phone= $_COOKIE['phone'];
$wsb_order_num = $_COOKIE['coockie_wsb_order'];
//ПАРАМЕТРЫ, ЗАДАВАЕМЫЕ ПОЛЬЗОВАТЕЛЕМ
// Секретный ключ надо задать в сниппете getHash
$wsb_storeid=967854700; //id магазина
$wsb_test=0; //1 - тест, 2 - реальная оплата(0)
$wsb_currency_id='BYN'; //валюта (BYR, USD, EUR, RUB)
$wsb_store="Интернет-магазин unipress.by"; //название магазина
//$wsb_return_url="http://unipress.by/blagodarim_vas_za_oplatu_zakaza_cherez_sistemu_erip.html"; //адрес страницы при успешной оплате заказа
//$wsb_cancel_return_url="http://unipress.by/oshibka_oplaty.html"; //адрес страницы в случае НЕ успешной оплаты
$wsb_seed=time(); //случайная последовательность символов
$getHashParams = array('wsb_seed' => $wsb_seed, 'wsb_storeid' => $wsb_storeid, 'wsb_order_num' => $wsb_order_num, 'wsb_test' => $wsb_test, 'wsb_currency_id' => $wsb_currency_id, 'wsb_total' => $wsb_total);
$wsb_signature = $modx->runSnippet('getHash', $getHashParams);
$webpay_fields = '<input type="hidden" name="*scart" eform="::0::">
<input type="hidden" name="wsb_version" value="2" eform="::0::">
<input type="hidden" name="wsb_language_id" value="russian" eform="::0::">
<input type="hidden" name="wsb_storeid" value="'.$wsb_storeid.'" eform="::0::">
<input type="hidden" name="wsb_store" value="'.$wsb_store.'" eform="::0::">
<input type="hidden" name="wsb_order_num" value="'.$wsb_order_num.'" eform="::0::">
<input type="hidden" name="wsb_test" value="'.$wsb_test.'" eform="::0::">
<input type="hidden" name="wsb_currency_id" value="'.$wsb_currency_id.'" eform="::0::">
<input type="hidden" name="wsb_seed" value="'.$wsb_seed.'" eform="::0::">
<input type="hidden" name="wsb_return_url" value="http://unipress.by/blagodarim_vas_za_oplatu_zakaza_cherez_sistemu_erip.html" eform="::0::">
<input type="hidden" name="wsb_cancel_return_url" value="http://unipress.by/oshibka_oplaty.html" eform="::0::">
<input type="hidden" name="wsb_notify_url" value="http://unipress.by/blagodarim_vas_za_oplatu_zakaza_cherez_sistemu_erip.html" eform="::0::">
<input type="hidden" name="wsb_total" value="'.$wsb_total.'" eform="::0::">
<input type="hidden" name="wsb_signature" value="'.$wsb_signature.'" eform="::0::">
<input type="hidden" name="wsb_invoice_item_name[]" value="Товар">
<input type="hidden" name="wsb_invoice_item_price[]" value="'.$wsb_total.'">
<input type="hidden" name="wsb_invoice_item_quantity[]" value="1">
';
echo $webpay_fields;
C помощью js вызывам событие отправки формы через 1,5 секунды.
Когда все работает – получаем у клиента доступы к рабочему кабинету webpay. В нем не забываем заново указать секретный ключ и адреса. Заменяем в сниппете данные id магазина, секретного ключа, wsb_test.
Если bepaid:
Вызываем сниппет bePaid, в нем инклюдим php файл bePaid.php. В файле:
Указываем доступы:
$shop = '2781:2ed59d980d00eb893c2b9a56b0f7954be61ea4b2586f3459652c13b7d74862a8';
Переводим сумму в нужный формат, без копеек
$total = htmlspecialchars($_COOKIE['total']) * 100;
Формируем объект с данными запроса
$data = '{
"checkout": {
"version": 2.1,
"order": {
"amount": '.$total.',
"currency": "BYN",
"description": "'.$description.'"
},
"settings": {
"language": "ru",
"decline_url": "http://mebel-delo.by/decline.html",
"fail_url": "http://mebel-delo.by/fail.html",
"notification_url": "http://mebel-delo.by/notify.html",
"success_url": "http://mebel-delo.by/success.html"
},
"transaction_type": "payment"
}
}';
Делаем запрос в поисковую систему для получения токена:
$url = "https://checkout.bepaid.by/ctp/api/checkouts";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERPWD, $shop);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
$res = json_decode($result);
$token = $res->checkout->token;
Выводим ссылку
echo '<a class="hidden go_to_pay" href="'.$res->checkout->redirect_url.'">Перейти на страницу оплаты</a>';
Далее в чанке с помощью js переходим по сформированной ссылке
$("document").ready(function(){
function go_to_pay() {
var url = $("a.go_to_pay").attr('href');
location.href = url;
}
setTimeout(go_to_pay, 2000);
});
В форме оплаты для проверки работы вводим данные тестовой карты. Номер карты указан в документации, срок действия и код безопасности бы заполняем в кабинете пользователя.
Чек-лист:
Оформляем заказ, указав в выборе оплаты webpay/ерип или другую нужную систему.
Проверяем переход на специальную страницу с текстом об успешном заказе и грядущем переходе на страницу оплаты.
Проверяем автоматический переход js-ом на страницу оплаты.
Проверяем на странице оплаты верность информации (оплачиваемую сумму и пр.).
Совершаем тестовый платеж.
Жмем на ссылку возвращения на сайт.
Проверяем существование страницы успешной оплаты.
Переключившись в рабочий режим проверяем вплоть до страницы оплаты.
Проверяем очищение корзины, отправку письма о заказе.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment