Анализ плагинов для 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 - отражать сумму и товарные позиции покупки (Вы можете продавать все группы товаров, кроме маркированных - лекарства, обувь, духи, табак, шины, фототехника и изделий легкой промышленности).

Для поддержки ФФД 1.2 плагин Hikashop необходимо научить проверять код маркировки ещё до реализации товара, а также получать обратную связь с сервисом "Честный ЗНАК" при продаже маркированного товара - фиксировать выбытие в системе маркировки (в дальнейшем может быть попробуем и это, если это Вам необходимо...для этого понадобится регистрация участника оборота маркированных товаров на различных порталах и получение дополнительных логинов и паролей и т.д.).

Если Вам это интересно, продолжим...

При разработке модуля оплаты товаров для интернет-магазина Hikashop мы взяли самого надежного на данный момент платежного агрегатора - СБЕРБАНК. Даже если ваш бизнес использует расчетный счет в другом банке, этот плагин также подойдет для Вас, т.к. агрегатор лишь является посредником между Вами и Вашим расчетным счетом, за что берет коммисию при переводе денег Вам. Другими платежыми системами при интернет-экваринге могут быть, например, банки: TINKOFF-банк, РФИ-банк и др. или же электронные платежные системы PALPAY, eBay, QIWI и др., которые отличаются величиной комиссии и способами вывода денежных средств с платежной платформы (только безналичные расчеты, выбор валюты при переводе и т.д.).

Для нашего "простого" случая (ФФД 1.1) нам понадобятся уже созданные другими разработчиками следующие заготовки с кодом HTML и PHP:

любой установленный плагин Hikashop, например BankTransfer (используем "тело" плагина - пока не создадим новый) и PalPay (для копирования  и переноса "готовых" функций и переменных)  (1 этап - данные - о магазине, р/счет, информация по заказу)

большим подспорьем послужит любой  найденный бесплатный сторонний плагин - например, виджет банка РФИ для Hikashop, состоящего также из 2-х файлов. (2 этап -  создание кнопок - и организация загрузки плагина в Hikashop)

 для удобства ( скачивание и сохранение ) - необходимо скопировать код HTML и PHP для типового счета с сайта https://snipp.ru/php/dompdf (3 этап - создание pdf файла - на порядок повышает доверие к сайту) 

базовый бесплатный курс по 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)), );
  У Сбербанка также есть специфика передачи параметров товарной корзины  на платежный шлюз - для фискализации чека - обязательно через переменную $orderBundle ***
МОЙ ПРИМЕР КОДА - вся "хитрость" в нахождении параметров '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 {



... здесь прописать все, в т.ч. вспомогательные функции...иначе работать что-то не будет...

};
  1.  Конструктор (служебная функция) позволяет автоматически подставлять в уже созданные переменные дополнительные значения  (пример приведен ниже:  в созданном параметре '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&notif_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&notif_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&notif_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)

 

Внимание! Оплата данного счета означает согласие с условиями поставки товара. Уведомление об оплате обязательно, в противном случае не гарантируется наличие товара на складе. Товар отпускается по факту прихода денег на р/с Поставщика, самовывозом, при наличии доверенности и паспорта.

, БИК  
Банк получателя Сч. №  
ИНН КПП Сч. №  
 
Получатель

Счет на оплату № от

Поставщик: , ИНН , КПП ,
Покупатель: ООО "Покупатель", розничный покупатель
Наименование товара, работ, услугКоли-
чество
Ед.
изм.
ЦенаСумма
Итого: 
В том числе НДС: 
Всего к оплате: 

Всего наименований , на сумму руб.

 

Руководитель (Иванов А.А.)
Бухгалтер (Сидоров Б.Б.)

 

статья в редактировании...