Анализ плагинов для Hikashop Joomla показал, что почти все платежные плагины устроены одинаково и, как правило, состоят всего из 2-х файлов php и обязательного манифест-файла xml. Структура файлов php довольна проста. Один файл содержит административную форму, требующую ввода ключа для авторизации (секретный код) и заполнения полей, необходимых для работоспособности плагина (в т.ч. банковские реквизиты для составления счета на оплату), а другой - осуществляет управление и передачу данных о заказе через платежный шлюз в необходимом формате и переход на форму платежной страницы.
ДАННЫЕ
данные о магазине (расч/счет и адрес) данные о заказе (что - как - чем - куда отправить) данные о способе оплаты (счет или банковская карта)
{module title="Example_Hikashop"}
Стандартная платежная (или корректнее, предплатежная ) управляющая страница, как вариант, также может представлять собой в браузере страничку стандартного счета на оплату с кнопками "распечатать", "скачать" и "оплатить". Другим вариантом работы плагина может быть выбор способа оплаты произведенного заказа в интернет-магазине - оплата банковскими картами, оплата по счету, оплата различными платежными системами - Яндекс.Деньги, WebMoney и т.д., Все это может быть организовано как через платежный шлюз Сберегательного банка, так и через Тинькофф-банк, Альфа-банк, РФИ-банк и т.п., а также через сайты всевозможных посредников. Почти все банки берут за возможность получать деньги на свой расчетный счет небольшую комиссию - от 1 до 4% за платеж.
Всегда для правильной работы платежного плагина должно быть включено - "получать уведомления о статусе заказа (об оплате)". Но, именно, для счета на оплату эту кнопку надо (можно) выключить - ведь работать плагин может автономно (без перехода на сайт Сбербанка).
Можно ли самому создать плагин Hikashop (или вкладку в готовом платежном плагине) - универсальный счет на оплату средствами Hikashop - ни зная языка PHP ? Отвечу коротко, да! можно - если Вы обладаете аналитическим умом и кучей свободного времени (умеете анализировать и использовать метод копировать-вставить).
Создаваемый нами плагин Hikashop для Joomla 4+ (Example_Bank) будет осуществлять автоматический прием денежных средств на Ваш расчетный банковский счет посредством оплаты через банковские карты оплаты и традиционным способом - посредством выписки счета на оплату (формат pdf + печать) и соответствовать требованиям ФЗ-54, а сам чек при реализации товара поддерживать формат фискальных данных ФФД 1.1 - отражать сумму и товарные позиции покупки (Вы можете продавать все группы товаров, кроме маркированных - лекарства, обувь, духи, табак, шины, фототехника и изделий легкой промышленности).
Если Вам это интересно, продолжим...
При разработке модуля оплаты товаров для интернет-магазина Hikashop мы взяли самого надежного на данный момент платежного агрегатора - СБЕРБАНК. Даже если ваш бизнес использует расчетный счет в другом банке, этот плагин также подойдет для Вас, т.к. агрегатор лишь является посредником между Вами и Вашим расчетным счетом, за что берет коммисию при переводе денег Вам. Другими платежыми системами при интернет-экваринге могут быть, например, банки: TINKOFF-банк, РФИ-банк и др. или же электронные платежные системы PALPAY, eBay, QIWI и др., которые отличаются величиной комиссии и способами вывода денежных средств с платежной платформы (только безналичные расчеты, выбор валюты при переводе и т.д.).
Для нашего "простого" случая (ФФД 1.1) нам понадобятся уже созданные другими разработчиками следующие заготовки с кодом HTML и PHP:
базовый бесплатный курс по PHP + базовые специфичные знания в написании кода PHP ( иначе ошибка 500 - белый пустой экран или казябры )
Так как ценность исходного платежного плагина BankTransfer невелика, то все изменения можно вносить прямо в файл banktransfer.php (но при условии !!! - не обновлять Hikashop во время разработки плагина) . Любой плагин Hikashop состоит из следующих обязательных аттрибутов:
var $pluginConfig = array ( ... ) - ввод параметров через админку
public function onBeforeorderCreate (&$order, &$do){ ... } - вывод предупреждений о незаполненых параметрах в браузер
public function onAfterOrderConfirm (&$order, &$methods, $method_id) { ...} - привязка параметров к заказу (банковские реквизиты, товарные позиции и доставка)
public function onPaymentNotification (&$statuses) { ... } - реакция плагина на сообщения от платежного шлюза о прохождении платежа
Специальная конфигурация платежного плагина $pluginConfig
Для использования параметров при создания формы счета на оплату в специальной конфигурации $pluginConfig платежного плагина BankTransfer создадим массив с переменными, которые можно заполнить (администативная панель Hikashop --> способы оплаты --> плагин banktransfer) своими значениями.
class plgHikashoppaymentBanktransfer extends hikashopPaymentPlugin { var $name = 'banktransfer'; var $accepted_currencies = array("RUB"); var $multiple = true; var $pluginConfig = array( 'information' => array('BANK_ACCOUNT_INFORMATION', 'big-textarea'), 'return_url' => array('RETURN_URL', 'input'), 'key_rs' => array("Расчетный счет (банка)",'input'), 'key_bic' => array("БИК (банка)",'input'), 'key_korr' => array("Корреспондентский счет (банка)",'input'), 'key_bank' => array("Название банка",'input'), 'key_bank_sity' => array("Местонахождение банка",'input'), 'company_desc' => array("Название организации",'input'), 'company_inn' => array("ИНН организации",'input'), 'company_kpp' => array("КПП организации",'input'), 'company_address' => array("Адрес организации",'input'),
...сюда будем добавлять новые необходимые параметры...
);
Код PHP даст нам новые поля для заполнения, которые мы затем будем использовать в форме счета на оплату (старые четыре поля останутся без изменений). Некоторые поля админ-формы заполняются автоматически по умолчанию, благодаря функции function getPaymentDefaultValues(&$element)
При совершенствовании плагина другую часть кода (2 этап) можно взять из скачанного файла hikashop_rfibank --> rficl.php (это даст нам в дальнейшем дополнительную возможность использовать другие способы оплаты на странице END плагина)
'key' => array("Ключ платежа (ЛК РФИ)",'input'), //---можно убрать 's_key' => array("Секретный ключ (ЛК РФИ)",'input'), //---можно убрать 'notification' => array('ALLOW_NOTIFICATIONS_FROM_X', 'boolean','0'), //---можно убрать -- уведомления от Rficb 'paymethod' => array('Выбор способа оплаты', 'boolean','0'), 'paymethod_cart' => array('Пластиковые карты', 'boolean','0'), 'paymethod_wm' => array('Webmoney', 'boolean','0'), 'paymethod_ym' => array('Яндекс.Деньги', 'boolean','0'), 'paymethod_mc' => array('Мобильный телефон', 'boolean','0'), 'paymethod_qiwi' => array('Qiwi', 'boolean','0'), 'widget' => array('Виджет оплаты на странице сайта', 'boolean','0'), 'cancel_url' => array('CANCEL_URL_DEFINE','html',''), 'notify_url' => array('NOTIFY_URL_DEFINE','html',''), 'invalid_status' => array('INVALID_STATUS', 'orderstatus'), 'verified_status' => array('VERIFIED_STATUS', 'orderstatus')
По умолчанию все другие способы оплаты выключены (все bolean в массивах равны 0) .
Справочно, при использовании других платежных систем (QIWI, Webmoney, Яндекс.Деньги) необходима дополнительная регистация интернет-магазина на этих платежных площадках.
Чтобы использовать корректно наши параметры при создании счета, надо использовать внутренние, уже созданные служебные фунции компонента Hikashop (почти все функции находятся в папке helpers.php папка classes : administrator --> components --> com_hikashop --> classes ) или создать свои, новые функции, необходимые для платежного плагина.
справочно ** - основная переменная в HIKASHOP - $currencyHelper (или $currencyClass) находится через функцию hikashop_get ( 'class.currency' ) и обеспечивает различное форматирование величины суммы заказа
функция, проверки заполнения переменных значениями $pluginConfig - public function onBeforeOrderCreate(&$order, &$do) - типовая функция Hikashop
public function onBeforeOrderCreate(&$order,&$do){ if(parent::onBeforeOrderCreate($order, $do) === true) return true;
//проверка ввода значений if((empty($this->payment_params->key_rs) || empty($this->payment_params->key_bic) || empty($this->payment_params->key_korr) || empty($this->payment_params->key_bank) ||..другие параметры специальной конфигурации..) && $this->plugin_data->payment_id == $order->order_payment_id) { $this->app->enqueueMessage('Пожалуйста, проверьте конфигурацию Вашего плагина 'BankTransfer' ' - Вы не заполнили поля для работоспособности плагина); $do = false; } }
функция, включающаяся после подверждения заказа, тестирующая поля заполнения параметров, выдающая предупреждения и дающая аргументы для заполнения - function onAfterOrderConfirm(&$order,&$methods,$method_id)
Эта функция обеспечивает страницу END (страницу браузера до перехода на платежный шлюз агрегатора - предплатежную страницу) ключевыми параметрами через запись $this->параметр . Размер этой фунции плагина может варироваться от нескольких строчек кода до нескольких страниц в зависимости от задачи
public function onAfterOrderConfirm(&$order, &$methods, $method_id) { parent::onAfterOrderConfirm($order, $methods, $method_id);
... код ...
$this-> ...параметры...
...любимый стандарт Hikashop...передача через массив $vars = array ()...
$this->vars = $vars;
...сторонние разработчики...например, передача параметров через функцию getReceipt($order)...
$this->getReceipt($order); //функция должна быть размещена в теле плагина и иметь все необходимые параметры
//(внутри class plgHikashoppaymentBanktransfer)
}
Как правило, в целях безопасности, весь код в Hikashop идет через проверку пустоты переменной empty (...) , наличия установленного значения isset (...) или соответствия условиям - if (!empty (...) ) . Так как мы модернизируем сущеструющий файл banktransfer.php, доступ в дальнейшем у нас будет только к переменным $amount (сумма заказа через $this->amount ) и $order_number (номер заказа через $this->order_number ) - они упоминаются в старом файле . Других переменных $this -> у нас нету - поэтому доступа к другим параметрам (созданным вами переменным) на платежной странице нет - их надо прописать !!!
ВАРИАНТ 1
Например, простейший вариант для доступа к переменной, создайте в файле banktransfer.php строчку и смело обращайтесь к ней в созданной Вами форме --> и доступ к переменной через php будет и на предплатежной странице (файл end_banktransfer.php)
$this->email =Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. ';
ВАРИАНТ 2
Наша задача шире - максимально автоматизировать получение необходимых данных для корректного составления счета на оплату
ДАННЫЕ
данные о магазине (расч/счет и адрес) данные о заказе (что - кому - как - чем - куда отправить)
Поэтому для стандартного способа Hikashop - через переменную $vars - создадим для начала внутри функции onAfterOrderConfirm массив array, обеспечивающий нам некоторые дополнительные параметры для счета в требуемом формате (ключ ->значение )
$vars = array( 'description' => "номер заказа : ".$order->order_number, 'order_id' => $order->order_id, );
...и...
$vars['first_name'] = @$order->cart->$address_type->address_firstname;
$vars['last_name'] = @$order->cart->$address_type->address_lastname;
$vars['middle_name'] = @$order->cart->$address_type->address_middle_name;
...или...
Сторонние разработчики (в т.ч. СБЕРБАНК) используют для этих целей различные переменные - $ args, $rbs_arg, $requestData - эти переменные обеспечиваю нужными параметрами платежный шлюз (обычно это указано в руководстве по интеграции платежного шлюза)
$args = Array( 'userName' => ...код... , // требование платежной платформы Сбербанка использовать именно такую переменную
для идентификации магазина ('userName') 'password' => ...код..., 'amount' => ...код..., 'orderNumber' => ...код..., 'returnUrl' => ...код..., 'jsonParams' => json_encode(array('CMS' => 'Joomla 3.x', 'Module-Version' => VERSION)), );
МОЙ ПРИМЕР КОДА - вся "хитрость" в нахождении параметров 'tax' - taxType, taxVat, taxRate, taxSum, taxNamekey, taxAmount
if ($this->payment_params->rbs_send_order == 1) { $tax_sum ; //накопительный регистр для суммы налога $itemsCnt = 1; foreach ($order->cart->products as $product) { $product_data[] = array( 'positionId' => $itemsCnt++, 'name' => mb_substr(strip_tags($product->order_product_name), 0, 127), 'itemCode' => $product->order_product_code, 'quantity' => array( 'value' => $product->order_product_quantity, 'measure' => JText::_('шт.'), ), 'itemPrice' => round($product->order_product_price *100), // цена в копейках 'itemAmount' => round($product->order_product_price * 100) * $product->order_product_quantity, // цена в копейках 'tax' => array( // ***обязательно для сбербанка - tax и taxType 'taxType' => '6', //ставка НДС по Сбербанку // 'taxType' => $item_tax, // сбербанк использует цифры /*Ставка НДС - taxVat, в Сбербанке доступны следующие значения: 0 – без НДС; 1 – НДС по ставке 0%; 2 – НДС чека по ставке 10%; 3 – НДС чека по ставке 18%; 4 – НДС чека по расчётной ставке 10/110; 5 – НДС чека по расчётной ставке 18/118. 6 - НДС чека по ставке 20% ------------- дополнить самим 7 - НДС чека по ставке 20/120------------ дополнить самим Обязательно для мерчантов с фискализацией*/ 'taxVat' => $taxVat , // ставка в строчно-буквенном варианте 'taxRate' => $taxRate .JText::_('%'), //ставка налога в цифровом варианте 'taxSum' => number_format(round($product->order_product_tax,(int)$this->currency->currency_locale['int_frac_digits']), 2, '.', '') , 'taxNameKey'=>mb_substr(strip_tags($taxNameKey), 0, 127), 'taxAmount' =>number_format(round($taxAmount * $product->order_product_quantity,(int)$this->currency->currency_locale['int_frac_digits']), 2, '.', ''), //общая сумма по налогу для этого товара ), ); $tax_sum += $product->order_product_tax; $orderBundle['cartItems']['items'] = $product_data; //использована запись от разработчиков Virtuemart }
*** - БУДЬТЕ ОСТОРОЖНЫ ___ если использовать лишние ("ненужные" по мнению Сбербанка) параметры, такие 'taxVat' или 'taxAmount' ответом платежного шлюза Сбербанка при отправке данных будет сообщение - ошибка 8 -неверен $orderBundle
P.S
Специфика передачи данных через платежный шлюз Сбербанка в начале ставила меня в тупик - при передаче данных для фискализации чека - постоянно приходило сообщение, что totalAmount не равен сумме заказа - вылечил заменой кода (убрал $orderBundle['cartItems']['items'] = $product_data) - использовал другую запись внутри цикла forech типа ---> $items[] = $item + использовать запись 'itemPrice' => round($product->order_product_price *100) и не в коем случае 'itemPrice' => round($product->order_product_total_price *100)
!!!! Эта ошибка !!! возникала из-за использования в плагине метода доставки $order->cart->shipping в режиме фискализации чека записи $orderBundle['cartItems']['items'] [ ]= $itemShipping (от разработчиков Тинькофф) - пришлось уйти от этого формата в пользу - $items[ ] = $itemShipping плюс использования 'itemPrice' => round($prod'itemPrice' => round($product->order_product_price *100) - без слова total
Также обратите внимание на подключение опций товара ( когда на странице товара появляется возможность вместте с товаром купить дополнительно необходимые опции (дополнительные товары) --> при использовании этого метода также возникает ошибка: количество товара в корзине не соответствует переданным Сбербанку данным).
Вообще, из-за наличия множества параметров многие программисты PHP не любят HIKASHOP, при этом компонент в корне отличается от других платформ интернет-магазинов (Virtuemart, JoomShopping) из-за использования внутри плагина записи -return $this->showPage('end') - обращения к файлу end_banktransfer.php
Поэтому задача получить нужные паметры для отправки на платежный шлюз может вводить в ступор по сравнению с другими задачами. Например, задача получить адрес (через переменную $vars) на фоне получения параметра $orderBundle несколько проще - хотя в Hikashop может использоваться несколько типов адресов: почтовый адрес, адрес доставки, адрес магазина и т.д. - для этих целей используется переменная $address_type. (код для $vars копируется "один-в-один" с PAYPAL)
Еще раз напоминаю, все нужные параметры (которые мы хотим отразить и передать через страницу END ) в HIKASHOP надо найти (с помощью методов get() ) и зафиксировать (передать в переменную $this) в "теле" файла плагина - banktransfer.php.
В дальнейшем, возможно, содержимое вышеупомянутой переменной $vars будет изменяться -> внутри массива появятся дополнительные параметры - "ключ - значение", которые мы вставим через код php в счет на оплату.
$address_type ='shipping_address'; //пока задано принудительно "вручную" - без метода get() - другим значением может быть 'billing_address' или 'no_address'
$vars = array( 'description' => "номер заказа : ".$order->order_number, 'order_id' => $order->order_id,
'company' => $order->cart->$address_type->address_company, //$adress_type - это не ошибка - её надо задать заранее 'first_name'=> $order->cart->$address_type->address_firstname, 'last_name' => $order->cart->$address_type->address_lastname, 'middle_name' => $order->cart->$address_type->address_middle_name, 'zip' => $order->cart->$address_type->address_post_code, 'state' => $order->cart->$address_type->address_state->zone_name, 'city' => $order->cart->$address_type->address_city, 'address_strit' => $order->cart->$address_type->address_street, 'address_dom' => $order->cart->$address_type->address_street2, );
Не стоит излишнее загромождать переменную $vars , тем более в Hikashop есть ёщё интересный метод пополнения дополнительными параметрами платежной страницы - через $vars [ ' parametr ' ] - прямо внури функции function onAfterOrderConfirm(&$order,&$methods,$method_id) вставляем код
(т.е. вышестоящий код зеленого цвета можно представить по-другому )
$vars['first_name'] = @$order->cart->$address_type->address_firstname; // @ - используется ссылка на значение параметра
$vars['last_name'] = $order->cart->$address_type->address_lastname; // используется стандартное передача значения (без @)
В Hikashop для передачи товарной корзины на платежный шлюз - передачи значений $vars [ ' parametr ' ] - используется цикл foreach - для этого прямо внури функции function onAfterOrderConfirm(&$order,&$methods,$method_id) можно вставить нижестоящий код, но лучше от этого сразу отказаться из-за специфичных требований Сбербанка и немного модифицировать код: прежде всего использовать копейки в расчетах, а, во-вторых, использовать другие переменные - $item ['positionId'], $item ['name'], $item ['itemCode'], $item ['guantity'], $item ['itemPrice'], $item ['itemAmount'] и $item ['tax'], а , в-третьих, использовать новый дополнительный параметр, например $item['itemAttributes']['attributes'] - метод и объект платежа
$i = 1; $tax = 0; $config =& hikashop_config(); $group = $config->get('group_options',0);
foreach($order->cart->products as $product) { if($group && $product->order_product_option_parent_id) continue; $vars['item_name_' . $i] = substr(strip_tags($product->order_product_name), 0, 127); $vars['item_number_' . $i] = $product->order_product_code; $vars['amount_'.$i] = number_format(round($product->order_product_price, (int)$this->currency->currency_locale['int_frac_digits']), 2, '.', ''); $vars['quantity_' . $i] = $product->order_product_quantity; $vars['tax_' . $i] = $product->order_product_quantity*number_format(round($product->order_product_price, (int)$this->currency->currency_locale['int_frac_digits']), 2, '.', ''); $tax += round($product->order_product_tax, (int)$this->currency->currency_locale['int_frac_digits']) * $product->order_product_quantity; $i++; }
Вставляем заданные параметры конфигурации через var $pluginConfig = array( )
получаем на платежной странице в счете на оплату интересующие нас данные ->
Поставщик: ООО "Техноклимат", ИНН 2128035787, КПП 213001001, 428038, Республика Чувашия, ул Гражданская, дом 78, к.149
Покупатель: ООО "Покупатель" Петров Сергей Викентьевич 428038 Чувашия Гражданская 20-120
Но простой перенос цикла foreach из файла banktransfer в файл end_banktransfer.php в HIKASHOP приводит ... к ошибкам
При инициализации счета на оплату возникают ошибки в коде ... --> .... не появляется перечень товаров , нарушена порядковая нумерация товара и т.д.
Ошибку надо исправить !!! - в цикле foreach на платежной странице необходимо использовать другой код (т.е. стандартные приемы, которые используют в других примерах по созданию счета ...не работают). И это главная особенность создания платежных плагинов в Hikashop.
foreach ($this->order->cart->products as $this->product)
** - большим подспорьем послужил готовый плагин PAL PAY -- только благодаря анализу кода ошибка была найдена + там же нашел готовое решение для отображения перечня товаров - но будьте осторожны, простое копирование кода ничего не даст, как получилось у меня - особенно при заполнении содержимым функции public function onPaymentNotification(&$statuses) .
функция, выдающая нам сообщение об успешной транзакции платежа - public function onPaymentNotification(&$statuses)
public function onPaymentNotification(&$statuses) {
... скопированный код ...пока не работает...сообщения не обрабатываются
}
Важно!!! все функции, использованные для нахождения параметров, отправки запросов и т.п. , надо прописать внутри нашего класса
class plgHikashoppaymentBanktransfer extends hikashopPaymentPlugin {
... здесь прописать все, в т.ч. вспомогательные функции...иначе работать что-то не будет...
};
- Конструктор (служебная функция) позволяет автоматически подставлять в уже созданные переменные дополнительные значения (пример приведен ниже: в созданном параметре 'notification' внутри $pluginConfig (" Получать уведомления от_") добавить текст для пояснения - от кого получать уведомления , т.е. дополнить его другим значением .
Или же использовать введенные параметры из $pluginConfig для других целей через переменную $this ->
public function __construct($terminalKey, $secretKey) { $this->_api_url = 'https://securepay.tinkoff.ru/v2/'; $this->_terminalKey = $terminalKey; $this->_secretKey = $secretKey;
$secretKey2 = $this->payment_params->rbs_merchant_password
}
В стандартном файле Hikashop переход осуществляется по ссылкам, прописанным в типовой функции public function onAfterOrderConfirm(&$order, &$methods, $method_id). Обращаем внимание на запись - &$ перед аргументом - т.е. используются значения, введенные нами в поля ввода параметров (передача параметров по ссылке).
Основное отличие записи $ от &$ в том, что при $ аргументы в функцию передаются по значению ( при вызове функции, значение, передаваемое в качестве аргумента, просто копируется в локальную переменную, а при &$ копирования значения в локальную переменную не происходит, но появляется связь значения с именем аргумента (теперь, изменяя значение этой переменной внутри функции, мы будем изменять исходное, переданное значение). HIKASHOP_LIVE. - ссылка на текущий сайт с HIKASHOP
var $pluginConfig = array(
'url' => array('URL', 'input'), 'notification' => array('ALLOW_NOTIFICATIONS_FROM_X', 'boolean','0'), }
function __construct(&$subject, $config) { $this->pluginConfig['notification'][0] = JText::sprintf('ALLOW_NOTIFICATIONS_FROM_X','Rfibank'); $this->pluginConfig['cancel_url'][2] = HIKASHOP_LIVE."index.php?option=com_hikashop&ctrl=order&task=cancel_order"; $this->pluginConfig['return_url'][2] = HIKASHOP_LIVE."index.php?option=com_hikashop&ctrl=checkout&task=after_end"; $this->pluginConfig['notify_url'][2] = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify¬if_payment='.$this->name.'&tmpl=component'; return parent::__construct($subject, $config); }
//определено экспериментально, что цифры - это элементы массива параметра плагина, соостоящего из ключа[0], значения[1], значения по умолчанию [2]-
значение [0] - заменить исходное название выбранного параметра плагина другим названием параметра, например словами "ПОЛУЧАТЬ УВЕДОМЛЕНИЯ ОТ .."
значение [1] - //эта замена используется редко
значение [2] - заменить исходное пустое поле параметра input (html) другим значением - например HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify¬if_payment='.$this->name.'&tmpl=component'; .
[другие возможные значения] по документации Hikashop отсутствуют
Типовой код в Hikashop для платежных плагинов черезвычайно короткий - это может выглядеть так (пока без условий):
//перевод on After Order Confirm - "после подтверждения заказа"
public function onAfterOrderConfirm(&$order, &$methods, $method_id) { parent::onAfterOrderConfirm($order, $methods, $method_id);
стандарт Hikashop --> параметры должны быть заданы в $pluginConfig
$notify_url = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=notify¬if_payment=
'.$this->name.'&tmpl=component&lang='.$this->locale . $this->url_itemid;
$return_url = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=checkout&task=after_end&order_id=
'.$order->order_id . $this->url_itemid;
$cancel_url = HIKASHOP_LIVE.'index.php?option=com_hikashop&ctrl=order&task=cancel_order&order_id=
'.$order->order_id . $this->url_itemid;
$vars = array (
стандарт Hikashop
'OrderID' => $order ->order_id,
'Amount' => $order ->round(cart->full_total->prices[0]->price_value_with_tax*100),
...может быть добавлено...
'DATA' => array (
'Email' => $this->user->user_email,
'Connection_type' => 'joomla_hikashop'
),
...или, если нет функции-конструктор... но тогда параметры должны быть указаны в спец. конфигурации $pluginConfig
'return_url' => $return_url,
'notify_url' => $notify_url,
'cancel_url' => $cancel_url,
... или ... но тогда параметры должны быть указаны в спец. конфигурации $pluginConfig
'...' => @$this ->payment_params-> ... ,
'rm' =>(int)@$this ->payment_params ->rm,
...или...
'charset' => 'utf-8',
...то есть создается массив с параметрами, необходимыми для платежной страницы
);
далее при наличии доставки.., заполненного параметра ...выбора НДС - учитываются возможные варианты
...через параметры доставки...
$vars['address'] = @$order->$address_type->...
...через цикл по параметрам корзины заказа...
$i = 1;
$tax = 0;
$config = & hikashop_config();
$group = $config->get('group_options',0); //вариант отображения корзины заказа (товары + доставка)
foreach($order->cart->product as products) {
vars['item_name_'.$i] = ... ;
vars['item_number_'.$i] = ... ;
vars['amount_'.$i] = ... ;
vars['quantity_'.$i] = ... ;
$tax += ... ;
$i++;
};
...через функции и массив...hikashop...
if ($this->payment_params->enabled_taxation) {
.....
...через функции и массив...tinkoff...
function getReceipt($order) {
//настройка Show taxed prices - показать облагаемые налогом цены $config =& hikashop_config(); $include_tax_price = $config->get('price_with_tax'); foreach ($order->cart->products as $product) { $price = $product->order_product_price; $amount = $price + $product->order_product_tax; $taxVat = $this->getTax(); $items[] = array( 'Name' => mb_substr($product->order_product_name, 0, 64), "Price" => round($price * 100), "Quantity" => $product->order_product_quantity, "Amount" => round($amount * $product->order_product_quantity * 100), 'PaymentMethod' => trim($this->payment_params->payment_method), 'PaymentObject' => trim($this->payment_params->payment_object), "Tax" => $taxVat, ); } ...код... }
Видно, что эта функция использует функцию выбора налогообложения - getTax ( ) - следовательно, надо прописать и её, а в дальнейшем ещё и function getReceipt($order) приводят к нормализованному виду (в общем, ещё та задачка написания кода php), увеличивая и без того разросшийся код php - в конечном итоге файл может возрасти из 72 строчек до 600+.
В файле ****_end.php любого платежного плагина есть HTML конструкция - <form> </form> , которая отправляет на сервер значения переменных из массива $vars через переменную $value , актуальных именно для конкретной платежной платформы (подключение к платежному шлюзу (серверу) организовано через action и метод post, т.е. организован скрытый ввод данных ) и ждет ответа
<form> id="hikashop_bankoplata_form" name="hikashop_bankoplata_form " action="<?php echo $this ->payment_params -> url; ?>" method="post" >
<div id="hikashop_bankoplata_end" class="hikashop_bankoplata_end ">
<input> id="hikashop_bankoplata_button" type="submit" class="btn btn-primary" value ="<?php echo JText::_('PAY_NOW') ; ?> name=" " alt="<?php echo JText::_('ОПЛАТИТЬ '); ?> " onclick="document.getElementById('hikashop_bankoplata_form').submit(); return false;" />
</div>
***- далее для всех платежных плагинов идет универсальный код (одинаков для всех плагинов)
</form>
Первоначально непонятным для меня было использование в файле end_transferbank.php следующих конструкций PHP
$doc = JFactory::getDocument(); //получить $doc->addStyleDeclaration($style); //добавить стиль $doc->addScriptDeclaration(); //использовать скрипт
//Добавить действие в запрос
JRequest::setVar('noform', 1); // ??? если неизвестны переменные запроса - в запросе установить новую переменную 'noform' со значением '1' среди других переменных запроса + при этом вернуть предыдущее значение - '0' или что-то не использовать // JRequest::SetVar('message', $msg);
// при ответе с сервера возможно потребуется
// ob_start() — Включение буферизации вывода
// использовать ob_get_contents() — Возвращает содержимое буфера вывода
//ob_end_clean() — Очистить буфер вывода и отключить буферизацию вывода
<?php
ob_start();
echo 'Текст, который не отобразится.';
ob_end_clean();
?>
ob_start();
echo 'Текст, который отобразится!'; $html_1 = ob_get_contents(); echo 'Два раза!'; $html_2 = ob_get_contents(); ob_end_clean();
//будет такое содержимое
$html_1 = 'Текст, который отобразится!';
$html_2 = 'Текст, который отобразится!Два раза!';
Оказалось, это специфика PHP для Joomla:
JFactory::getDocument() - получить объект докумета ---> отразить на странице HTML-конструкцию из заданных тэгов
JFactory::getApplication()->input - использовать функцию public static ( :: ) при получении данных от серевера - используя метод getApplication()
addStyleDeclaration($style) - объявление таблицы стилей для страницы ---> добавить и использовать заданный стиль в файле end_transferbank.php
JInput
– главный, базовый класс в JOOMLA, предназначен для работы с $_REQUEST
($_POST
, $_GET
и $_COOKIE
),
Для эффективной фильтрации переменных запроса при их получении они используют класс JFilterInput
.
getInstanse () -возвращает объект входного фильтра, только создавая его, если он еще не существует.
JFactory::getApplication () -
Возвращает JApplicationCMS, через него вы можете получить доступ к примеру сделать перенаправления, получить доступ к конфигурации и входным переменным, меню или сообщениям очереди, которые показываются пользователя
Конечно, сам исходный файл end_transferbank.php даже при первом просмотре кода далек от совершества и никакие замены id , name не дадут результата - поэтому его надо кординально переделать: добавить классы, организовать переход на страницу форм и т.д. .
method="POST" class="application" accept-charset="UTF-8" action="https://ваш_сайт.ru/страница_форм/input" target="_blank" id="hikashop_ваш_сайт_form"
Можно поступить по-простому - вставить в этот файл <style> ... </style> , код <body> ... </body> , функции перевода форматов и на выходе получить что-то подобие счета на оплату. Вам остается вставить с помощью языка php свои параметры. Ниже пример вставлен копированием, поэтому стили не работают, нет вставки параметров PHP (система кода корректно отображается только в интернет-магазине Hikashop при оплате способом BANKTRANSFER)
Внимание! Оплата данного счета означает согласие с условиями поставки товара. Уведомление об оплате обязательно, в противном случае не гарантируется наличие товара на складе. Товар отпускается по факту прихода денег на р/с Поставщика, самовывозом, при наличии доверенности и паспорта.
, | БИК | ||
Банк получателя | Сч. № | ||
ИНН | КПП | Сч. № | |
Получатель |
Счет на оплату № от
Поставщик: | , ИНН , КПП , |
---|---|
Покупатель: | ООО "Покупатель", розничный покупатель |
№ | Наименование товара, работ, услуг | Коли- чество | Ед. изм. | Цена | Сумма |
---|---|---|---|---|---|
Итого: | |||||
В том числе НДС: | |||||
Всего к оплате: |
Всего наименований , на сумму руб.
Руководитель | (Иванов А.А.) |
---|---|
Бухгалтер | (Сидоров Б.Б.) |
статья в редактировании...