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

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

ОплатаЗаказа.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 где располагается кнопка.Там же должен быть параметр с номером заказа.
ответная реплика


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