Sto lavorando su questa estensione Magento 2 e parte delle funzionalità consiste nel trasferire informazioni sugli ordini a un'applicazione esterna utilizzando i servizi Web. Devo inviare queste informazioni dopo che un ordine è stato effettuato alla cassa.
Al momento sto utilizzando l'evento checkout_onepage_controller_success_action
che attiva il metodo per creare gli ordini nell'app esterna. Ho inserito questo evento in /etc/frontend/events.xml
.
Finora funziona, ma ho riscontrato un problema con lo stato degli ordini. A volte gli ordini sono ancora in pending
stato e altre volte gli ordini sono in processing
. Il motivo è dovuto al fatto che il metodo di pagamento ha inizialmente inizializzato gli ordini come in sospeso e dopo l'approvazione del pagamento, gli ordini sono passati all'elaborazione. Voglio spingere solo processing
ordini. Sembra che a volte l'evento si checkout_onepage_controller_success_action
verifichi prima che il pagamento sia autorizzato e questo sta causando i problemi.
Qualche idea su come risolverlo? come posso assicurarmi che l'elaborazione del pagamento venga eseguita prima di eseguire il mio codice checkout_onepage_controller_success_action
?
Seguendo il mio codice:
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
}
}