неправильное поведение компонента оплаты bitrix:sale.order.payment

Рейтинг: 10.6780  
На голосовании
Предложил Пользователь 35052 24.12.2015 17:53:13

неправильное поведение компонента оплаты bitrix:sale.order.payment

Компонент оплаты заказа вызывается так:
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$APPLICATION->SetTitle("Оплата заказа");
?><?$APPLICATION->IncludeComponent(
   "bitrix:sale.order.payment",
   "",
   Array(
   )
);?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");?> 
Плюс в самом компоненте есть RestartBuffer

Это неправильно, т.к. некоторые обработчика генерируют кнопку Оплатить.
Например стандартный яндекс.деньги: http://joxi.ru/1A5pDdZuKb4Q62
Подобное нужно выводить в дизайне сайта, а не непоймикак.

Тех. поддержка битрикса говорит что не знает почему так сделано и отказывается что-либо исправлять или дать решение.

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

P.S. понятно что можно сделать свой компонент, но ведь из коробки это тоже адекватно должно работать

Рейтинг: 0.3932  
Пользователь 88641 12.01.2016 13:03:49
Можно слегка модифицировать шаблон: Оборачиваем все в
<div id='divasoft-send-payment'>*** form ***</div>

Добавляем скрипт
<sc ript>var divasoftSend = document.getElementById('divasoft-send-payment');  
divasoftSend.children[0].submit();</sc ript>

И получаем автоматическую отправку на систему оплаты.
Рейтинг: 0  
Пользователь 35052 12.01.2016 13:59:52
как вариант без кастомизации компонента ;)
но не все обработчики делают кнопку - тут не угадаешь
Рейтинг: 0  
Пользователь 88641 12.01.2016 14:09:27
Согласен, например "киви" требует заполненное поле телефон. Но это можно обойти заранее его заполнив. Приходится каждую платежную систему проверять и подстраиваться под неё. Но за то не трогаем компоненты. А так да, очень хотелось бы увидеть похожий функционал в коробке.
Рейтинг: 0  
Пользователь 88641 08.02.2016 15:55:14
но не все обработчики делают кнопку - тут не угадаешь
Да, не угадаешь :D
Тут уже кастомизируем компонент. ob_*() нам в помощь.

try {
   if (file_exists($pathToAction)) {
      $autoRedirect = false;

      ob_start();
      if (is_dir($pathToAction)) {
         if (file_exists($pathToAction . "/payment.php"))
            include($pathToAction . "/payment.php");
      }
      else {
         include($pathToAction);
      }
      $pagePayment = ob_get_contents();
      ob_end_clean();
      if (stripos($pagePayment, "<fo rm")===false) {$autoRedirect=true;}
      echo "<div id='divasoft-send-payment'" . (($autoRedirect === false) ? " style='display:none;'" : "") . ">";
      echo $pagePayment;
      echo "</div>" . (($autoRedirect === false) ? "<sc ript>var divasoftSend = document.getElementById('divasoft-send-payment'); divasoftSend.children[0].target=''; divasoftSend.children[0].submit();</sc ript>" : ""); // divasoftSend.children[0].submit();
   }
} catch (\Bitrix\Main\SystemException $e) {
   if ($e->getCode() == CSalePaySystemAction::GET_PARAM_VALUE)
      $message = "Payment error";
   else
      $message = $e->getMessage();
   ShowError($message);
}
 


Если что то пошло не так, пользователь это увидит. Если нет - сразу редирект на систему оплаты.
Рейтинг: 2  
Пользователь 113892 18.05.2018 13:19:27
Можете вместо компонента bitrix:sale.order.payment
размещать код отображения платежки через d7

use \Bitrix\Sale;
$orderObj = Sale\Order::load($_REQUEST['ORDER_ID']);
$paymentCollection = $orderObj->getPaymentCollection();
$payment = $paymentCollection[0];
$service = Sale\PaySystem\Manager::getObjectById($payment->getPaymentSystemId());
$context = \Bitrix\Main\Application::getInstance()->getContext();
$service->initiatePay($payment, $context->getRequest());