1C-Битрикс: Оплата товаров после проверки менеджером

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

Битрикс дает возможность использовать сколько угодно и каких угодно статусов заказа. Единственным ограничением является тот факт что заказ формируется со статусом с кодом «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()) { ?>
                            
                            <?= 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 { ?>
    // Сообщаем что такого заказа не существует
<? } ?>

2 комментария

  1. Егор

    Спасибо за решение!
    Но пользователь всё равно может зайти в личный кабинет и оплатить уже оттуда 🙁 Как можно решить?

    • dmitro.pro

      Егор, идея заключается в том, что если у пользователя стоит статус «Ожидает подтверждения менеджера», то для кнопки оплатить мы применяем в css display: none. А если отображается статус «Подтвержден. Ожидает оплаты.», то выставляется css display:block.

      Все эти условия обрабатываются JS. Если непонятно и интересно, я готов расписать все подробно и написать тебе JS код.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *