среда, 25 января 2012 г.

1C-Битрикс: Выбор платежной системы в зависимости от стоимости заказа.

Как вы наверное знаете, агрегаторы платежных систем в монополистическом сговоре с провайдерами связи сотовой связи ввели совершенно лошадиные комиссии за оплату услуг по SMS. Шкала вознаграждения агрегатора растет практически в логарифмическом масштабе в зависимости от стоимости заказа. До 100 рублей комиссия еще терпима но, например при стоимости заказа около 1000 р. комиссия будет 50% и больше, при этом либо вы сами будете терпеть убытки, либо придется возложить траты на клиента, существенно увеличивая стоимость заказа, что тоже не камельфо, потому что всегда есть гадкие конкуренты.

Именно поэтому алчный работодатель поставил передо мной задачу не дать пользователю оплатить заказ по SMS, если он стоит больше 100 рублей.

Итак исходные данные: сайт работает на 1С-Битрикс, редакция Бизнес. Пользуемся агрегатором MainPay (за год работы они сменили несколько названий, но даже обращения в службу поддержки до сих пор остались в моем кабинете).

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

Создаем и настраиваем в битриксе две платежные системы. разумеется тестируем, что все работает.  Записываем ID обоих платежных систем.

Теперь нужно сделать фоновый для пользователя выбор в зависимости от суммы заказа. Если он меньше 100 р. выводим обе платежные системы, если больше то только ту, которая без SMS. Я использую компонент sale.order.ajax. Поэтому я иду в шаблон компонента (если вы используете дефолтный шаблон, обязательно создайте свой, потому что при следующем обновлении исправленный дефолтный шаблон будет переписан стандартным), и нахожу код цикла вывода платежных систем, начинается он строками:

    foreach($arResult["PAY_SYSTEM"] as $arPaySystem)
    {
        if(count($arResult["PAY_SYSTEM"]) == 1)

В моем случае платежных систем заведомо больше одной, поэтому идем до else {} и добавляем код:

if ((intval(str_replace(" ", "", $arResult['ORDER_TOTAL_PRICE_FORMATED']))>100)&&($arPaySystem["ID"]==9)){
            }
            else{

 ну и не забываем в конце добавить еще одну фигурную скобку.
Теперь поясню. Вначале  хотел привязаться к ORDER_PRICE, но этот значение не учитывает скидок и стоимости доставки. Полную стоимость всего заказа я смог получить только из  ORDER_TOTAL_PRICE_FORMATED, но это стринговая переменная в которой тысячи отделены пробелами, поэтому, чтобы получить числовое значение сначала удаляем пробелы (str_replace), а затем берем от получившегося целочисленное значение. В $arPaySystem["ID"] пишете ID своей платежной системы. Таким же образом можно организовать множественный выбор в зависимости от стоимости или любых других параметров заказа.

Вот и вся хитрость.    

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