11

Как прикрутить оплату LiqPay к своему сайту (PHP)

Несколько раз сталкивался с этим вопросом. Актуальность его высока, а реализация вообще элементарна. Не будем ходить вокруг да около

Для простоты понимания и универсальности для начала сделаем все на PHP

1) в новой папке создадим файл api.php

[code language=»php»]
<?php
/**
* Liqpay Payment Module
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
*
* @category LiqPay
* @package liqpay/liqpay
* @version 3.0
* @author Liqpay
* @copyright Copyright (c) 2014 Liqpay
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*
* EXTENSION INFORMATION
*
* LIQPAY API https://www.liqpay.com/ru/doc
*
*/

/**
* Payment method liqpay process
*
* @author Liqpay <[email protected]>
*/
class LiqPay
{

private $_api_url = ‘https://www.liqpay.com/api/’;
private $_checkout_url = ‘https://www.liqpay.com/api/checkout’;
protected $_supportedCurrencies = array(‘EUR’,’UAH’,’USD’,’RUB’,’RUR’);
private $_public_key;
private $_private_key;

/**
* Constructor.
*
* @param string $public_key
* @param string $private_key
*
* @throws InvalidArgumentException
*/
public function __construct($public_key, $private_key)
{
if (empty($public_key)) {
throw new InvalidArgumentException(‘public_key is empty’);
}

if (empty($private_key)) {
throw new InvalidArgumentException(‘private_key is empty’);
}

$this->_public_key = $public_key;
$this->_private_key = $private_key;
}

/**
* Call API
*
* @param string $url
* @param array $params
*
* @return string
*/
public function api($path, $params = array())
{
if(!isset($params[‘version’])){
throw new InvalidArgumentException(‘version is null’);
}
$url = $this->_api_url . $path;
$public_key = $this->_public_key;
$private_key = $this->_private_key;
$data = base64_encode(json_encode(array_merge(compact(‘public_key’), $params)));
$signature = base64_encode(sha1($private_key.$data.$private_key, 1));
$postfields = http_build_query(array(
‘data’ => $data,
‘signature’ => $signature
));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postfields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$server_output = curl_exec($ch);
curl_close($ch);
return json_decode($server_output);
}

/**
* cnb_form
*
* @param array $params
*
* @return string
*
* @throws InvalidArgumentException
*/
public function cnb_form($params)
{

$language = ‘ru’;
if (isset($params[‘language’]) && $params[‘language’] == ‘en’) {
$language = ‘en’;
}

$params = $this->cnb_params($params);
$data = base64_encode( json_encode($params) );
$signature = $this->cnb_signature($params);

return sprintf(‘
<form method="POST" action="%s" accept-charset="utf-8">
%s
%s
<input type="image" src="//static.liqpay.com/buttons/p1%s.radius.png" name="btn_text" />
</form>
‘,
$this->_checkout_url,
sprintf(‘<input type="hidden" name="%s" value="%s" />’, ‘data’, $data),
sprintf(‘<input type="hidden" name="%s" value="%s" />’, ‘signature’, $signature),
$language
);
}

/**
* cnb_signature
*
* @param array $params
*
* @return string
*/
public function cnb_signature($params)
{
$params = $this->cnb_params($params);
$private_key = $this->_private_key;

$json = base64_encode( json_encode($params) );
$signature = $this->str_to_sign($private_key . $json . $private_key);

return $signature;
}

/**
* cnb_params
*
* @param array $params
*
* @return array $params
*/
private function cnb_params($params)
{

$params[‘public_key’] = $this->_public_key;

if (!isset($params[‘version’])) {
throw new InvalidArgumentException(‘version is null’);
}
if (!isset($params[‘amount’])) {
throw new InvalidArgumentException(‘amount is null’);
}
if (!isset($params[‘currency’])) {
throw new InvalidArgumentException(‘currency is null’);
}
if (!in_array($params[‘currency’], $this->_supportedCurrencies)) {
throw new InvalidArgumentException(‘currency is not supported’);
}
if ($params[‘currency’] == ‘RUR’) {
$params[‘currency’] = ‘RUB’;
}
if (!isset($params[‘description’])) {
throw new InvalidArgumentException(‘description is null’);
}

return $params;
}

/**
* str_to_sign
*
* @param string $str
*
* @return string
*/
public function str_to_sign($str)
{

$signature = base64_encode(sha1($str,1));

return $signature;
}

}
[/code]

 

2) В Этой-же папке создадим файл makeform.php

[code language=»php»]
<?php
require("api.php"); //Все уже придумано за нас …

$micro = sprintf("%06d",(microtime(true) — floor(microtime(true))) * 1000000); // Ну раз что-то нужно добавить для полной уникализации то ..
$number = date("YmdHis"); //Все вместе будет первой частью номера ордера
$order_id = $number.$micro; //Будем формировать номер ордера таким образом…

$merchant_id=’iXXXXXXXXXXX’; //Вписывайте сюда свой мерчант
$signature="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; //Сюда вносите public_key

