ผู้สังเกตการณ์คนไหนที่จะใช้หลังจากประสบความสำเร็จในการสั่งซื้อ Magento 2?


11

ฉันกำลังทำงานกับส่วนขยายของ Magento 2 และส่วนหนึ่งของฟีเจอร์นี้คือการส่งข้อมูลเกี่ยวกับคำสั่งซื้อไปยังแอปพลิเคชันภายนอกโดยใช้บริการเว็บ ฉันต้องการที่จะผลักดันข้อมูลนี้หลังจากที่สั่งซื้อสินค้าในการชำระเงิน

ในขณะนี้ฉันใช้งานเหตุการณ์checkout_onepage_controller_success_actionซึ่งทำให้วิธีการสร้างคำสั่งซื้อในแอปภายนอก /etc/frontend/events.xmlฉันวางเหตุการณ์นี้ได้ใน

ถึงตอนนี้มันใช้งานได้ แต่ฉันพบปัญหาเกี่ยวกับสถานะคำสั่งซื้อ บางครั้งคำสั่งซื้อที่ยังคงอยู่ในpendingสถานะและบางครั้งอื่น ๆ processingการสั่งซื้ออยู่ใน เหตุผลนี้เป็นเพราะวิธีการชำระเงินครั้งแรกเริ่มต้นคำสั่งซื้อเป็นรอดำเนินการและหลังจากการชำระเงินได้รับการอนุมัติคำสั่งซื้อเปลี่ยนไปประมวลผล ฉันต้องการผลักดันprocessingคำสั่งซื้อเท่านั้น ดูเหมือนว่าบางครั้งเหตุการณ์checkout_onepage_controller_success_actionจะทำงานก่อนที่การชำระเงินจะได้รับอนุญาตและนี่เป็นสาเหตุของปัญหา

ความคิดวิธีการแก้ปัญหานี้? วิธีการที่ฉันสามารถตรวจสอบการชำระเงินการประมวลผลการทำงานก่อนที่ผมจะเรียกใช้รหัสของฉันในcheckout_onepage_controller_success_action?

ตามรหัสของฉัน:

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
    }
}

คำตอบ:


7

คุณสามารถลองเหตุการณ์

checkout_submit_all_after

มันทำงานหลังจากส่งคำสั่งซื้อสำเร็จ (และในส่วนหลังเมื่อคุณสร้างคำสั่งซื้อด้วย)

ตัวอย่างเช่นใน 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>

และในผู้สังเกตการณ์

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

    // Do whatever you want here

    return $this;
}

มันไม่ทำงานสำหรับฉัน เหตุการณ์ไม่ถูกไล่ออก ฉันลองกับ "checkout_submit_all_after" และด้วยกับ "sales_order_place_after" แต่เหตุการณ์เดียวที่ฉันสามารถจับภาพด้วยผู้สังเกตได้คือ checkout_onepage_controller_success_action ข้อเสนอแนะใด ๆ
Daniel Silva

@DanielSilva ฉันมีปัญหาเดียวกันกับเหตุการณ์ที่ไม่ได้ยิง แต่ก็ทำงานได้เมื่อย้ายจากส่วนหน้าไปยังระดับโลก นั่นคือย้ายจากไปetc/frontend/events.xml etc/events.xmlสิ่งนี้ไม่ควรเกิดขึ้น แต่มันจะเกิดขึ้นแม้ว่าเนื้อหาจะเหมือนกัน
clockworkgeek

ตามปัญหาเก่านี้วีโอไอพีไม่สามารถจับภาพเหตุการณ์ sales_order_ *วิธีแก้ไขคือเปลี่ยนโฟลเดอร์ "ส่วนหน้า" เป็น "webapi_rest"
clockworkgeek

2

คุณสามารถใช้sales_order_state_change_beforeเหตุการณ์ มันให้การเข้าถึงคำสั่งซื้อและจะช่วยให้คุณตรวจสอบว่าการชำระเงินได้รับการประมวลผล จากนั้นเมื่อประมวลผลการชำระเงินแล้วจะมีการเรียกใช้อีกครั้งซึ่งจะช่วยให้คุณสร้างชื่อ บริษัท ได้

โดยทั่วไปแล้ววีโอไอพี 2 ดูเหมือนจะเคลื่อนห่างจากเหตุการณ์ต่าง ๆ ในความโปรดปรานของปลั๊กอิน ในขณะที่หลาย ๆ คนในชุมชนอาจไม่เห็นด้วยกับวิธีการดังกล่าว


ขอบคุณสำหรับคำตอบ @tjons ดูเหมือนว่ามีกิจกรรมไม่มากใน Magento 2 ฉันจะพยายามใช้ sales_order_state_change_before และแจ้งให้คุณทราบว่ามันจะไปอย่างไร
Eduardo

สวัสดี @tjons ฉันพยายามsales_order_state_change_beforeแทนcheckout_onepage_controller_success_actionแต่มันไม่ทำงาน ไม่แน่ใจว่าฉันต้องวางกิจกรรมนี้ที่ใดและจะมีการเปิดใช้งานในระหว่างการชำระเงินหรือไม่ เหตุetc/frontend/events.xmlใดฉันจึงมีเงื่อนงำทำไม
Eduardo

2

โปรดใช้เหตุการณ์sales_order_place_after

เหตุการณ์นี้เรียกเพียงครั้งเดียวและเมื่อการสั่งซื้อประสบความสำเร็จจากผู้ขายไฟล์/ magento / module-sales / Model / Order.phpในฟังก์ชั่นด้านล่าง

/**
     * 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;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.