Якого спостерігача використовувати після замовлення на успіх у Magento 2?


11

Я працюю над цим розширенням Magento 2, і частина функцій полягає в тому, щоб передавати інформацію про замовлення на зовнішній додаток за допомогою веб-служб. Мені потрібно надіслати цю інформацію після того, як замовлення розміщено в касі.

На даний момент я використовую подію, checkout_onepage_controller_success_actionяка запускає метод створення замовлень у зовнішньому додатку. Я помістив цю подію /etc/frontend/events.xml.

Поки це працює, але я знайшов проблему зі статусом замовлень. Інколи замовлення все ще перебувають у pendingстатусі, а інший раз, коли замовлення є processing. Причиною цього є те, що спосіб оплати спочатку ініціалізує замовлення як очікувані, а після затвердження платежу замовлення зміниться на обробку. Я хочу натискати лише processingнакази. Здається, іноді подія checkout_onepage_controller_success_actionпроходить до того, як платіж буде дозволений, і це спричиняє проблеми.

Будь-яка ідея, як це вирішити? як я можу переконатися, що обробка платежів працює перед тим, як запустити код checkout_onepage_controller_success_action?

Після мого коду:

події.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
    }
}

Відповіді:


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 washing. Будь-які пропозиції?
Даніель Сільва

@DanielSilva У мене була така ж проблема з подіями, які не спрацьовували, але тоді вона спрацювала, коли перейшла з кордону до глобальної. Тобто переїхав з etc/frontend/events.xmlна etc/events.xml. Це не повинно відбуватися, але це має місце, навіть якщо вміст ідентичний.
clockworkgeek

Відповідно до цієї старої проблеми, Magento не може фіксувати події sales_order_ * , рішення - змінити папку "frontend" на "webapi_rest".
clockworkgeek

3

Будь ласка, використовуйте 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;
    }

2

Ви можете використовувати sales_order_state_change_beforeподію. Він надає доступ до замовлення і дозволить вам перевірити, чи оплата була оброблена. Потім, коли платіж буде оброблений, він буде звільнений знову, що дозволить створити назву компанії.

Загалом, схоже, Magento 2 віддаляється від подій на користь плагінів. Хоча багато хто з громади можуть не погодитися з таким підходом, тут обов'язково потрібно пам’ятати.


Дякую за відповідь @tjons. Здається, що в Magento 2. залишилось не так багато подій, я спробую скористатися sales_order_state_change_before і повідомляти вам, як це відбувається.
Едуардо

Привіт @tjons, я намагався sales_order_state_change_beforeзамість цього, checkout_onepage_controller_success_actionале це не працювало. Не впевнений, де мені потрібно розмістити цю подію, і якщо вона буде запущена під час оформлення каси. У мене є etc/frontend/events.xmlякась подія, чому?
Едуардо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.