Перейти к содержимому


Фотография
* * * * * 3 Голосов

Создание элемента платежной системы (v220)

faq 220 платежная система

Сообщений в теме: 4

#1 Cheren-dow

Cheren-dow

Отправлено 29 June 2015 - 13:19

*
Популярное сообщение!

В данной теме постараюсь полностью описать возможности JBZoo 220 по интеграции со сторонними платежными системами. Иначе говоря - создание элемента платежной системы.

 

1. Расположение элементов

Элементы находятся в папке

\media\zoo\applications\jbuniversal\cart-elements\payment

внутри находятся папки с названием элемента, а внутри каждой находится минимум 2 файла - это основной файл элемента(расширение php) и файл конфигурации(xml)

 

Например мы хотим сделать интеграцию с платежной системой Yandex Касса (хочу оговориться, что полной интеграции с каким то из сервисов тут не будет).

 

В корневой папке мы создаем папку для нашего элемента например с названием yandexkassa. Внутри нашей папке создаем 2 файла

yandexkassa.php
yandexkassa.xml

 

2. Необходимый минимум кода в файлах

2.1 Файл конфигурации должен иметь следующий вид

<?xml version="1.0" encoding="utf-8"?>
<element type="element" group="Core" hidden="false">
    <name>JBZOO_ELEMENT_PAYMENT_YANDEXKASSA_NAME</name>
    <author>JBZoo.com</author>
    <creationDate>2015</creationDate>
    <copyright>Copyright (C) JBZoo.com</copyright>
    <authorEmail>admin@jbzoo.com</authorEmail>
    <authorUrl>http://jbzoo.com</authorUrl>
    <version>1.0</version>
    <description>JBZOO_ELEMENT_PAYMENT_YANDEXKASSA_DESC</description>

    <params>

        <param name="description" type="textarea" 
            label="JBZOO_ELEMENT_DESCRIPTION" default="JBZOO_ELEMENT_PAYMENT_YANDEXKASSA_DEFAULT_DESCRIPTION"
            description="JBZOO_ELEMENT_ELEMENT_DESCRIPTION_DESC" />

        <!-- ВАШИ ПАРАМЕТРЫ ДЛЯ ЭЛЕМЕНТА -->
    </params>

</element>

Тут ни каких проблем возникнуть не должно. Внутри группы params описываем необходимые значения которые требуются для авторизации в платежной системе.

 

Например платежная система LiqPay для работы требует как минимум 2 параметра которые должны передаваться в запросе. Пример можно посмотреть в файле

\media\zoo\applications\jbuniversal\cart-elements\payment\liqpay\liqpay.xml

2.2 Класс элемента платежной системы.

Название класса состоит из 2-х частей это префикс(JBCartElementPayment) и название платежной системы, т.е это название нашей папки. Наш класс должен наследоваться от родительского класса JBCartElementPayment который расположен  по пути

\media\zoo\applications\jbuniversal\cart-elements\core\payment\payment.php

Именно в этом классе находятся необходимый набор методов - API по платежным системам.

 

Наш файл по пути

media\zoo\applications\jbuniversal\cart-elements\payment\yandexkassa\yandexkassa.php

Имеет следующее содержимое

<?php

// no direct access
defined('_JEXEC') or die('Restricted access');

/**
 * Class JBCartElementPaymentYandexKassa
 */
class JBCartElementPaymentYandexKassa extends JBCartElementPayment
{

}

 

3. Классы и методы при создании элемента.

Минимальный набор методов в классе это:

  1. getRedirectUrl - должен вернуть ссылку на платежную систему, страницу оплаты (например в элементе qiwi данный метод возвращает ссылку на страницу для ввода номера телефона - об этом чуть позже).
  2. isValid - функция, которая вызывается роботом платежной системы. Тут происходит валидация платежа, если функция вернула true, то заказ будет отмечен на сайте как "оплачен" со всеми последствиями (письма итд)
  3. getRequestOrderId - номер заказа из реквеста от робота. Обычно переменная уникальная, поэтому ф-я используется для определения, что это именно робот робокассы или какой то другой платежной системы.
  4. getRequestOrderSum - сумма оплаты, которую отправил робот. Используется для валидации, что сумма оплаты совпадает с суммой в заказе.

Рассмотрим по подробнее каждый класс.

 

В методе getRedirectUrl обычно добавляются необходимые параметры которые запрашивает платежная система. Разберем пример для РобоКассы минимальный набор это:

'OutSum' = стоимость заказа в валюте, выбранной Продавцом через интерфейс администрирования
'InvId' = номер заказа
'MrchLogin' = логин Продавца (обычно данные которая предоставляет платежная система устанавливаются в конфиге платежного элемента как параметры);
'Desc' = описание платежа
'SignatureValue' = контрольная сумма MD5 (подпись). У разных сервисов своя контрольная сумма (Хэш)

