Pengamat mana yang akan digunakan setelah pesanan sukses di Magento 2?

11

Saya sedang mengerjakan ekstensi Magento 2 ini dan bagian dari fiturnya adalah untuk mendorong informasi tentang pesanan ke aplikasi eksternal menggunakan layanan web. Saya perlu memasukkan informasi ini setelah pemesanan dilakukan di kasir.

Saat ini saya menggunakan acara checkout_onepage_controller_success_actionyang memicu metode untuk membuat pesanan di aplikasi eksternal. Saya menempatkan acara ini di /etc/frontend/events.xml.

Sejauh ini ini berfungsi tetapi saya menemukan masalah dengan status pesanan. Kadang-kadang pesanan masih dalam pendingstatus dan kadang-kadang ada pesanan processing. Alasannya adalah karena metode pembayaran pertama-tama menginisialisasi pesanan sebagai yang tertunda dan setelah pembayaran disetujui, pesanan diubah menjadi pemrosesan. Saya hanya ingin mendorong processingpesanan. Sepertinya terkadang acara checkout_onepage_controller_success_actionberjalan sebelum pembayaran disahkan dan ini menyebabkan masalah.

Ada ide untuk mengatasi ini? bagaimana saya bisa memastikan pemrosesan pembayaran berjalan sebelum saya menjalankan kode saya checkout_onepage_controller_success_action?

Mengikuti kode saya:

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>

Buat Nama PerusahaanOrderObserver.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
    }
}
Eduardo
sumber

Jawaban:

6

Anda bisa mencoba acara tersebut

checkout_submit_all_after

Ini berjalan setelah pesanan berhasil dikirim (dan di back-end saat Anda membuat pesanan juga)

Misalnya, di events.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>

Dan di pengamat

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

    // Do whatever you want here

    return $this;
}
NgocDB
sumber
Ini tidak bekerja untuk saya. Acara tidak dipecat. Saya mencoba dengan "checkout_submit_all_after" dan juga dengan "sales_order_place_after" tetapi satu-satunya peristiwa yang dapat saya tangkap dengan pengamat adalah checkout_onepage_controller_success_action. Ada saran?
Daniel Silva
@DanielSilva Saya memiliki masalah yang sama dengan peristiwa yang tidak terjadi tetapi kemudian berhasil ketika dipindahkan dari frontend ke global. Artinya, pindah dari etc/frontend/events.xmlke etc/events.xml. Ini seharusnya tidak terjadi tetapi itu terjadi meskipun isinya identik.
clockworkgeek
Menurut masalah lama ini, Magento tidak dapat menangkap peristiwa sales_order_ * , solusinya adalah mengubah folder "frontend" menjadi "webapi_rest".
clockworkgeek
2

Anda bisa menggunakan sales_order_state_change_beforeacara tersebut. Ini memberikan akses ke pesanan dan akan memungkinkan Anda untuk memeriksa apakah pembayaran telah diproses. Kemudian, ketika pembayaran diproses, itu akan dipecat lagi, yang akan memungkinkan Anda untuk membuat nama perusahaan.

Secara umum, Magento 2 tampaknya menjauh dari acara yang mendukung plugin. Sementara banyak orang di komunitas mungkin tidak setuju dengan pendekatan itu, itu pasti sesuatu yang perlu diingat di sini.

tjons
sumber
Terima kasih atas jawaban @jons. Tampaknya tidak banyak acara yang tersisa di Magento 2. Saya akan mencoba menggunakan sales_order_state_change_before dan memberi tahu Anda bagaimana kelanjutannya.
Eduardo
Hey @tjons, saya mencoba sales_order_state_change_beforebukannya checkout_onepage_controller_success_actiontetapi tidak berhasil. Tidak yakin di mana saya harus meletakkan acara ini dan apakah akan dipicu saat checkout. Saya punya acara saya di etc/frontend/events.xmlpetunjuk mengapa?
Eduardo
1

Silakan gunakan sales_order_place_after acara.

Panggilan acara ini hanya sekali dan ketika pesanan berhasil ditempatkan dari vendor file / magento / modul-penjualan / Model / Order.php dalam fungsi di bawah ini.

/**
     * 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;
    }
Bhavin iFlair
sumber