Следить за новостями:

Категории
Свежие записи
BrainFБлог

Отложенная оплата в 1С-Битрикс

В процессе работы над одним из сайтов понадобилось реализовать функционал отложенной оплаты. То есть нужно было сделать так чтобы покупатель, оформив заказ, мог произвести оплату только после того как менеджер проверит наличие на складе и подтвердит заказ. Среди стандартного функционала Битрикс я такой возможности не нашел, гугление привело на форумы с вопросами без внятных ответов. Пришлось городить свой велосипед.

Битрикс дает возможность использовать сколько угодно и каких угодно статусов заказа. Единственным ограничением является тот факт что заказ формируется со статусом с кодом «N» и закрывается со статусом с кодом «F». Первым делом изменим параметры статуса с кодом «N». Дадим ему название «Новый. Ожидает подтверждения». Далее добавим статус с кодом, например, «A» и названием «Подтвержден. Ожидает оплаты.» Оставшиеся статусы «Выполнен» и «Оплачен» не трогаем.

В стандартном сценарии после того как покупатель оформляет заказ ему отображается страница сообщающая об успешном формировании заказа и предлагающая внести оплату выбранным способом. Эту страницу мы и будем кастомизировать. Создаем свой шаблон компонента sale.order.ajax, после этого он будет доступен в директории /bitrix/templates/you_template/components/bitrix/sale.order.ajax/.default/ Нас интересует confirm.php. Приводим его к следующему виду:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<? if (!empty($arResult["ORDER"])) { ?>
	// заказ существует идем дальше
	<? if ($arResult["ORDER"]["STATUS_ID"]=="N") { ?>
		// сообщаем пользователю о том что его заказ сформирован
	<? } elseif (!empty($arResult["PAY_SYSTEM"]) && $arResult["ORDER"]["STATUS_ID"]=="A") { ?>
		// предлагаем оплатить заказ (Я взял эту часть из стандартного шаблона)
		<div class="content pay">
			<a href="<?=$arParams["PATH_TO_PAYMENT"]."?ORDER_ID=".urlencode(urlencode($arResult["ORDER"]["ACCOUNT_NUMBER"]));?>" target="_blank" class="paysystem">
				<?=CFile::ShowImage($arResult["PAY_SYSTEM"]["LOGOTIP"], 100, 100, "border=0", "", false);?>
				<span><?= $arResult["PAY_SYSTEM"]["NAME"] ?></span>
			</a>
			<div class="info">
				<? if (strlen($arResult["PAY_SYSTEM"]["ACTION_FILE"]) > 0) { ?>
					<? if ($arResult["PAY_SYSTEM"]["NEW_WINDOW"] == "Y") { ?>
						<script language="JavaScript">
							window.open('<?=$arParams["PATH_TO_PAYMENT"]?>?ORDER_ID=<?=urlencode(urlencode($arResult["ORDER"]["ACCOUNT_NUMBER"]))?>');
						</script>
						<?= GetMessage("SOA_TEMPL_PAY_LINK", Array("#LINK#" => $arParams["PATH_TO_PAYMENT"]."?ORDER_ID=".urlencode(urlencode($arResult["ORDER"]["ACCOUNT_NUMBER"]))))?>
						<? if (CSalePdf::isPdfAvailable()) { ?>
							<br />
							<?= GetMessage("SOA_TEMPL_PAY_PDF", Array("#LINK#" => $arParams["PATH_TO_PAYMENT"]."?ORDER_ID=".urlencode(urlencode($arResult["ORDER"]["ACCOUNT_NUMBER"]))."&pdf=1&DOWNLOAD=Y")) ?>
						<? } ?>
					<? } else { ?>
						<? if (strlen($arResult["PAY_SYSTEM"]["PATH_TO_ACTION"])>0) {
							include($arResult["PAY_SYSTEM"]["PATH_TO_ACTION"]);
						} ?>
					<? } ?>
				<? } ?>
			</div>
		</div>
	<? } else { ?>
		// на тот случай если по той или иной причине не выбрана платежная система (ну мало ли:))
	<? } ?>
<? } else { ?>
	// Сообщаем что такого заказа не существует
<? } ?>

Таким образом теперь покупатель сможет оплатить заказ только после того как менеджер не поменяет статус заказа на «Ожидает оплаты».
PS. На странице заказа в личном кабинете статус заказа хранится в $arResult[‘STATUS_ID’]

