Estoy trabajando en esta extensión de Magento 2 y parte de las características es enviar información sobre los pedidos a una aplicación externa mediante servicios web. Necesito enviar esta información después de realizar un pedido en la caja.
En este momento estoy usando el evento checkout_onepage_controller_success_action
que activa el método para crear los pedidos en la aplicación externa. Coloqué este evento en /etc/frontend/events.xml
.
Hasta ahora esto funciona, pero encontré un problema con el estado de los pedidos. A veces, los pedidos todavía están en pending
estado y otras veces los pedidos están en processing
. La razón de esto es porque el método de pago primero inicializa los pedidos como pendientes y después de que se aprueba el pago, los pedidos cambian a procesamiento. Solo quiero enviar processing
órdenes. Parece que a veces el evento se checkout_onepage_controller_success_action
ejecuta antes de que se autorice el pago y esto está causando los problemas.
Alguna idea de como resolver esto? ¿Cómo puedo asegurarme de que el procesamiento de pagos se ejecute antes de ejecutar mi código checkout_onepage_controller_success_action
?
Siguiendo mi código:
eventos.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
aetc/events.xml
. Esto no debería suceder, pero sucede a pesar de que el contenido es idéntico.Puedes usar el
sales_order_state_change_before
evento. Proporciona acceso al pedido y le permitirá verificar si se procesó el pago. Luego, cuando se procese el pago, se volverá a disparar, lo que le permitirá crear el nombre de la empresa.En general, Magento 2 parece estar alejándose de los eventos en favor de los complementos. Si bien muchos en la comunidad pueden no estar de acuerdo con ese enfoque, definitivamente es algo a tener en cuenta aquí.
fuente
sales_order_state_change_before
lugar decheckout_onepage_controller_success_action
pero no estaba funcionando. No estoy seguro de dónde necesito colocar este evento y si se activará durante el pago. Tengo mi evento enetc/frontend/events.xml
alguna pista ¿por qué?Utilice sales_order_place_after event.
Este evento se llama solo una vez y cuando el pedido se realiza con éxito desde el archivo vendor / magento / module-sales / Model / Order.php en la siguiente función.
fuente