Разберем код:

    public function getRedirectUrl()
    {
        /*
         * получаем нашу сумму(объект). _getOrderAmount - это внутренний метод который производит конвертацию
         */
        $orderAmount = $this->_getOrderAmount();

        /*
         * $this->isDebug() - возвращает true или false в зависимости от параметра (тестовый режим) в настройках элемента
         * исходя их этого можно перенаправлять пользователя на тестовый или боевой сервер
         */
        $merchantUrl = $this->isDebug() ? $this->_testUrl : $this->_realUrl;

        /*
         * Массив данных для передачи в ссылке
         */
        $fields = array(
            'OutSum'         => $orderAmount->val(), // значение цены т.е цифры 1500
            'InvId'          => $this->getOrderId(), // id созданного заказа
            'MrchLogin'      => $this->config->get('login'), // из конфига элемента получаем login
            'Desc'           => $this->getOrderDescription(), // получаем описание платежа
            'SignatureValue' => $this->_getSignature(), // это внутренний метод для создания хэша из данных в соответствие с документацией
        );

        /*
         * Перенаправляем пользователя на страницу платежной системы
         * $this->_jbrouter->query($fields) - аналог http_build_query
         */
        return $merchantUrl . '?' . $this->_jbrouter->query($fields);
    }

Если вы сделали правильный редирект с необходимыми данными, пользователя перенаправит на страницу оплаты платежной системы.

 

В методе isValid происходит проверка данных. Зачастую сравниваются подписи. Т.е робот присылает нам данные, а мы должны их сравнить. В случае Робокассы:

    public function isValid($params = array())
    {
        /*
         * Получаем хэш от робота и приводим его к верхнему регистру
         */
        $crc   = JString::trim(JString::strtoupper($_REQUEST["SignatureValue"]));
        
        /*
         * Создаем хеш из своих данных согласно документации
         */
        $myCrc = JString::trim(JString::strtoupper(md5(implode(':', array(
            $_REQUEST['OutSum'],
            $this->getOrderId(),
            $this->config->get('password2')
        )))));

        if ($crc === $myCrc) {
            return true;
        }

        return false;
    }

В методе getRequestOrderId мы возвращаем $_REQUEST['InvId'] - в этой переменной робот присылает id заказа.

В методе getRequestOrderSum мы возвращаем объект цены.

 

Стоит отметить для работы с объектом цены используется

$this->_order->val();

это аналог

JBCart::val();

Более подробно о работе с объектом цены можете узнать из темы.

 

 

 

Не мало важным методом является renderResponse. Данный метод должен оповестить(вывести согласно документации необходимую информацию) робота. В случае Робокассы необходимо вывести текст - OK234, где 234 это номер заказа (ID).

Данный вывод находиться в родительском классе:

media\zoo\applications\jbuniversal\cart-elements\core\payment\payment.php

Именно поэтому в элементе робокассы вы не найдете переопределенный метод renderResponse. В случае Qiwi необходимо было отдать результат роботу в виде XML, поэтому в файле qiwi

\media\zoo\applications\jbuniversal\cart-elements\payment\qiwi\qiwi.php

Вы можете увидеть переопределенный метод renderResponse.

    public function renderResponse()
    {
        header("HTTP/1.1 200 OK");
        header('content-type: text/xml; charset=UTF-8');
        $response = '<!--?xml version="1.0"?--><result><result_code>0</result_code></result>';
        jexit($response);
    }

При разработке платежного элемента для QIWI нам потребовалось создать дополнительный экшен который выводил бы форму для ввода номера телефона, поэтому API расширилось и добавилось несколько методов.

 

1. renderPaymentForm - метод который выводит форму с помощью хелпера jbform, метода render который расположен

\media\zoo\applications\jbuniversal\framework\helpers\jbform.php

Что бы вывести форму необходимо создать xml файл формы, а ее расположение должно быть в

media\zoo\applications\jbuniversal\cart-elements\payment\ПЛАТЕЖНАЯ_СИСТЕМА\forms\НАЗВАНИЕ_ФОРМЫ.xml

далее в методе выводим форму

public function renderPaymentForm()
    {
        return $this->app->jbform->render('default', array(
            'action' => 'index.php?' . $this->_jbrouter->query(array(
                    'option'     => 'com_zoo',
                    'controller' => 'basket',
                    'task'       => 'form',
                    'orderId'    => $this->_jbrequest->get('orderId')
                )),
            'submit' => JText::_('JBZOO_BUTTON_SUBMIT_SHOW')
        ));
    }

