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


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

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

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

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

#1 Cheren-dow

Cheren-dow

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

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

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

 

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

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

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

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

 

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

 

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

  1. yandexkassa.php
  2. yandexkassa.xml

 

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <element type="element" group="Core" hidden="false">
  3. <name>JBZOO_ELEMENT_PAYMENT_YANDEXKASSA_NAME</name>
  4. <author>JBZoo.com</author>
  5. <creationDate>2015</creationDate>
  6. <copyright>Copyright (C) JBZoo.com</copyright>
  7. <authorEmail>admin@jbzoo.com</authorEmail>
  8. <authorUrl>http://jbzoo.com</authorUrl>
  9. <version>1.0</version>
  10. <description>JBZOO_ELEMENT_PAYMENT_YANDEXKASSA_DESC</description>
  11.  
  12. <params>
  13.  
  14. <param name="description" type="textarea"
  15. label="JBZOO_ELEMENT_DESCRIPTION" default="JBZOO_ELEMENT_PAYMENT_YANDEXKASSA_DEFAULT_DESCRIPTION"
  16. description="JBZOO_ELEMENT_ELEMENT_DESCRIPTION_DESC" />
  17.  
  18. <!-- ВАШИ ПАРАМЕТРЫ ДЛЯ ЭЛЕМЕНТА -->
  19. </params>
  20.  
  21. </element>

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

 

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

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

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

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

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

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

 

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

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

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

  1. <?php
  2.  
  3. // no direct access
  4. defined('_JEXEC') or die('Restricted access');
  5.  
  6. /**
  7. * Class JBCartElementPaymentYandexKassa
  8. */
  9. class JBCartElementPaymentYandexKassa extends JBCartElementPayment
  10. {
  11.  
  12. }

 

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

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

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

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

 

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

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

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

  1. public function getRedirectUrl()
  2. {
  3. /*
  4. * получаем нашу сумму(объект). _getOrderAmount - это внутренний метод который производит конвертацию
  5. */
  6. $orderAmount = $this->_getOrderAmount();
  7.  
  8. /*
  9. * $this->isDebug() - возвращает true или false в зависимости от параметра (тестовый режим) в настройках элемента
  10. * исходя их этого можно перенаправлять пользователя на тестовый или боевой сервер
  11. */
  12. $merchantUrl = $this->isDebug() ? $this->_testUrl : $this->_realUrl;
  13.  
  14. /*
  15. * Массив данных для передачи в ссылке
  16. */
  17. $fields = array(
  18. 'OutSum' => $orderAmount->val(), // значение цены т.е цифры 1500
  19. 'InvId' => $this->getOrderId(), // id созданного заказа
  20. 'MrchLogin' => $this->config->get('login'), // из конфига элемента получаем login
  21. 'Desc' => $this->getOrderDescription(), // получаем описание платежа
  22. 'SignatureValue' => $this->_getSignature(), // это внутренний метод для создания хэша из данных в соответствие с документацией
  23. );
  24.  
  25. /*
  26. * Перенаправляем пользователя на страницу платежной системы
  27. * $this->_jbrouter->query($fields) - аналог http_build_query
  28. */
  29. return $merchantUrl . '?' . $this->_jbrouter->query($fields);
  30. }
  31.  

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

 

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

  1. public function isValid($params = array())
  2. {
  3. /*
  4. * Получаем хэш от робота и приводим его к верхнему регистру
  5. */
  6. $crc = JString::trim(JString::strtoupper($_REQUEST["SignatureValue"]));
  7. /*
  8. * Создаем хеш из своих данных согласно документации
  9. */
  10. $myCrc = JString::trim(JString::strtoupper(md5(implode(':', array(
  11. $_REQUEST['OutSum'],
  12. $this->getOrderId(),
  13. $this->config->get('password2')
  14. )))));
  15.  
  16. if ($crc === $myCrc) {
  17. return true;
  18. }
  19.  
  20. return false;
  21. }

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

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

 

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

  1. $this->_order->val();

это аналог

  1. JBCart::val();

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

 

 

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

  1. public function renderPaymentForm()
  2. {
  3. return $this->app->jbform->render('default', array(
  4. 'action' => 'index.php?' . $this->_jbrouter->query(array(
  5. 'option' => 'com_zoo',
  6. 'controller' => 'basket',
  7. 'task' => 'form',
  8. 'orderId' => $this->_jbrequest->get('orderId')
  9. )),
  10. 'submit' => JText::_('JBZOO_BUTTON_SUBMIT_SHOW')
  11. ));
  12. }

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

  1. 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. Вывод логотипа платежной системы в списке.

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

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

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

  1. <?php
  2.  
  3. // no direct access
  4. defined('_JEXEC') or die('Restricted access');
  5.  
  6. ?>
  7.  
  8. <img src="<?php echo JUri::root(); ?>media/zoo/applications/jbuniversal/cart-elements/payment/qiwi/assets/logo.png">
  9.  

Если вникнуть и потратить не много своего времени, то написание элемента для платежной системы сводится к минимуму. Больше времени займет разбор документации по платежной системе. Постарался по максимуму описать работу с 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

eleetggad сказал(а) 23 Июн 2017 - 01:31:

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

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

  1. /название_папки/название_папки.php 
  2. /название_папки/название_папки.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

  1. public function getRedirectUrl()
  2. {
  3.  
  4. require_once JPATH_ROOT .'/vendor/autoload.php';
  5.  
  6. $shopId = $this->config->get('shopid');
  7. $secret = $this->config->get('secret');
  8. $return_url = $this->config->get('return_url');
  9. $order = $this->getOrder();
  10. $orderId = $this->getOrderId();
  11. $payCurrency = $this->getDefaultCurrency();
  12. $orderAmount = $this->_order->val($this->getOrderSumm(), $order->getCurrency())->convert($payCurrency);
  13. $orderAmount = $orderAmount->val();
  14.  
  15. $client = new Client();
  16. $client->setAuth($shopId, $secret);
  17.  
  18. $idempotenceKey = uniqid('', true);
  19.  
  20. $payment = $client->createPayment(
  21. array(
  22. 'amount' => array(
  23. 'value' => $orderAmount,
  24. 'currency' => $payCurrency
  25. ),
  26. 'confirmation' => array(
  27. 'type' => 'redirect',
  28. 'return_url' => $return_url,
  29. ),
  30. ),
  31. $idempotenceKey
  32. );
  33.  
  34. $payment = json_encode($payment);
  35. $payment = json_decode($payment, true);
  36.  
  37. $redirect_url = $payment['confirmation']['confirmation_url'];
  38.  
  39. $this->logInfo($orderAmount);
  40. $this->logInfo($payCurrency);
  41. $this->logInfo($orderId);
  42. $this->logInfo($shopId);
  43. $this->logInfo($secret);
  44. $this->logInfo($return_url);
  45. $this->logInfo($redirect_url);
  46.  
  47. return $redirect_url;
  48. }

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


  • 0





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

Click to return to top of page in style!