在Magento 2成功订购后要使用哪个观察者?


11

我正在开发此Magento 2扩展程序,部分功能是使用Web服务将有关订单的信息推送到外部应用程序。在结帐单中下订单后,我需要推送此信息。

目前,我正在使用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
    }
}

Answers:


7

您可以尝试活动

checkout_submit_all_after

它在成功提交订单后运行(在创建订单时也在后端)

例如,在events.xml中

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">

    <event name="checkout_submit_all_after">
        <observer name="yourcompany_yourmodule_checkout_submit_all_after" instance="YourCompany\YourModule\Observer\ProcessOrder" />
    </event>

</config>

并在观察者

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $order = $observer->getOrder();
    $quote = $observer->getQuote();

    // Do whatever you want here

    return $this;
}

这对我不起作用。该事件未触发。我尝试使用“ checkout_submit_all_after”以及“ sales_order_place_after”,但是我能够用观察者捕获的唯一事件是checkout_onepage_controller_success_action。有什么建议么?
丹尼尔·席尔瓦

@DanielSilva我遇到了同样的问题,即事件没有触发,但是当从前端转移到全局时它确实起作用了。即从etc/frontend/events.xml移至etc/events.xml。即使内容相同,这也不应该发生,但是会发生。
clockworkgeek

根据这个旧问题,Magento无法捕获sales_order_ *事件,解决方案是将“ frontend”文件夹更改为“ webapi_rest”。
clockworkgeek

2

您可以使用该sales_order_state_change_before事件。它提供对订单的访问,并允许您检查付款是否已处理。然后,在处理付款后,将再次将其触发,这将使您可以创建公司名称。

总的来说,Magento 2似乎已经从事件转移到支持插件。尽管社区中的许多人可能不同意这种方法,但在此绝对要记住这一点。


感谢您的回答@tjons。看来Magento 2中没有多少事件了。我将尝试使用sales_order_state_change_before,并让您知道它的进展。
爱德华多

嘿@tjons,我尝试了一下sales_order_state_change_beforecheckout_onepage_controller_success_action但没有用。不知道我需要在哪里放置此事件,以及是否将在结帐期间触发该事件。我知道我的活动etc/frontend/events.xml为何?
爱德华多

2

请使用sales_order_place_after事件。

仅在以下功能中的文件vendor / magento / module-sales / Model / Order.php中成功下订单时,此事件才调用一次。

/**
     * Place order
     *
     * @return $this
     */
    public function place()
    {
        $this->_eventManager->dispatch('sales_order_place_before', ['order' => $this]);
        $this->_placePayment();
        $this->_eventManager->dispatch('sales_order_place_after', ['order' => $this]);
        return $this;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.