Вывод кнопки оплаты в списке заказов Битрикс

Возврат к списку

ОплатаЗаказа.jpg

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

Для вывода кнопки оплаты, нам необходимо получить параметры заказа, определить установленную платежную систему и получить html код файла обработчика, который в себя и будет включать кнопку оплаты.

Список заказов на сайте выводится через компонент sale.personal.order.list, открываем папку шаблона компонента и переходим в файл result_modifier.php. В конце файла вставляем следующий код:

   /*
 * Кнопка оплатить в списке заказов 
 */

foreach($arResult['ORDERS'] as $arItems){
	$arItem = $arItems['ORDER']; 
	$arPayment = CSaleExport::getPayment($arItem);
	foreach($arPayment['payment'] as $payment){
		if($arItem['PAYED'] == 'N' && $arItem['CANCELED'] == 'N'){
			if(!empty($arItem['PAY_SYSTEM_ID'])){
				if (intval($payment["PAY_SYSTEM_ID"]))
				{
					$payment["PAY_SYSTEM"] = \Bitrix\Sale\PaySystem\Manager::getById($payment["PAY_SYSTEM_ID"]);
					$payment["PAY_SYSTEM"]['NAME'] = htmlspecialcharsbx($payment["PAY_SYSTEM"]['NAME']);
				}
				if ($arItem['PAYED'] == 'N' && $arItem['CANCELED'] == 'N')
				{
					$payment['BUFFERED_OUTPUT'] = '';
					$payment['ERROR'] = '';
					$service = new \Bitrix\Sale\PaySystem\Service($payment["PAY_SYSTEM"]);
					if ($service)
					{
						$payment["CAN_REPAY"] = "Y";
						if ($service->getField("NEW_WINDOW") == "Y")
						{
							$payment["PAY_SYSTEM"]["PSA_ACTION_FILE"] = htmlspecialcharsbx("PATH_TO_PAYMENT").'?ORDER_ID='.urlencode(urlencode($arItem['ACCOUNT_NUMBER'])).'&PAYMENT_ID='.$payment['ID'];
						}
						else
						{
							CSalePaySystemAction::InitParamArrays($arItem, $arItem["ID"], '', array(), $payment);

							$handlerFolder = \Bitrix\Sale\PaySystem\Manager::getPathToHandlerFolder($service->getField('ACTION_FILE'));
							$pathToAction = \Bitrix\Main\Application::getDocumentRoot().$handlerFolder;
							$pathToAction = str_replace("\\", "/", $pathToAction);
							while (substr($pathToAction, strlen($pathToAction) - 1, 1) == "/")
								$pathToAction = substr($pathToAction, 0, strlen($pathToAction) - 1);
							if (file_exists($pathToAction))
							{
								if (is_dir($pathToAction) && file_exists($pathToAction."/payment.php"))
									$pathToAction .= "/payment.php";
								$payment["PAY_SYSTEM"]["PSA_ACTION_FILE"] = $pathToAction;
							}

							$encoding = $service->getField("ENCODING");
							if (strlen($encoding) > 0)
							{
								define("BX_SALE_ENCODING", $encoding);
								AddEventHandler("main", "OnEndBufferContent", array($this, "changeBodyEncoding"));
							}
							/** @var \Bitrix\Sale\Order $order */
							$order = \Bitrix\Sale\Order::load($arItem["ID"]);

							if ($order)
							{
								/** @var \Bitrix\Sale\PaymentCollection $paymentCollection */
								$paymentCollection = $order->getPaymentCollection();
								if ($paymentCollection)
								{
									/** @var \Bitrix\Sale\Payment $paymentItem */
									$paymentItem = $paymentCollection->getItemById($payment['ID']);
									if ($paymentItem)
									{
										$initResult = $service->initiatePay($paymentItem, null, \Bitrix\Sale\PaySystem\BaseServiceHandler::STRING);
										if ($initResult->isSuccess())
											$payment['BUFFERED_OUTPUT'] = $initResult->getTemplate();
										else
											$payment['ERROR'] = implode('\n', $initResult->getErrorMessages());
									}
								}
							}
						}
					}
				}
				$arResult['PAYMENT_SYSTEM'][$arItem['ID']][] = $payment; 
			}
		}
	}
}

Скрипт будет определять платежную систему для каждого неоплаченного и не отмененного заказа. После этого, переходим в шаблон компонента, находим удобное место для вставки, и вставляем следующий код: 

<?foreach ($arResult['PAYMENT_SYSTEM'][$order['ORDER']['ID']] as $payment):?>
<?if($payment["CAN_REPAY"]=="Y" && $payment["PAY_SYSTEM"]["PSA_NEW_WINDOW"] != "Y"):?>
	<tr>
		<td colspan="2">
			<?
				if (array_key_exists('ERROR', $payment) && strlen($payment['ERROR']) > 0)
					ShowError($payment['ERROR']);
				elseif (array_key_exists('BUFFERED_OUTPUT', $payment))
					echo $payment['BUFFERED_OUTPUT'];
			?>
		</td>
	</tr>