Первый параметр это название формы, второй это массив данных\атрибутов формы. В action мы устанавливаем тот же URL для того что бы после отправки формы методом POST сделать валидацию через метод элемента validatePaymentForm и выполнить какое то действие после удачной проверки с помощью метода actionPaymentForm. Данные методы достаточно редко могут использоваться и пока что из всех элементов платежек данные методы используются только в Qiwi. Структура xml формы похожа на стандартные xml всей joomla, посмотреть можно по адресу:

media\zoo\applications\jbuniversal\cart-elements\payment\qiwi\forms\default.xml

 

 

4. Как получить данные заказа и параметров элемента при разработке?

  1. $this->config->get('НАЗВАНИЕ_ПАРАМЕТРА', 'ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ') - получение параметров элемента.
  2. $this->getOrder() - вернет объект заказа
  3. $this->getOrderId() - вернет id заказа
  4. $this->getDefaultCurrency() - вернет значение валюты по умолчанию
  5. $this->getOrderSumm() - вернет объект цены
  6. $this->getOrderDescription() - вернет описание для заказа

5. Вывод логотипа платежной системы в списке.

Для этого необходимо создать файл по следующему пути:

\media\zoo\applications\jbuniversal\cart-elements\payment\ПЛАТЕЖНАЯ_СИСТЕМА\tmpl\submission.php

с выводом картинки(пример из qiwi):

<?php

// no direct access
defined('_JEXEC') or die('Restricted access');

?>

<img src="<?php echo JUri::root(); ?>media/zoo/applications/jbuniversal/cart-elements/payment/qiwi/assets/logo.png">

Если вникнуть и потратить не много своего времени, то написание элемента для платежной системы сводится к минимуму. Больше времени займет разбор документации по платежной системе. Постарался по максимуму описать работу с API, если что всплывет еще буду дополнять.


Сообщение отредактировал Cheren-dow: 30 June 2015 - 10:47

  • 9
Изображение
 

#2 laRus

laRus

Отправлено 04 July 2015 - 22:49

Спасибо!


  • 0
..minimum effort for maximum effect? - Oh yeah! It's good!..

#3 eleetggad

eleetggad

Отправлено 23 June 2017 - 02:31

Подскажите, а каким образом происходит создание и регистрация собственного элемента в способах платежа.


  • 0

#4 mmth

mmth

Отправлено 23 June 2017 - 03:18

Подскажите, а каким образом происходит создание и регистрация собственного элемента в способах платежа.

Принцип тот же что и у элементов zoo:

/название_папки/название_папки.php 
/название_папки/название_папки.xml

вот ссылка на статью документацию http://jbzoo.ru/docs...e-element-basic

и вот еще ссылка она выше была тоже упомянута http://forum.jbzoo.c...ki-v-jbzoo-220/


Сообщение отредактировал mmth: 23 June 2017 - 03:27

  • 0

#5 Rivermc

Rivermc

Отправлено 28 March 2018 - 09:43

public function getRedirectUrl()
	{

		require_once JPATH_ROOT .'/vendor/autoload.php';

		$shopId = $this->config->get('shopid');
		$secret = $this->config->get('secret');
		$return_url = $this->config->get('return_url');
		
		$order = $this->getOrder();
		$orderId = $this->getOrderId();
		$payCurrency = $this->getDefaultCurrency();
		$orderAmount = $this->_order->val($this->getOrderSumm(), $order->getCurrency())->convert($payCurrency);
		$orderAmount = $orderAmount->val();

		$client = new Client();
		$client->setAuth($shopId, $secret);

		$idempotenceKey = uniqid('', true);

		$payment = $client->createPayment(
		        array(
		            'amount' => array(
		                'value' => $orderAmount,
		                'currency' => $payCurrency
		            ),
		            'confirmation' => array(
		                'type' => 'redirect',
		                'return_url' => $return_url,
		            ),
		        ),
		        $idempotenceKey
		    );

		$payment = json_encode($payment);
		$payment = json_decode($payment, true);

		$redirect_url = $payment['confirmation']['confirmation_url'];

		$this->logInfo($orderAmount);
		$this->logInfo($payCurrency);
		$this->logInfo($orderId);
		$this->logInfo($shopId);
		$this->logInfo($secret);
		$this->logInfo($return_url);
		$this->logInfo($redirect_url);

		return $redirect_url;
	}

Написал вот такую функцию, на выходе получается ссылка типа https://money.yandex...00-1a4e2fceb621, при переходе по ссылке открывается форма оплаты все впорядке, при редиректе на сайте отправляет в успешный заказ в корзине... Включил робокассу, прописал ссылку на редирект свою, получил тот же результат, отправил меня не на какую свою страницу а сразу в успешной заказ... 


  • 0





Темы с аналогичным тегами faq, 220, платежная система

Click to return to top of page in style!