//$desc = $_GET[‘desc’]; //Можно так принять назначение платежа
//$order_id = $_GET[‘order_id’]; //Можно так принять назначение платежа
$price = $_GET[‘price’]; //Все что нужно скрипту — передать в него сумму (вы можете передавать все, вплоть до ордера и описания …)

$liqpay = new LiqPay($merchant_id, $signature);
$html = $liqpay->cnb_form(array(
‘version’ => ‘3’,
‘amount’ => "$price",
‘currency’ => ‘USD’, //Можно менять ‘EUR’,’UAH’,’USD’,’RUB’,’RUR’
‘description’ => "Назначение платежа укажите свое", //Или изменить на $desc
‘order_id’ => $order_id
));

echo $html;

?>

[/code]

Теперь немного о том, что произойдет если обратиться к файлу makeform.php

К примеру создадим папку payment и оба файла будут в ней

http://www.xxx.ccc/payment/makeform.php?price=100
Таким образом сгенерируется форма для оплаты на 100 USD… А при нажатии на полученную кнопку произойдет переход на сайт LiqPay …

Теперь о практическом применении …

[code language=»javascript»]
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<!— Есть некая форма (не обязательно в тегах <form> </form>) —>
<input id=’price’ type="text" placeholder="Сумма оплаты" class="small"/>
<!— "Назначение платежа" мы передадим так же, но для простоты примера не будем обрабатывать, после не составит труда поменять в makeform.php —>
<input id=’desc’ type="text" placeholder="Назначение платежа" class="small"/>
<!— При нажатии на єту кнопку произойдет запрос формы ЛикПея и автоматический её сабмит… —>
<button type="button" onclick="make_pay();" class="btn btn_green">Оплатить</button>

<span id=’form_responce’ style=’display:none;’></span> <!— Это виртуальное поле в которое вернется форма —>
<script>
function make_pay(){
if (($(‘#price’).val() == ») || (!/^\d+$/.test($(‘#price’).val()))){ //Если в форму ничего не введено и нажата нопка ОК или введены не цифры, то
$(‘#price’).css(‘border-color’,’red’); //граница поля СУММЫ станет красным
} else
$.get("/payment/makeform.php", //Если ВСЕ ОК — Запросим сгенерированную форму без перезагрузки страницы
{
price: $(‘#price’).val(), //В качестве параметра передадим сумму (введенную в поле)
desc: $(‘#desc’).val(),
},
onAjaxSuccess //Функция, которая сработает если ВСЕ ОК
);

function onAjaxSuccess(data)
{
// Здесь мы получаем данные в переменную data
$(‘#form_responce’).html(data); //И передаем эту форму в невидимое поле form_responce
$(‘#form_responce form’).submit() //Сразу же автоматически сабмитим эту форму, так как всеравно клиент её не видит
}
}
</script>
[/code]

Конечно же для того, что бы работала конструкция $(‘…..’)   нужен подключенный JQUERY: а хотя бы так как в коде выше, однако он может быть и локальным:

[code language=»javascript»]
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
[/code]

Это универсальное средство великолепно справится со своей задачей и будет принимать оплаты, а вот о том, как потом сообщить об оплате Вашему сайту — будет отдельная статья, однако сразу скажу, что сделать это можно только для того сайта, где есть сертификат подтверждения SSL, т.е. можно подключиться к сайту через https:// именно так ПриватБанк делает подтверждения….

До новых встреч

admin

11 комментариев

  1. Таким образом сгенерируется форма для оплаты на 100 USD… А при нажатии на полученную кнопку произойдет переход на сайт LiqPay …

    Как сделать что бы не нажимать кнопку, а форма сабмитилась сама?

  2. Спасибо за статью, очень полезно … а не подскажите когда ждать от вас обещанного продолжения — » а вот о том, как потом сообщить об оплате Вашему сайту — будет отдельная статья» … напишите если не трудно, очень нужно )

  3. Спасибо за статью, очень полезно …
    » как потом сообщить об оплате Вашему сайту — будет отдельная статья» — если не трудно напишите продолжения, очень нужно )

  4. Спасибо большое за статью, благодаря Вам сэкономил много времени и нервов )

  5. Здраствуйте подскажите а как сделать ,чтобы в практическом применении которое написано выше сделать не ручной ввод суммы и назначения а автоматический ! который будет заполнять данными о заказе стоимости

    • Очень просто. Не давайте редактировать это поле, а создайте INPUT в форме тип которого HIDDEN и значение будет статическим

  6. ОЧЕНЬ ДОЛГО ИСКАЛ. ОГРОМНОЕ СПАСИБО !!! Я разобрался 🙂 🙂

    Дохотчиво. все работает.

  7. Сделал все как в инструкции, но при нажатии кнопки нет всплывающего окна.
    Сайт на Джумла 3.9
    Помогите исправить.

Добавить комментарий для fenix-77 Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *