Je travaille sur cette extension Magento 2 et une partie des fonctionnalités consiste à pousser les informations sur les commandes vers une application externe à l'aide de services Web. Je dois pousser ces informations après qu'une commande est passée à la caisse.
En ce moment, j'utilise l'événement checkout_onepage_controller_success_action
qui déclenche la méthode pour créer les commandes dans l'application externe. J'ai placé cet événement dans /etc/frontend/events.xml
.
Jusqu'à présent, cela fonctionne, mais j'ai trouvé un problème avec le statut des commandes. Parfois, les commandes sont toujours en cours pending
et d'autres fois, les commandes sont en cours processing
. La raison en est que le mode de paiement initialise d'abord les commandes en attente et après l'approbation du paiement, les commandes sont passées au traitement. Je veux pousser uniquement les processing
commandes. Il semble que parfois l'événement se checkout_onepage_controller_success_action
déroule avant que le paiement ne soit autorisé et que cela cause des problèmes.
Aucune idée sur la façon de résoudre ça? comment puis-je m'assurer que le traitement des paiements s'exécute avant d'exécuter mon code checkout_onepage_controller_success_action
?
En suivant mon 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
}
}