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_action
któ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 pending
stanie, 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 processing
zamówienia. Wydaje się, że czasami zdarzenie jest checkout_onepage_controller_success_action
uruchamiane 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
}
}
etc/frontend/events.xml
doetc/events.xml
. To nie powinno się zdarzyć, ale dzieje się tak, mimo że treść jest identyczna.Możesz użyć
sales_order_state_change_before
wydarzenia. 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ć.
źródło
sales_order_state_change_before
zamiast,checkout_onepage_controller_success_action
ale 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 wetc/frontend/events.xml
jakimś tropie, dlaczego?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.
źródło