Добрый день!
Хочу поделиться полезнейшим событием из ядра d7 - , которое здорово помогло при решении моей проблемы. Но обо всём по-подробнее.
Имеется сайт, который принимает онлайн оплату Сбербанка. При этом клиент может оплатить как часть заказа, так и полную стоимость. Факт оплаты мы должны отправлять на сторонний сервис. Казалось бы всё просто: воспользуйтесь событием из старого ядра. Сказано - сделано!
И тут начались проблемы: почему-то часть оплат отправляются на сторонний сервис, а часть - нет. Стали копать, и выяснили: оказывается событие OnSalePayOrder срабатывает только при полной оплате стоимости заказа. Стали думать-размышлять, гуглить, и тут наткнулись на замечательное событие из ядра d7 OnSalePaymentEntitySaved.
Данное событие срабатывает после сохранения сущности оплаты, и не важно: оплачена ли полная стоимость заказа или частичная. Отлавливаем факт оплаты "PAID" = "Y" и отправляем данные. Ниже приведу небольшие фрагменты кода:
1. Регистрируем события для нашего модуля интеграций
2. Пишем метод обработчик. В моём случае я дополнительно получаю данные по заказу, и далее, в зависимости от выбранной платежной системы (помимо Сбербанка используется и некоторые другие), создаём специальный объект класса под каждую платежную систему, который выполняет функции отправки данных в сервис.
Надеюсь кому то пригодится.
Хочу поделиться полезнейшим событием из ядра d7 - , которое здорово помогло при решении моей проблемы. Но обо всём по-подробнее.
Имеется сайт, который принимает онлайн оплату Сбербанка. При этом клиент может оплатить как часть заказа, так и полную стоимость. Факт оплаты мы должны отправлять на сторонний сервис. Казалось бы всё просто: воспользуйтесь событием из старого ядра. Сказано - сделано!
И тут начались проблемы: почему-то часть оплат отправляются на сторонний сервис, а часть - нет. Стали копать, и выяснили: оказывается событие OnSalePayOrder срабатывает только при полной оплате стоимости заказа. Стали думать-размышлять, гуглить, и тут наткнулись на замечательное событие из ядра d7 OnSalePaymentEntitySaved.
Данное событие срабатывает после сохранения сущности оплаты, и не важно: оплачена ли полная стоимость заказа или частичная. Отлавливаем факт оплаты "PAID" = "Y" и отправляем данные. Ниже приведу небольшие фрагменты кода:
1. Регистрируем события для нашего модуля интеграций
$eventManager = \Bitrix\Main\EventManager::getInstance(); // Изменение сущности оплаты $eventManager->registerEventHandler( "sale", "OnSalePaymentEntitySaved", $this->MODULE_ID, "\Integration\Handler\Order", "OnSalePaymentEntitySaved" ); |
/**
* @param Event $obEvent
* @throws \Bitrix\Main\ArgumentException
* @throws \Bitrix\Main\ArgumentNullException
* @throws \Bitrix\Main\LoaderException
* @throws \Bitrix\Main\NotImplementedException
*/
public function OnSalePaymentEntitySaved(Event $obEvent)
{
if (!Loader::includeModule("custommolule.integration")) {
return;
}
/** @var \Bitrix\Sale\Payment $obPayment */
$obPayment = $obEvent->getParameter("ENTITY");
$arPayment = $obPayment->getFields()->getValues();
$obEntity = \Bitrix\Sale\Order::load($arPayment["ORDER_ID"]);
Payment\Base::createInstance($arPayment, $obEntity);
} |
Надеюсь кому то пригодится.