Jakiego obserwatora użyć po sukcesie w Magento 2?

11

Pracuję nad tym rozszerzeniem Magento 2, a częścią funkcji jest przekazywanie informacji o zamówieniach do zewnętrznej aplikacji korzystającej z usług internetowych. Muszę przekazać te informacje po złożeniu zamówienia w kasie.

W tej chwili korzystam ze zdarzenia, checkout_onepage_controller_success_actionktóre wyzwala metodę tworzenia zamówień w zewnętrznej aplikacji. Umieściłem to wydarzenie w /etc/frontend/events.xml.

Jak dotąd działa, ale znalazłem problem ze statusem zamówień. Czasami zamówienia są nadal w pendingstanie, a innym razem zamówienia processing. Powodem tego jest to, że metoda płatności najpierw inicjuje zamówienia jako oczekujące, a po zatwierdzeniu płatności zamówienia zmieniają się na przetwarzanie. Chcę pchać tylko processingzamówienia. Wydaje się, że czasami zdarzenie jest checkout_onepage_controller_success_actionuruchamiane przed autoryzacją płatności, co powoduje problemy.

Masz pomysł, jak to rozwiązać? Jak mogę się upewnić, że przetwarzanie płatności działa, zanim uruchomię mój kod checkout_onepage_controller_success_action?

Zgodnie z moim kodem:

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
    }
}
Eduardo
źródło

Odpowiedzi:

7

Możesz spróbować tego wydarzenia

checkout_submit_all_after

Działa po pomyślnym przesłaniu zamówienia (oraz w back-endie, gdy zamówienie zostało utworzone)

Na przykład w 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>

I u obserwatora

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

    // Do whatever you want here

    return $this;
}
NgocDB
źródło
To mi nie działa. Wydarzenie nie zostało wystrzelone. Próbowałem z „checkout_submit_all_after”, a także z „sales_order_place_after”, ale jedynym zdarzeniem, które jestem w stanie zarejestrować u obserwatora, jest checkout_onepage_controller_success współdziałanie. Jakieś sugestie?
Daniel Silva
@DanielSilva Miałem ten sam problem ze zdarzeniami, które się nie odpalały, ale potem zadziałały, kiedy przeniosłem się z frontendu na globalny. Oznacza to, że przeniósł się z etc/frontend/events.xmldo etc/events.xml. To nie powinno się zdarzyć, ale dzieje się tak, mimo że treść jest identyczna.
clockworkgeek,
Zgodnie z tym starym problemem Magento nie może rejestrować zdarzeń sales_order_ * , rozwiązaniem jest zmiana folderu „frontend” na „webapi_rest”.
clockworkgeek,
2

Możesz użyć sales_order_state_change_beforewydarzenia. Zapewnia dostęp do zamówienia i pozwala sprawdzić, czy płatność została przetworzona. Następnie, po przetworzeniu płatności, zostanie ona ponownie uruchomiona, co pozwoli ci utworzyć nazwę firmy.

Ogólnie rzecz biorąc, Magento 2 wydaje się odchodzić od wydarzeń na rzecz wtyczek. Chociaż wielu członków społeczności może nie zgodzić się z tym podejściem, zdecydowanie warto o tym pamiętać.

tjons
źródło
Dzięki za odpowiedź @ tjons. Wygląda na to, że w Magento 2 nie pozostało wiele wydarzeń. Spróbuję użyć przedrostka_sprzedaż_przedaż i dam znać, jak to działa.
Eduardo,
Cześć @tjons, próbowałem sales_order_state_change_beforezamiast, checkout_onepage_controller_success_actionale to nie działało. Nie jestem pewien, gdzie muszę umieścić to wydarzenie i czy zostanie ono uruchomione podczas realizacji transakcji. Mam swoje wydarzenie w etc/frontend/events.xmljakimś tropie, dlaczego?
Eduardo,
2

Użyj zdarzenia sales_order_place_after .

To zdarzenie wywołuje tylko raz i po pomyślnym złożeniu zamówienia od dostawcy pliku / magento / module-sales / Model / Order.php w poniższej funkcji.

/**
     * 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;
    }
Bhavin iFlair
źródło