Quale osservatore utilizzare dopo l'ordine di successo su Magento 2?


11

Sto lavorando su questa estensione Magento 2 e parte delle funzionalità consiste nel trasferire informazioni sugli ordini a un'applicazione esterna utilizzando i servizi Web. Devo inviare queste informazioni dopo che un ordine è stato effettuato alla cassa.

Al momento sto utilizzando l'evento checkout_onepage_controller_success_actionche attiva il metodo per creare gli ordini nell'app esterna. Ho inserito questo evento in /etc/frontend/events.xml.

Finora funziona, ma ho riscontrato un problema con lo stato degli ordini. A volte gli ordini sono ancora in pendingstato e altre volte gli ordini sono in processing. Il motivo è dovuto al fatto che il metodo di pagamento ha inizialmente inizializzato gli ordini come in sospeso e dopo l'approvazione del pagamento, gli ordini sono passati all'elaborazione. Voglio spingere solo processingordini. Sembra che a volte l'evento si checkout_onepage_controller_success_actionverifichi prima che il pagamento sia autorizzato e questo sta causando i problemi.

Qualche idea su come risolverlo? come posso assicurarmi che l'elaborazione del pagamento venga eseguita prima di eseguire il mio codice checkout_onepage_controller_success_action?

Seguendo il mio codice:

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

Risposte:


7

Puoi provare l'evento

checkout_submit_all_after

Viene eseguito dopo che l'ordine è stato inviato correttamente (e nel back-end anche quando è stato creato un ordine)

Ad esempio, in 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>

E nell'osservatore

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

    // Do whatever you want here

    return $this;
}

Questo non funziona per me. L'evento non è stato generato. Ho provato con "checkout_submit_all_after" e anche con "sales_order_place_after" ma l'unico evento che sono in grado di catturare con un osservatore è checkout_onepage_controller_success_action. Eventuali suggerimenti?
Daniel Silva,

@DanielSilva Ho avuto lo stesso problema con gli eventi che non si attivavano, ma poi ha funzionato quando si è passati dal frontend al globale. Cioè, spostato da etc/frontend/events.xmla etc/events.xml. Questo non dovrebbe accadere ma lo fa anche se il contenuto è identico.
clockworkgeek,

Secondo questo vecchio problema, Magento non è in grado di acquisire eventi sales_order_ * , la soluzione è cambiare la cartella "frontend" in "webapi_rest".
clockworkgeek,

2

Puoi usare l' sales_order_state_change_beforeevento. Fornisce accesso all'ordine e ti consentirà di verificare se il pagamento è stato elaborato. Quindi, quando il pagamento viene elaborato, verrà nuovamente attivato, il che ti consentirà di creare il nome dell'azienda.

In generale, Magento 2 sembra allontanarsi dagli eventi a favore dei plugin. Mentre molti nella comunità potrebbero non essere d'accordo con questo approccio, è sicuramente qualcosa da tenere a mente qui.


Grazie per la risposta @tjons. Sembra che non ci siano molti eventi rimasti in Magento 2. Cercherò di utilizzare sales_order_state_change_before e di farti sapere come va.
Eduardo

Ehi @tjons, ci ho provato sales_order_state_change_beforeinvece checkout_onepage_controller_success_actionma non funzionava. Non sono sicuro di dove devo collocare questo evento e se verrà attivato durante il checkout. Ho il mio evento in etc/frontend/events.xmlqualche idea perché?
Eduardo,

2

Si prega di utilizzare l' evento sales_order_place_after .

Questo evento viene chiamato solo una volta e quando l'ordine viene inserito correttamente dal fornitore del file / magento / module-sales / Model / Order.php nella funzione seguente.

/**
     * 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;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.