[spoiler]
Типичный пример ситуации: посетитель сайта сделал заказ, тут же оплатил его банковской картой, но после согласования с менеджером отказался, т.к. сроки доставки его не устроили. В этом случае большинство банков, предлагающих интернет-эквайринг, требуют письменное заявление о возврате средств - на что, согласитесь, ни менеджеру, ни покупателю, тратить время не хочется. Некоторые платежные системы позволяют возвращать деньги, используя запросы через API с ЭЦП компании-продавца, например Merchant Web Services (MWS) Яндекс.Кассы, но подключение и реализация подобной схемы - довольно трудоемкая задача.
Идея
При реализации схемы оплаты интернет-магазина компании Italco, мы предложили схему, в которой оплата заказа разрешается системой только после подтверждения менеджером (то есть, после согласования заказа и проверки наличия товара):
Заказ - подтверждение менеджером - оплата клиентом |
Реализация
1. Шаблон компонента sale.order.ajax, файл confirm.php - если не задан определенный параметр в URL, блокируем возможность оплаты в шаблоне компонента заказа и добавляем сообщение - "После согласования заказа менеджером вы получите ссылку на оплату этого заказа на E-mail".
В строку:
<? if (strlen($arPaySystem["ACTION_FILE"]) > 0 && $arPaySystem["NEW_WINDOW"] == "Y" && $arPaySystem["IS_CASH"] != "Y"): ?> |
<? if ($_REQUEST['AUTO_SUBMIT'] == 'Y' && strlen($arPaySystem["ACTION_FILE"]) > 0 && $arPaySystem["NEW_WINDOW"] == "Y" && $arPaySystem["IS_CASH"] != "Y"): ?> |
<? elseif (strlen($arPaySystem["ACTION_FILE"]) > 0 && $arPaySystem["NEW_WINDOW"] == "Y" && $arPaySystem["IS_CASH"] != "Y"): ?> <? echo 'После согласования заказа менеджером вы получите ссылку на оплату этого заказа на E-mail' ?> |
В строки
<?if($payment["PAID"] == "Y"):?> <?=GetMessage('SPOD_YES')?> <?if(strlen($payment["DATE_PAID_FORMATED"])):?> (<?=GetMessage('SPOD_FROM')?> <?=$payment["DATE_PAID_FORMATED"]?>) <?endif;?> <?else:?> <?=GetMessage('SPOD_NO')?> <?if($payment["CAN_REPAY"]=="Y" && $payment["PAY_SYSTEM"]["PSA_NEW_WINDOW"] == "Y"):?> [<a href="<?=$payment["PAY_SYSTEM"]["PSA_ACTION_FILE"]?>" target="_blank"><?=GetMessage("SPOD_REPEAT_PAY")?></a>] <?endif;?> <?endif;?> |
<?elseif($arResult["STATUS"]["NAME"]!='Подтвержден к оплате'):?> <?echo 'Заказ ожидает подтверждения менеджера, после подтверждения вам придет ссылка для оплаты заказа на E-mail'?> |
4. Создаем почтовый шаблон:
В текст письма добавляем ссылку на оплату заказа:
Вы можете оплатить свой заказ, <a href="http://#SERVER_NAME#/personal/?ORDER_ID=#ORDER_ID#&ready_2pay=Y&userid=#USER_ID#&key=#KEY#">перейдя по этой ссылке</a> |
4. В файле /bitrix/php_interface/init.php - создаем обработчик события, который срабатывает при переводе заказа в статус "Подтвержден к оплате":
AddEventHandler("sale", "OnSaleStatusOrder", "OnSaleStatusOrderHandler"); |
function OnSaleStatusOrderHandler($ID, $val) { if($val=="A") { // Код статуса "Подтвержден к оплате" $arOrder = CSaleOrder::GetByID($ID); $arPaySys = CSalePaySystem::GetByID($arOrder['PAY_SYSTEM_ID'], $arOrder['PERSON_TYPE_ID']); if($arPaySys['PSA_ACTION_FILE'] == 'yandex') { // Дополнительная проверка, та ли платежная система? $rsUser = CUser::GetByID($arOrder["USER_ID"]); $arUser = $rsUser->Fetch(); $event = new CEvent; $event->SendImmediate('SALE_ORDER_READY_2PAY', 's1', array( "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME), "ORDER_ID" => $ID, "EMAIL" => $arUser["EMAIL"], "USER_ID" => $arUser["ID"], "KEY" => $arUser["CHECKWORD"], )); } } } |
$authorized=false; if($_REQUEST['key'] && intval($_REQUEST['userid']) && intval($_REQUEST['ORDER_ID'])) { if(!in_array(1, CUser::GetUserGroup($_REQUEST['userid']))) { //Страховка $rsUser = CUser::GetByID($_REQUEST['userid']); $arUser = $rsUser->Fetch(); if($arUser['CHECKWORD']==$_REQUEST['key']) $authorized=$USER->Authorize($_REQUEST['userid']); } if($USER->IsAuthorized() || $authorized) { LocalRedirect('/personal/order/make/?ORDER_ID='.$_REQUEST['ORDER_ID'].'&AUTO_SUBMIT=Y'); } } |
PS: Для полного удобства пользователя, можно также сделать чтобы средствами js (в данном случае - с использованием jQuery, но можно и без) автоматически "нажималась" кнопка "Оплатить":
<?if($_REQUEST['AUTO_SUBMIT'] == 'Y'):?> <script> $(document).ready(function(){ $('#pay_system_div input[type=submit]').click(); }); </script> <?endif?> |
В файле payment.php платежной системы:
<form name="ShopForm" action="https://money.yandex.ru/eshop.xml" method="post" target="_blank"> |
<form name="ShopForm" action="http://money.yandex.ru/eshop.xml" method="post"> |