Tôi đang làm việc trên phần mở rộng Magento 2 này và một phần của các tính năng là đẩy thông tin về các đơn đặt hàng đến một ứng dụng bên ngoài bằng các dịch vụ web. Tôi cần đẩy thông tin này sau khi đơn hàng được đặt trong thanh toán.
Hiện tại tôi đang sử dụng sự kiện checkout_onepage_controller_success_action
kích hoạt phương thức tạo đơn hàng trong ứng dụng bên ngoài. Tôi đặt sự kiện này trong /etc/frontend/events.xml
.
Cho đến nay điều này đang hoạt động nhưng tôi tìm thấy một vấn đề với trạng thái đơn đặt hàng. Đôi khi các đơn đặt hàng vẫn ở pending
trạng thái và một số lần khác các đơn đặt hàng được trong processing
. Lý do cho điều này là do phương thức thanh toán trước tiên khởi tạo các đơn đặt hàng là chờ xử lý và sau khi thanh toán được phê duyệt, các đơn đặt hàng đã thay đổi thành xử lý. Tôi chỉ muốn đẩy processing
đơn hàng. Có vẻ như đôi khi sự kiện diễn checkout_onepage_controller_success_action
ra trước khi thanh toán được ủy quyền và điều này gây ra sự cố.
Bất kỳ ý tưởng làm thế nào để giải quyết điều này? làm cách nào để đảm bảo quá trình xử lý thanh toán chạy trước khi tôi chạy mã của mình checkout_onepage_controller_success_action
?
Theo mã của tôi:
sự kiện
<?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>
TạoCompanynameOrderObserver.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
}
}