Welchen Beobachter soll er nach der Erfolgsreihenfolge auf Magento 2 verwenden?


11

Ich arbeite an dieser Magento 2-Erweiterung. Ein Teil der Funktionen besteht darin, Informationen über die Bestellungen mithilfe von Webdiensten an eine externe Anwendung zu senden. Ich muss diese Informationen weitergeben, nachdem eine Bestellung an der Kasse aufgegeben wurde.

Im Moment verwende ich das Ereignis, checkout_onepage_controller_success_actiondas die Methode zum Erstellen der Bestellungen in der externen App auslöst. Ich habe diese Veranstaltung in platziert /etc/frontend/events.xml.

Bisher funktioniert dies, aber ich habe ein Problem mit dem Auftragsstatus gefunden. Manchmal sind die Bestellungen noch im pendingStatus und manchmal sind die Bestellungen in processing. Der Grund dafür ist, dass die Zahlungsmethode die Bestellungen zuerst als ausstehend initialisiert und nach Genehmigung der Zahlung die Bestellungen in die Verarbeitung geändert haben. Ich möchte nur processingBestellungen pushen . Es scheint, dass das Ereignis manchmal ausgeführt wird, checkout_onepage_controller_success_actionbevor die Zahlung autorisiert wurde, und dies verursacht die Probleme.

Irgendeine Idee, wie man das löst? Wie kann ich sicherstellen, dass die Zahlungsverarbeitung ausgeführt wird, bevor ich meinen Code eingebe checkout_onepage_controller_success_action?

Nach meinem Code:

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
    }
}

Antworten:


6

Sie können das Ereignis versuchen

checkout_submit_all_after

Es wird ausgeführt, nachdem die Bestellung erfolgreich übermittelt wurde (und im Back-End, wenn Sie auch eine Bestellung erstellt haben).

Zum Beispiel in 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>

Und im Beobachter

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

    // Do whatever you want here

    return $this;
}

Das funktioniert bei mir nicht. Die Veranstaltung wurde nicht ausgelöst. Ich habe es mit "checkout_submit_all_after" und auch mit "sales_order_place_after" versucht, aber das einzige Ereignis, das ich mit einem Beobachter erfassen kann, ist checkout_onepage_controller_success_action. Irgendwelche Vorschläge?
Daniel Silva

@ DanielSilva Ich hatte das gleiche Problem mit Ereignissen, die nicht ausgelöst wurden, aber dann funktionierte es, als ich vom Frontend zum globalen verschoben wurde. Das heißt, verschoben von etc/frontend/events.xmlnach etc/events.xml. Dies sollte nicht passieren, tut es aber, obwohl der Inhalt identisch ist.
Uhrwerk

Laut diesem alten Problem kann Magento sales_order_ * -Ereignisse nicht erfassen . Die Lösung besteht darin, den Ordner "frontend" in "webapi_rest" zu ändern.
Uhrwerk

2

Du kannst den ... benutzen sales_order_state_change_before Ereignis verwenden. Es bietet Zugriff auf die Bestellung und ermöglicht es Ihnen zu überprüfen, ob die Zahlung verarbeitet wurde. Wenn die Zahlung verarbeitet wird, wird sie erneut ausgelöst, sodass Sie den Firmennamen erstellen können.

Im Allgemeinen scheint sich Magento 2 von Ereignissen zugunsten von Plugins zu entfernen. Während viele in der Community diesem Ansatz möglicherweise nicht zustimmen, ist dies hier definitiv zu beachten.


Danke für die Antwort @tjons. Es scheint, dass in Magento 2 nicht mehr viele Ereignisse vorhanden sind. Ich werde versuchen, sales_order_state_change_before zu verwenden, und Sie wissen lassen, wie es geht.
Eduardo

Hey @tjons, ich habe es sales_order_state_change_beforestattdessen versucht, checkout_onepage_controller_success_actionaber es hat nicht funktioniert. Ich bin mir nicht sicher, wo ich dieses Ereignis platzieren muss und ob es beim Auschecken ausgelöst wird. Ich habe meine Veranstaltung in etc/frontend/events.xmlirgendeiner Ahnung warum?
Eduardo

1

Bitte verwenden Sie sales_order_place_after Ereignis .

Dieses Ereignis wird nur einmal aufgerufen und wenn die Bestellung erfolgreich aus der Datei vendor / magento / module-sales / Model / Order.php in der folgenden Funktion aufgegeben wurde.

/**
     * 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;
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.