Người quan sát nào sẽ sử dụng sau khi đặt hàng thành công trên Magento 2?


11

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_actionkí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 ở pendingtrạ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_actionra 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
    }
}

Câu trả lời:


6

Bạn có thể thử sự kiện

checkout_submit_all_after

Nó chạy sau khi đơn hàng được gửi thành công (và ở phía sau khi bạn cũng tạo đơn hàng)

Ví dụ: trong event.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">

    <event name="checkout_submit_all_after">
        <observer name="yourcompany_yourmodule_checkout_submit_all_after" instance="YourCompany\YourModule\Observer\ProcessOrder" />
    </event>

</config>

Và trong người quan sát

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $order = $observer->getOrder();
    $quote = $observer->getQuote();

    // Do whatever you want here

    return $this;
}

Điều này không làm việc cho tôi. Sự kiện này không bị sa thải. Tôi đã thử với "checkout_submit_all_after" và cả với "sales_order_place_after" nhưng sự kiện duy nhất tôi có thể chụp với người quan sát là checkout_onepage_controll_success_action. Bất kỳ đề xuất?
Daniel Silva

@DanielSilva Tôi gặp vấn đề tương tự với các sự kiện không nổ súng nhưng sau đó nó đã hoạt động khi chuyển từ frontend sang toàn cầu. Đó là, chuyển từ etc/frontend/events.xmlđến etc/events.xml. Điều này không nên xảy ra nhưng nó thực hiện mặc dù nội dung giống hệt nhau.
clockworkgeek

Theo vấn đề cũ này, Magento không thể nắm bắt các sự kiện sales_order_ * , giải pháp là thay đổi thư mục "frontend" thành "webapi_rest".
clockworkgeek

2

Bạn có thể sử dụng sales_order_state_change_beforesự kiện này. Nó cung cấp quyền truy cập vào đơn đặt hàng và sẽ cho phép bạn kiểm tra xem khoản thanh toán đã được xử lý chưa. Sau đó, khi thanh toán được xử lý, nó sẽ được kích hoạt lại, điều này sẽ cho phép bạn tạo tên công ty.

Nhìn chung, Magento 2 dường như đang di chuyển khỏi các sự kiện có lợi cho các plugin. Mặc dù nhiều người trong cộng đồng có thể không đồng ý với cách tiếp cận đó, nhưng đây chắc chắn là điều cần lưu ý ở đây.


Cảm ơn câu trả lời @tjons. Có vẻ như không còn nhiều sự kiện trong Magento 2. Tôi sẽ cố gắng sử dụng sales_order_state_change_b Before và cho bạn biết nó diễn ra như thế nào.
Eduardo

Xin chào @tjons, tôi đã thử sales_order_state_change_beforethay vì checkout_onepage_controller_success_actionnhưng nó không hoạt động. Không chắc chắn nơi tôi cần đặt sự kiện này và nếu nó sẽ được kích hoạt trong quá trình thanh toán. Tôi có sự kiện của tôi trong etc/frontend/events.xmlbất kỳ đầu mối tại sao?
Eduardo

1

Vui lòng sử dụng sales_order_place_after sự kiện.

Sự kiện này chỉ gọi một lần và khi đơn hàng được đặt thành công từ nhà cung cấp tệp / magento / module-sales / Model / Order.php trong chức năng dưới đây.

/**
     * Place order
     *
     * @return $this
     */
    public function place()
    {
        $this->_eventManager->dispatch('sales_order_place_before', ['order' => $this]);
        $this->_placePayment();
        $this->_eventManager->dispatch('sales_order_place_after', ['order' => $this]);
        return $this;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.