Добавление оплаты LiqPay в UMI.CMS

Сразу оговорюсь, что часть статьи была позаимствована с api.docs.umi-cms.ru.

Добавления типа данных оплаты

Для начала в корень сайта положите из вложения файл и запустите. После того, как скрипт отработает, в UMI, в модуле шаблоны данных появится новый тип оплаты:
Screenshot_1

Далее нужно перейти в редактирование способа оплаты и добавить несколько новых полей:

  • Приватный ключ | public_key
  • Приватный ключ | private_key
  • Включить режим sandbox (отладка, тестовые платежи) | sandbox_status
  • Описание | description
  • Валюта | currency
  • Тип оплаты | pay_way

Screenshot_9

Для того, чтобы создать новый метод оплаты в модуле интернет-магазин, нужно добавить класс платежной системы. Реализация класса платёжной системы.

В папке /classes/modules/emarket/classes/payment/systems/ создать файл liqpay.php. В файл добавить код:

<?php
class liqpayPayment extends payment {

	public function validate() {
		// Запрещаем оплату с помощью ,
		// если сумма заказа меньше 1 грн.
		$sum = (float) $this->order->getActualPrice();
		if($sum < 1) {
			return false;
		}

		return true;
	}

	public function process($template = null) {
		$order = $this->order;
		$order->order();
		$order->setPaymentStatus('initialized'); // Ставим заказу статус "инициализирована оплата"

		// Загружаем API класс LiqPay
		objectProxyHelper::includeClass('emarket/classes/payment/api/', 'LiqPay');

		$liqpay = new LiqPay($this->getValue('public_key'), $this->getValue('private_key'));

		$sandbox_status = 0;
		if($this->getValue('sandbox_status')) $sandbox_status = 1;

		$domain = $_SERVER['HTTP_HOST'];

		$html = $liqpay->cnb_form(array(
			'version'        => '3',
			'sandbox'        => $sandbox_status,
			'amount'         => $order->getActualPrice(),
			'currency'       => $this->getValue('currency'),
			'description'    => $this->getValue('desc'),
			'pay_way'        => $this->getValue('pay_way'),
			'order_id'       => $order->getId(),
			'type'           => 'buy',
			'result_url'     => $domain . '/emarket/purchase/result/successful/?order_id='.$order->getId().'&amp;order_type=liq_pay',
		));

		$param = array();
		$param['form_html'] = $html;

		list($templateString) = def_module::loadTemplates("emarket/payment/liqpay/".$template, "form_block");

		return def_module::parseTemplate($templateString, $param);
	}

	public function poll() {
		$buffer = outputBuffer::current();
		$buffer->clear();
		$buffer->contentType('text/plain');
		$buffer->push('Sorry, but this payment system doesn\'t support server polling.' . getRequest('param0'));
		$buffer->end();
	}
};
?>

В папке /classes/modules/emarket/classes/payment/ найти папочку api, если нет, то создать и положить в нее файл LiqPay.php.

Далее, в корне сайта положить файл liqpay-server.php, это API файл для сервиса LiqPay, который примет пост запрос от сервиса LiqPay и если заказ будет успешно оплачен, то изменит статус заказа на «готов», а статус оплаты на «принята».

Очень важно, в строке $pay = umiObjectsCollection::getInstance () ->getObject (1272), указать ваш ID способа оплаты из модуля интернет-магазин.

<?php
include 'standalone.php';

if(isset($_POST['signature']) && isset($_POST['data'])) {
    // Указать сюда id способа оплаты модуля ИМ,
    // чтобы вытянуть $public_key и $private_key
    $pay = umiObjectsCollection::getInstance()->getObject(1272);

    $public_key = $pay->getValue('public_key');
    $private_key = $pay->getValue('private_key');

    $liq_pay_data = json_decode(base64_decode($_POST['data']), TRUE);
    $sign = base64_encode(sha1( $private_key . $_POST['data'] . $private_key, 1));

    if($liq_pay_data['status'] == 'sandbox' or $liq_pay_data['status'] == 'success') {
        // Обязательно, иначе класс order не подключится!!!
        cmsController::getInstance()->getModule("emarket");

        $order = order::get($liq_pay_data['order_id']);
        $order->setOrderStatus('ready');
        $order->setPaymentStatus('accepted');
    }
}
?>

Далее в файл «payment.xsl», расположенный по адресу /templates/demodizzy/xslt/modules/emarket/purchase добавьте шаблон:

<xsl:template match="purchasing[@stage = 'payment'][@step = 'liqpay']">
	<xsl:value-of select="form_html" disable-output-escaping="yes" />
	<xsl:call-template name="form-send" />
</xsl:template>

Готово с программированием, можно приступить к настройке магазина

Создание магазина в LiqPay и добавление способа оплаты в UMI.CMS.

Для создания магазина нужно перейти на сайт liqpay, авторизоваться и создать магазин:

Screenshot_3

Screenshot_4

Screenshot_5

Screenshot_6

Screenshot_7

В настройках магазина укажите поля «Наличие order_id» и «URL уведомлений сервер-сервер.
URL»: http[s]://ваш_сайт/liqpay-server.php.

Screenshot_10

Далее перейти в UMI, модуль интернет магазин и добавить новый способ оплаты LiqPay и заполнить поля приватный и публичный ключ, включить песочницу:Screenshot_8

На этом пожалуй и все. Хочу оговориться, что данный метод работает на UMI.CMS версии 2.9.7. Думаю, что в новых версиях координально ничего не поменяли 🙂

Готовый код можно сказать umi-liq-pay и найти код на GitHub