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

이 오래된 문제에 따르면 Magento는 sales_order_ * 이벤트를 캡처 할 수 없습니다 . 해결책은 "frontend"폴더를 "webapi_rest"로 변경하는 것입니다.
clockworkgeek

2

sales_order_state_change_before이벤트 를 사용할 수 있습니다 . 주문에 대한 액세스를 제공하며 지불이 처리되었는지 확인할 수 있습니다. 그런 다음 결제가 처리되면 결제가 다시 시작되어 회사 이름을 만들 수 있습니다.

일반적으로 Magento 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 이벤트를 사용하십시오 .

이 이벤트는 한 번만 호출 하면 아래 함수의 vendor / 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.