XMLまたはJSONを介して注文詳細を外部サプライヤーAPIに送信するカスタムモジュールの作成


7

Magentoのカスタムモジュールを作成しようとしています。特定のアイテムが注文されて支払いが行われたときに、注文されたアイテムの詳細、配送先住所、およびその他のデータをXMLまたはJSON形式で衣料品サプライヤーのサイトに投稿します。

私は数年前からWeb開発者でしたが、以前Magentoシステムを使用したことがなく、誰かが私を正しい方向に向けることができるかどうか疑問に思っていましたか?

私はトリックを行うことができるフック(sales_order_invoice_save_after)を見つけたと思いますが、それが正しいものであるか、コードをまとめ始める方法かどうかはわかりません!

前もって感謝します


イベントとオブザーバーは良いスタートです。そのイベントにオブザーバーを接続します。オブザーバーは基本的に、イベントのディスパッチ時に呼び出されるメソッドです。このメソッド内で、注文モデルオブジェクトを取得して解析し、サードパーティのAPIに送信できます。この回答を見て注文オブジェクトを取得し、APIを呼び出します。このイベントは、請求書に何か変更があるたびにトリガーされるため、注意してください(ここここを参照
Vic

コメントできるように50の担当者に到達するのに役立つ無料の賛成投票。
pspahn 2015年

回答:


4

現在、注文データをOracle DBに送信するオブザーバーがあります。観察checkout_onepage_controller_success_actionし、コードは注文をJSONにフォーマットし、Webサービスを介してOracle DBに送信します。1.0.4.1を使用しているため、お使いのバージョンで動作するかどうかはわかりません。とにかく、ここにその骨組みがあります。肉を取り出しました;-)

これは、注文成功ページが表示されたときに発生します。

<?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);
    }
}

次に、JSONをフォーマットし、cURLを使用して注文データを送信することができます。

そしてここに設定ファイルがあります:

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

注文はの一部として利用できません$observerか?
ロビーアベリル2015

私が知っていることではありません、私はこのモジュールを書きませんでした、それは5年前に請負業者によって行われました。彼はまた、大量のコアコードを修正したので、彼が完璧だったとは言っていません。そのため、私たちはまだ1.0.4.1にいます
MB34

3

イベントは、サプライヤーに注文を送信するタイミングによって異なります。

注文が出されたときが最高の場合は、sales_place_order_afterです。
注文が支払われた場合は、sales_order_payment_payを使用できます。

sales_order_payment_payは、各請求書の支払い後に発送され、支払いの合計を更新します。したがって、合計注文金額に対して支払いのamount_paidを確認できます。このイベントの後に注文の合計が更新されるため、注文の合計支払額は現時点では更新されないことに注意してください。これは、Mage_Sales_Model_Order_Invoice :: payの次のコードで確認できます。

$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));

最高のパフォーマンスを得るには、内部キュー/ cronを使用して、このデータをサプライヤーに非同期で送信する必要もあります。したがって、外部サービスが停止しても、ストアには影響しません。


2

このタスクの正しいイベントはsales_place_order_afterです。$observer->getEvent()->getOrder()IIRCで注文にアクセスできます(私はモバイルATMを使用しています)。さらに質問がある場合は、質問してください:)

他の答えから他の人に(今あなたの名前を見ることができない、申し訳ありません):githubにはmageauditと呼ばれるツールがあります。これは、コアの変更を特定し、修正してシステムを更新するのに役立ちます;)


1

フロントエンドのイベントを監視するオブザーバーを使用することは、ひどく間違っていると思います。あなたが聞いているどんなイベントでも、顧客が彼の成功ページや他のものを待っている間に起こります。

これは、Webサービスが壊れているか、単にパフォーマンスが悪い場合、顧客は30秒以上待機し、タイムアウト後、最終的に彼らが望んでいることを意味します。

代わりの方法は、IPNまたは同様のものによってトリガーされる支払いイベントをリッスンすることです。

キュー/ cronを実装する

注文に新しい属性を追加し、数分ごとにcronを実行して、まだ転送済みとしてマークされていないものをすべて転送します。


これはあなたのやり方ですか?心の共有?
MB34

これで手作業によるプロジェクトはありません。申し訳ありません。しかし、ドイツ語を話す場合、この本のどこかで説明されています。私が正しく覚えている場合、amazon.de / Magento
Fabian Blechschmidt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.