Erstellen eines benutzerdefinierten Moduls zum Senden von Bestelldetails an die externe Lieferanten-API über XML oder JSON

7

Ich versuche, ein benutzerdefiniertes Modul für Magento zu schreiben, das bei Bestellung bestimmter Artikel und Zahlung auf der Website unseres Bekleidungslieferanten Details zum bestellten Artikel, zur Lieferadresse und zu anderen Daten im XML- oder JSON-Format enthält.

Während ich einige Jahre Webentwickler war, habe ich noch nicht viel mit dem Magento-System gearbeitet und mich gefragt, ob mich jemand in die richtige Richtung weisen könnte.

Ich glaube, ich habe einen Hook gefunden (sales_order_invoice_save_after), der den Trick machen könnte, aber nicht sicher ist, ob er der richtige ist oder wie man mit dem Zusammenstellen des Codes beginnt!

Danke im Voraus

MysticQuack
quelle
Ein Ereignis und ein Beobachter sind ein guter Anfang. Schließen Sie einen Beobachter an dieses Ereignis an. Der Beobachter ist im Grunde eine Methode, die beim Auslösen des Ereignisses aufgerufen wird. Innerhalb dieser Methode können Sie das Auftragsmodellobjekt abrufen und analysieren, um es an Ihre Drittanbieter-API senden zu können. Schauen Sie sich diese Antwort an, um das Bestellobjekt abzurufen und Ihre API aufzurufen. Seien Sie vorsichtig mit diesem Ereignis, da es jedes Mal ausgelöst wird, wenn sich etwas in der Rechnung ändert (siehe hier , hier )
Vic
Kostenlose Upvote, damit Sie 50 Wiederholungen erreichen und Kommentare abgeben können.
pspahn

Antworten:

4

Wir haben derzeit einen Beobachter, der unsere Bestelldaten an unsere Oracle-Datenbank sendet. Es beobachtet checkout_onepage_controller_success_actionund der Code formatiert die Bestellung in JSON und überträgt sie über einen Webdienst an unsere Oracle-Datenbank. Wir verwenden 1.0.4.1, daher bin ich mir nicht sicher, ob es mit Ihrer Version funktionieren würde. Wie auch immer, hier ist ein Skelett davon, ich habe das Fleisch herausgenommen ;-)

Dies wird ausgelöst, wenn die Seite mit dem Auftragserfolg angezeigt wird.

<?php

class NA_OrderTransmit_Model_Observer {

    public function SendOrder(Varien_Event_Observer $observer) {
        // This is the function called in the checkout_onepage_controller_success action
        // your order data is available by loading the order like this:
        $order = new Mage_Sales_Model_Order();
        $magento_order_id = Mage::getSingleton('checkout/session')->getLastRealOrderId();
        $order->loadByIncrementId($magento_order_id);
    }
}

Sie können dann Ihren JSON formatieren und cURL verwenden, um Ihre Bestelldaten genau wie wir zu senden.

Und hier ist die Konfigurationsdatei:

<config>
    <modules>
        <NA_OrderTransmit>
            <version>1.0</version>
        </NA_OrderTransmit>
    </modules>
    <global>
        <models>
            <ordertransmit>
                <class>NA_OrderTransmit_Model</class>
            </ordertransmit>
        </models>          
        <events>
          <checkout_onepage_controller_success_action>
                <observers>
                        <email_test>
                                <type>singleton</type>
                                <class>ordertransmit/observer</class>
                                <method>SendOrder</method>
                        </email_test>
                </observers>
          </checkout_onepage_controller_success_action>
        </events>
     </global>
</config>
MB34
quelle
Wäre die Bestellung nicht als Teil von verfügbar $observer?
Robbie Averill
Nicht, dass ich es wüsste, ich habe dieses Modul nicht geschrieben, es wurde vor 5 Jahren von einem Auftragnehmer erstellt. Er hat auch Tonnen von Kerncode modifiziert, also sage ich nicht, dass er perfekt war. Deshalb sind wir immer noch am 1.0.4.1
MB34
3

Die Veranstaltung hängt von dem Moment ab, an dem Sie die Bestellung an den Lieferanten senden möchten.

Wenn die Bestellung aufgegeben wird, ist sales_place_order_after das beste.
Wenn die Bestellung bezahlt ist, können Sie sales_order_payment_pay verwenden.

Die sales_order_payment_pay wird nach Zahlungseingang versandt und aktualisiert die Zahlungssummen. So können Sie den Zahlungsbetrag mit dem Gesamtbestellbetrag vergleichen. Ein wichtiger Punkt ist, dass der insgesamt bezahlte Bestellbetrag derzeit nicht aktualisiert wird, da die Bestellsummen nach diesem Ereignis aktualisiert werden. Sie können dies im folgenden Code von Mage_Sales_Model_Order_Invoice :: pay überprüfen

$this->getOrder()->getPayment()->pay($this); //dispatch in payment the event sales_order_payment_pay

//This updates the order total paid
$this->getOrder()->setTotalPaid(
    $this->getOrder()->getTotalPaid()+$this->getGrandTotal()
);
$this->getOrder()->setBaseTotalPaid(
    $this->getOrder()->getBaseTotalPaid()+$this->getBaseGrandTotal()
);
Mage::dispatchEvent('sales_order_invoice_pay', array($this->_eventObject=>$this));

Für eine optimale Leistung sollten Sie auch eine interne Warteschlange / Cron verwenden, um diese Daten asynchron an den Lieferanten zu senden. Wenn der externe Service nicht verfügbar ist, hat dies keine Auswirkungen auf Ihr Geschäft.

Rodrigo Mourao - Webjump
quelle
2

Das richtige Ereignis für diese Aufgabe ist sales_place_order_after. Sie können mit $observer->getEvent()->getOrder()IIRC auf die Bestellung zugreifen (ich bin auf mobilem Geldautomaten). Wenn Sie weitere Fragen haben, fragen Sie einfach :)

An den anderen aus der anderen Antwort (ich kann Ihren Namen momentan leider nicht sehen): Es gibt ein Tool auf Github, das Mageaudit heißt. Auf diese Weise können Sie die wichtigsten Änderungen identifizieren und diese beheben und Ihr System aktualisieren.

simonthesorcerer
quelle
1

Ich denke, es ist völlig falsch , dafür einen Beobachter zu verwenden, der ein Ereignis im Frontend beobachtet . Welches Ereignis Sie auch hören, es findet statt, während der Kunde auf seine Erfolgsseite oder etwas anderes wartet.

Dies bedeutet, dass Ihre Kunden, wenn Ihr Webdienst defekt ist oder nur schlechte Leistungen erbringt, möglicherweise mehr als 30 Sekunden warten und nach Ihrer Auszeit endlich den gewünschten Hut bekommen.

Die Alternative besteht darin, entweder das Zahlungsereignis abzuhören, das durch IPN oder ähnliches ausgelöst wird, oder:

Queue / Cron implementieren

Fügen Sie der Bestellung einfach ein neues Attribut hinzu, führen Sie alle paar Minuten einen Cron aus und übertragen Sie alles, was noch nicht als übertragen markiert ist.

Fabian Blechschmidt
quelle
machst du das so Mind Sharing?
MB34
Kein Projekt von Hand damit, sorry. Aber wenn Sie Deutsch sprechen, wird es irgendwo in diesem Buch beschrieben, wenn ich mich richtig erinnere amazon.de/Magento-Das-Handbuch-f%C3%BCr-Entwickler/dp/…
Fabian Blechschmidt