Estou trabalhando nessa extensão do Magento 2 e parte dos recursos é enviar informações sobre os pedidos para um aplicativo externo usando serviços da web. Preciso enviar essas informações depois que um pedido é feito no check-out.
No momento, estou usando o evento checkout_onepage_controller_success_action
que aciona o método para criar os pedidos no aplicativo externo. Eu coloquei este evento em /etc/frontend/events.xml
.
Até o momento, isso está funcionando, mas encontrei um problema com o status dos pedidos. Às vezes, os pedidos ainda estão no pending
status e, outras vezes, nos pedidos processing
. O motivo disso é que o método de pagamento inicializa os pedidos como pendentes e, após a aprovação do pagamento, os pedidos são alterados para processamento. Eu quero enviar apenas processing
pedidos. Parece que, às vezes, o evento checkout_onepage_controller_success_action
ocorre antes do pagamento ser autorizado e isso está causando os problemas.
Alguma idéia de como resolver isso? como posso garantir que o processamento do pagamento seja executado antes da execução do meu código checkout_onepage_controller_success_action
?
Seguindo meu código:
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
paraetc/events.xml
. Isso não deveria acontecer, mas acontece mesmo que o conteúdo seja idêntico.Você pode usar o
sales_order_state_change_before
evento. Ele fornece acesso ao pedido e permitirá que você verifique se o pagamento foi processado. Então, quando o pagamento for processado, ele será acionado novamente, o que permitirá que você crie o nome da empresa.Em geral, o Magento 2 parece estar se afastando de eventos em favor de plugins. Embora muitos na comunidade possam não concordar com essa abordagem, é definitivamente algo a ter em mente aqui.
fonte
sales_order_state_change_before
vez de,checkout_onepage_controller_success_action
mas não estava funcionando. Não tenho certeza de onde eu preciso realizar esse evento e se ele será acionado durante o checkout. Eu tenho o meu evento emetc/frontend/events.xml
alguma pista por quê?Por favor, use o evento sales_order_place_after .
Este evento é chamado apenas uma vez e quando o pedido é realizado com sucesso no fornecedor de arquivos / magento / module-sales / Model / Order.php na função abaixo.
fonte