Я работаю над этим расширением Magento 2, и часть его функций заключается в передаче информации о заказах во внешнее приложение с помощью веб-служб. Мне нужно нажать эту информацию после размещения заказа на кассе.
В данный момент я использую событие, checkout_onepage_controller_success_action
которое запускает метод для создания заказов во внешнем приложении. Я поместил это событие в /etc/frontend/events.xml
.
Пока это работает, но я нашел проблему со статусом заказов. Иногда заказы все еще находятся в pending
статусе, а в некоторых других случаях заказы находятся в processing
. Причина этого заключается в том, что метод оплаты сначала инициализирует заказы как ожидающие, а после того, как платеж утвержден, заказы изменились на обработку. Я хочу выдвигать только processing
заказы. Кажется, что иногда событие checkout_onepage_controller_success_action
проходит до того, как платеж авторизован, и это вызывает проблемы.
Есть идеи, как это решить? Как я могу убедиться, что обработка платежа выполняется до того, как я запустил свой код checkout_onepage_controller_success_action
?
После моего кода:
events.xml
<?xml version="1.0"?>
<!--
/**
* Copyright © 2017 companyname.com
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="checkout_onepage_controller_success_action">
<observer name="companyname_order_success" instance="Companyname\Shipping\Observer\CreateCompanynameOrderObserver" />
</event>
</config>
CreateCompanynameOrderObserver.php
/**
* Create an order in Companyname when order status match the statuses in the backend
*
* @param EventObserver $observer
* @return void
*/
public function execute(EventObserver $observer){
$order_ids = $observer->getEvent()->getOrderIds();
$order_id = $order_ids[0];
//Loading order details
$orderModel = $this->_orderFactory->create();
$order = $orderModel->load($order_id);
$shipping_method = $order->getShippingMethod();
$order_status = $order->getStatus();
if($order_status == 'processing'){
//Push to external app
}
}
etc/frontend/events.xml
вetc/events.xml
. Этого не должно происходить, но это происходит, даже если содержание идентично.Вы можете использовать
sales_order_state_change_before
событие. Он предоставляет доступ к заказу и позволит вам проверить, был ли обработан платеж. Затем, когда платеж будет обработан, он будет запущен снова, что позволит вам создать название компании.В целом Magento 2, похоже, удаляется от событий в пользу плагинов. Хотя многие в сообществе могут не согласиться с таким подходом, здесь определенно следует иметь в виду.
источник
sales_order_state_change_before
вместо,checkout_onepage_controller_success_action
но это не работало. Не уверен, где мне нужно разместить это событие и будет ли оно срабатывать во время оформления заказа. У меня есть событие вetc/frontend/events.xml
какой-либо подсказке, почему?Пожалуйста, используйте событие sales_order_place_after .
Это событие вызывается только один раз и при успешном размещении заказа из файла vendor / magento / module-sales / Model / Order.php в функции ниже.
источник