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_action
das 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 pending
Status 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 processing
Bestellungen pushen . Es scheint, dass das Ereignis manchmal ausgeführt wird, checkout_onepage_controller_success_action
bevor 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
}
}
etc/frontend/events.xml
nachetc/events.xml
. Dies sollte nicht passieren, tut es aber, obwohl der Inhalt identisch ist.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.
quelle
sales_order_state_change_before
stattdessen versucht,checkout_onepage_controller_success_action
aber 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 inetc/frontend/events.xml
irgendeiner Ahnung warum?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.
quelle