<?endif?>
						

В переменной $payment['BUFFERED_OUTPUT']   хранится сгенерированный код кнопки оплаты. 

На рабочем проекте, это выглядит так:

КнопкаОплатыВСписке.png

В конце статьи прикрепил архив шаблона с доработками в template.php и result_modifier.php.  




26.05.2016 в 15:09
0
Есть проблема, возможно это зависит от версии модуля.
Копипаст кода не получится, в моём случае строчка :
$arPayment = CSaleExport::getPayment($arItem);
Возвращает массив:
array(1) {
[0]=>
array(14) {
["ID"]=>
string(4) "2448"
["PAID"]=>
string(1) "N"
["DATE_BILL"]=>
object(Bitrix\Main\Type\DateTime)#759 (1) {
["value":protected]=>
object(DateTime)#758 (3) {
["date"]=>
string(26) "2016-05-26 13:05:32.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Moscow"
}
}
["ORDER_ID"]=>
string(4) "2817"
["CURRENCY"]=>
string(3) "RUB"
["SUM"]=>
string(9) "1849.2000"
["COMMENTS"]=>
NULL
["DATE_PAID"]=>
NULL
["PAY_SYSTEM_ID"]=>
string(2) "60"
["PAY_SYSTEM_NAME"]=>
string(29) "Наличный расчет"
["IS_RETURN"]=>
string(1) "N"
["PAY_RETURN_COMMENT"]=>
NULL
["PAY_VOUCHER_NUM"]=>
NULL
["PAY_VOUCHER_DATE"]=>
NULL
}
}

Т.е. в массиве нет необходимых переменных
ответная реплика
adminadmin03.06.2016 в 04:10
0
Да копипаст не прокатит. Кнопку оплаты выводил на последней версии модуля Битрикс, где подключена возможность частичной оплаты и т.д.
ответная реплика
Владимир КайзумовВладимир Кайзумов20.09.2016 в 16:38
+1
Благодарю за код!

Помогло после обновления до Битрикс 16 версии.
Кнопка оплаты пропала в принципе из заказа, созданные заказы со способом оплаты "Банковская карта" не могли оплачивать заказ через личный кабинет.
Разработчик шаблона компания RedSign ответила что кнопка теперь не работает в связи с обновлением Битрикс. На доработку непонятно сколько будет потрачено времени.

Ваше решение нам помогло!
Надеюсь и другим поможет.
ответная реплика
ДмитрийДмитрий04.01.2017 в 21:30
+1
Разработчик шаблона rdesign (Альфа Системс). А кнопка пропала, потому что у них в шаблоне проверка — если для платежной системы,
стоит в настройках открывать в новом окне — тогда кнопку выводим. Иначе не выводим. Стремная контора, вроде решение внешне нормальное (OptPro) и его клоны, но за многие вещи палкой по голове надо бить. Версия 2,7 вышла, якобы мелкие ошибки исправили,
что исправили, где — ни полслова.
ответная реплика
24.04.2017 в 13:05
0
Здравствуйте. Установил Ваш код, все работает.
Вот только забирает значение последнего заказа, например:
Первый заказ номер 695 — 5000 рублей.
Второй заказ номер 696 — 4000 рублей.
Когда нажимаю кнопку Оплатить по второму заказу выходит первый заказ.

ответная реплика
adminadmin24.04.2017 в 14:29
0
Проверьте какие параметры выводятся с кнопкой оплатить. Они видны в html коде страницы, внутри тега form где располагается кнопка.Там же должен быть параметр с номером заказа.
ответная реплика


Возврат к списку

Теги
1c addurl AutoGRAPH.NET_Service Bitrix Bootstrap chmail.ru CMS curl DLE ERP Exel gmail google hdd hide html input Java script окна javascript Jquery JS JSON keywords mail.ru memori news.list No captcha nsma PHP php php attach PR recaptcha repair retweet script Sdorgen sdorgen select sms snagit Spam Test Twitter ucoz utf-8 VK wrike X-Satellite XHE xhe yandex yandex webmaster youtube АРМ БП3 Битрикс ВТБ24 ЕГРЮЛ ЖЖ ЗУП ИТС КЛАДР МБ-8 НДФЛ ПР ПФ ТИЦ УАТ УП автограф автокликер автоматизация автопостер ап ТИЦ битрикс валюты видео внешнее соединение время грамотное написание графика даты запрета день рождение дерево значений договор заказы заполнение ТЧ запонение ТЧ запрос 1С зарплатный реестр календарь книги кодировка комментарии координаты координирование проектов меню модальное окно народ обмен обработка ок рубль организационные структуры управления проектами остатки на складе отчет плавающий блок постинг программы для управления проектами расчет расстояния сервис система управления проектами скрипт скрыть блок смс софт таймер такси управление содержанием проекта фоновые задания чекер