Еще по теме

40 комментария к записи “Отложенная оплата в 1С-Битрикс

  1. Саша
    14.10.2014 11:20:56 Ответить

    вылазит пустая страница. какая версия битрикса?

    1. parmactep
      14.10.2014 11:42:25 Ответить

      Включите отображение ошибок. И покажите какую выводит ошибку.

  2. megamosk
    06.11.2014 13:07:20 Ответить

    Вся штука в том, что на эту страницу юзер попадает сразу после размещения заказа. Эту конструкцию лучше было бы разместить в кабинете в детальной информации о заказе или списке заказов.

    1. parmactep
      14.11.2014 17:46:42 Ответить

      Не соглашусь с вами. Так удобно пользователю показать уведомление в стиле «Вы можете оплатить заказ после подтверждения менеджером».

  3. Сергей
    01.12.2014 10:53:53 Ответить

    Пишет ошибку в 7 строке Parse error: syntax error, unexpected T_ELSE in

    1. parmactep
      01.12.2014 12:33:09 Ответить

      Да, действительно. Там в коде ошибка закралась. Поправил.

      1. Сергей
        01.12.2014 13:42:38 Ответить

        А можно ли сделать пример, чтобы ссылка на оплату заказа отправлялась еще и в письме пользователю?

        1. parmactep
          03.03.2015 16:49:46 Ответить

          Письмо отправляется вместе с событием смены статуса. Нужно только подредактировать его шаблон.

  4. Михаил
    03.03.2015 13:41:42 Ответить

    По прежнему ошибка Parse error: syntax error, unexpected T_ELSE in C:\shop_zoo_pitomec_1\www\bitrix\templates\.default\components\bitrix\sale.order.ajax\Zoo_sho\confirm.php on line7

    1. parmactep
      03.03.2015 16:39:30 Ответить

      Ошибка скорее всего не предыдущей строке. Например вы могли не закрыть фигурную скобку.

      1. Михаил
        03.03.2015 20:05:02 Ответить

        Спасибо, но уже разобрался — синтаксис хреново знаю. Доработка полезная. Есть яндекс кошелек? Хочу символически отблагодарить.  

        1. parmactep
          03.03.2015 21:49:42 Ответить

          Простого словесного «спасибо» достаточно. Рад что смог вам помочь.

  5. Михаил
    03.03.2015 13:42:37 Ответить

    Помогите, пожалуйста решить. С меня чашка кофе / кружка пива.

  6. Гоша
    11.03.2015 13:28:59 Ответить

    Добрый день! Помогите, пожалуйста, ошибка: Parse error: syntax error, unexpected T_ELSEIF in C:\Bitrix\www\bitrix\templates\.default\components\bitrix\sale.order.ajax\shop_visual\confirm.php on line 7. Понятно, что ошибка выше этой строчки, но где она????? Это, может, фигурная закрывающаяся скобка, но ставлю и ошибка всё-равно выходит…..Прошу Вас: помогите, пожалуйста!!!!!

    1. parmactep
      11.03.2015 14:06:41 Ответить

      Я не экстрасенс. Вы бы код строчек 5, 6 и 7 показали — я бы вам смог подсказать.

    2. parmactep
      11.03.2015 14:18:05 Ответить

      Немного подредактировал код чтобы он понятней стал

      1. Гоша
        11.03.2015 15:31:15 Ответить

        Спасибо Вам!!!! Огромное спасибо!!! в 7-ой строчке (начало) у меня вместо <? } было  <? {  Спасибище ВАМ!!!!

        1. parmactep
          11.03.2015 15:33:47 Ответить

          Рад что смог помочь.

  7. Dmitry
    24.06.2015 21:04:44 Ответить

    Скажите пожалуйста, ну допустим пользователь сделал заказ, сформировалась страница типо вида: нашсайт/personal/order/make/?ORDER_ID=339 , где 339 это номер заказа, следующий заказ будет уже в этом месте 340, так как сделать пользователю страницу, если он закроет ее. он же должен потом войти в личный кабинет и как то увидеть эту страницу, чтобы оплатить.

    1. parmactep
      25.06.2015 22:45:08 Ответить

      В личном кабинете у пользователя есть история заказов

  8. Dmitry
    26.06.2015 8:05:49 Ответить

    да, там эта кнопка при любом статусе заказа есть оплатить, а как есть показывать только при одном статусе заказа?

    1. parmactep
      28.07.2015 16:39:33 Ответить

      Проверять в шаблоне статус заказа. И соответственно отображать кнопку только при нужных статусах. if ($arResult[«ORDER»][«STATUS_ID»]==»/*Здесь указываем нужный код статуса*/») {

  9. Андрей
    28.07.2015 16:33:36 Ответить

    Спасибо огромное за эту Вашу заметку! Очень пригодилось!

    1. parmactep
      28.07.2015 16:36:45 Ответить

      Рад что оказался полезен

  10. Алексей
    21.10.2015 0:15:08 Ответить

    Здравствуйте! А можно ли сделать и оплату с внутреннего счета только после ообрения менеджером? что-то не понял как это сделать 🙁

    1. parmactep
      21.10.2015 12:22:33 Ответить

      Здравствуйте. Статья как раз о таком случае.

  11. Алексей
    21.10.2015 12:42:21 Ответить

    смею с Вами не согласиться. В статье об оплате с помощью платежных систем- это все сделал по Вашей статье, все работает. Но вот с оплатой с внутреннего счета так не сделать- почему-то оплатить можно только сразу при оформлении заказа

    1. parmactep
      21.10.2015 12:45:54 Ответить

      Ага. Понял. Вы именно о внутреннем счете. Честно говоря не вдавался в вопрос. Через несколько дней вернусь из поездки и смогу попробовать разобраться с внутренним счетом

    2. parmactep
      21.10.2015 12:50:34 Ответить

      Если я правильно помню как выглядит оплата внутренним счетом, то необходимо просто в шаблоне личного кабинета отображать ее только при нужном нам статусе заказа. То есть необходимо в шаблоне найти отображение кнопки оплаты и просто убрать ее если код статуса заказа «N»

  12. Максим
    29.10.2015 12:41:24 Ответить

    Здравствуйте. Очень благодарен Вам за данную статью. Хотел вот что узнать: не могу найти шаблон статуса заказа. Хочу, чтобы пользователь не видел кнопки оплаты товара в личном кабинете. Знаю, как это изменить, но не знаю где. Помогите, пожалуйста. 

    1. parmactep
      29.10.2015 13:00:43 Ответить

      Это компоненты sale.personal.order.detail и  sale.personal.order
      Соответствующие кнопки вы найдете именно там

      1. Максим
        29.10.2015 15:39:04 Ответить

        Огромное Вам человеческое спасибо! Очень помогли!

      2. mytraz
        09.02.2016 2:06:01 Ответить

        Здравствуйте! Столкнулся с проблемкой, в файл компонента sale.personal.order.detail внес коррективы в виде <? if ($arResult[«ORDER»][«STATUS_ID»]==»G») { $ORDER_ID = $ID;include($arResult[«PAY_SYSTEM»][«PSA_ACTION_FILE»]);} else { ?><p class=»ordercheck»>Оплата будет доступна после согласования с менеджером.</p><? } ?>Но смена статуса никак не меняет ситуацию и отображается только то что находится после else Что я пропустил?

        1. parmactep
          11.02.2016 5:51:50 Ответить

          А вы уверены что именно статус G присвоили?

          1. mytraz
            12.02.2016 9:17:15

            Уверен) Пробовал менять и на другие статусы для сравнение. Ситуация не менялась.

          2. parmactep
            12.02.2016 16:06:29

            В таком случае без доступов сложно что-то сказать. Попробуйте просто вывести статус заказа, чтобы проверить меняется ли он.

        2. Жека
          27.07.2016 23:02:22 Ответить

          Получилось сделать?

  13. mytraz
    20.02.2016 21:43:44 Ответить

    Ошибки не должно быть. Так как на обеих старницах используется один и тот же код. И на одной странице он работает как нужно, а на другой никак. Я не кодер но предполагаю что должен быть ньюанс.

  14. mytraz
    20.02.2016 21:45:01 Ответить

    Если нужен доступ, могу предоставить.

  15. Андрей
    16.05.2016 1:14:24 Ответить

    Здравствуйте.  Подскажите, пожалуйста, а как нибудь можно вывести кнопку оплаты в список заказов (компонент sale.personal.order.list)?

Ваш комментарий
выберите имя