Перейти к содержимому

Служба доставки и платёжная система - настройка и свой обработчик

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

Решение

Смотрим службы доставки и их ограничения:

use Bitrix\Sale\Delivery\Services\Manager;
use Bitrix\Sale\Delivery\Restrictions;
foreach (Manager::getActiveList() as $service) {
$rules = Restrictions\Manager::getRestrictionsList($service['ID']);
printf("%-6s %-28s ограничений=%d\n",
$service['ID'], $service['NAME'], count($rules));
}

Служба показывается заказу, только если прошла все свои ограничения. Ни одно из них не сообщает покупателю о причине отказа: служба просто не появляется в списке.

Проверяем ограничения на конкретном заказе:

$shipment = $order->getShipmentCollection()->getNotSystemItems()->current();
foreach (Manager::getRestrictedObjectsList($shipment) as $service) {
printf("доступна: %s\n", $service->getName());
}

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

Настраиваем приём уведомлений от банка:

Окно терминала
# адрес обработчика должен отвечать снаружи без авторизации и переадресаций
curl -I https://example.com/bitrix/tools/sale_ps_result.php
# 200 или 302 на сам обработчик - нормально, 401 и 403 - нет

Банк зовёт этот адрес сам, без участия покупателя. Закрытый авторизацией или переадресацией на защищённое соединение адрес приводит к тому, что оплата проходит, а заказ остаётся неоплаченным.

Пишем свой обработчик доставки:

namespace Local\Delivery;
use Bitrix\Sale\Delivery\Services\Base;
class PvzHandler extends Base
{
public function calculateConcrete(\Bitrix\Sale\Shipment $shipment)
{
// здесь считается стоимость: обращение к службе, тарифы, коэффициенты
return new \Bitrix\Sale\Delivery\CalculationResult();
}
public static function getClassTitle()
{
return 'Доставка до пункта выдачи'; // название в списке служб админки
}
}
// свой обработчик оплаты устроен так же: описание, класс и шаблон формы
// класс регистрируют событием модуля продаж, а не правкой его файлов

Свой обработчик регистрируется событием модуля продаж и дальше живёт как штатный: получает ограничения, настройки и профили. Переписывать чужой обработчик под себя не нужно - обновление модуля вернёт его к исходному виду.

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

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

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

Типичные проблемы

Служба активна, но в заказе её нет.

Она не проходит одно из ограничений. Проверка идёт против конкретной отгрузки и молча исключает службу из списка.

Оплата прошла, заказ не оплачен.

Уведомление от банка не дошло до обработчика. Адрес закрыт авторизацией, переадресацией или правилами веб-сервера.

После обновления модуля пропал свой обработчик.

Правился штатный обработчик вместо своего. Обновление возвращает файлы модуля к исходному виду.

Стоимость доставки считается неверно.

Вес или габариты товаров не заполнены. Обработчик получает нули и считает по минимальному тарифу.

Служба видна не всем покупателям.

У неё стоит ограничение по группе пользователя. Это штатная настройка, а не сбой прав доступа.

Частые вопросы

Чем профиль службы отличается от самой службы?

Служба - обработчик, профиль - её конкретный тариф или способ. У одной службы бывает несколько профилей с разными сроками и ценами.

Как передать в 1С данные о перевозчике?

Через свойства заказа: они выгружаются вместе с ним. Служба доставки как сущность в учётную систему не уезжает.

Можно ли считать доставку своим кодом без обработчика?

Технически да, событием пересчёта заказа, но такой расчёт не попадёт в ограничения и в интерфейс выбора. Обработчик даёт и то, и другое.

Почему тестовая оплата не проходит на локальном сервере?

Банк должен позвать адрес уведомления снаружи, а локальный сервер ему недоступен. Для проверки нужен адрес, открытый в интернете.

Смежное

Первоисточник