Tạo mô-đun tùy chỉnh để gửi chi tiết đơn hàng đến API nhà cung cấp bên ngoài thông qua XML hoặc JSON


7

Tôi đang cố gắng viết một mô-đun tùy chỉnh cho Magento rằng khi một số mặt hàng được đặt hàng và thanh toán đã được thực hiện, hãy đăng lên trang web của nhà cung cấp quần áo của chúng tôi với các chi tiết về mặt hàng được đặt hàng, địa chỉ giao hàng và dữ liệu khác ở định dạng XML hoặc JSON.

Trong khi tôi đã là một nhà phát triển web trong một vài năm, tôi đã không làm việc với hệ thống Magento trước đây và tự hỏi liệu có ai có thể chỉ cho tôi đi đúng hướng không?

Tôi nghĩ rằng tôi đã tìm thấy một hook (sales_order_invoice_save_after) có thể thực hiện thủ thuật nhưng không chắc chắn đó là một cái đúng hay làm thế nào để bắt đầu đặt mã cùng nhau!

Cảm ơn trước


Một sự kiện và một người quan sát là một khởi đầu tốt. Kết nối một người quan sát sự kiện đó. Người quan sát về cơ bản là một phương thức được gọi khi gửi sự kiện. Trong phương thức này, bạn có thể truy xuất đối tượng mô hình thứ tự và phân tích nó để có thể gửi nó đến API bên thứ ba của bạn. Hãy xem câu trả lời này để lấy đối tượng đặt hàng và gọi API của bạn. Hãy cẩn thận với sự kiện này, vì nó kích hoạt mỗi khi có gì đó trong hóa đơn thay đổi (xem tại đây , tại đây )
Vic

Upvote miễn phí để giúp bạn có tới 50 đại diện để bạn có thể bình luận.
pspahn

Câu trả lời:


4

Chúng tôi hiện có một người quan sát gửi dữ liệu đặt hàng của chúng tôi đến Oracle DB của chúng tôi. Nó quan sát checkout_onepage_controller_success_actionvà mã định dạng thứ tự thành JSON và truyền nó thông qua một dịch vụ web tới Oracle DB của chúng tôi. Chúng tôi đang sử dụng 1.0.4.1 vì vậy tôi không chắc liệu nó có hoạt động với phiên bản của bạn không. Dù sao, đây là bộ xương của nó, tôi lấy thịt ra ;-)

Điều này kích hoạt khi trang thành công đặt hàng hiển thị.

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

Sau đó, bạn có thể định dạng JSON của mình và sử dụng cURL để gửi dữ liệu đơn hàng của bạn giống như chúng tôi.

Và đây là tập tin cấu hình:

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

Đơn đặt hàng sẽ không có sẵn như là một phần của $observer?
Robbie Averill

Không phải tôi biết, tôi đã không viết mô-đun này, nó đã được thực hiện bởi một nhà thầu 5 năm trước. Anh ấy cũng sửa đổi hàng tấn mã lõi để tôi không nói anh ấy hoàn hảo. Đó là lý do tại sao chúng tôi vẫn vào ngày 1.0.4.1
MB34

3

Sự kiện này sẽ phụ thuộc vào thời điểm mà bạn muốn gửi đơn đặt hàng đến nhà cung cấp.

Nếu là khi đơn hàng được đặt tốt nhất là sales_place_order_after.
Nếu là khi đơn hàng được thanh toán, bạn có thể sử dụng sales_order_payment_pay.

Sales_order_payment_pay được gửi sau khi mỗi hóa đơn được thanh toán và cập nhật tổng số thanh toán. Vì vậy, bạn có thể kiểm tra số tiền thanh toán so với tổng số tiền đặt hàng. Một điểm cần chú ý là tổng số tiền đặt hàng không được cập nhật tại thời điểm này vì tổng số đơn hàng được cập nhật sau sự kiện này. Bạn có thể xác minh điều này trong mã sau của 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));

Để có hiệu suất tốt nhất, bạn cũng nên sử dụng một số hàng đợi / cron nội bộ để gửi dữ liệu này không đồng bộ đến nhà cung cấp. Vì vậy, nếu dịch vụ bên ngoài ngừng hoạt động, bạn sẽ không ảnh hưởng đến cửa hàng của mình.


2

Sự kiện chính xác cho nhiệm vụ này là sales_place_order_after. Bạn có thể truy cập đơn đặt hàng với $observer->getEvent()->getOrder()IIRC (Tôi đang sử dụng máy di động). Nếu bạn có thêm câu hỏi, chỉ cần hỏi :)

Đối với người khác từ câu trả lời khác (không thể thấy tên của bạn ngay bây giờ, xin lỗi): có một công cụ trên github được gọi là mageaudit. Điều này sẽ giúp bạn xác định các sửa đổi cốt lõi và cho phép bạn sửa chúng & cập nhật hệ thống của bạn;)


1

Tôi nghĩ rằng việc sử dụng bất kỳ người quan sát nào cho việc quan sát một sự kiện ở frontend là sai lầm nghiêm trọng . Bất cứ sự kiện nào bạn cũng đang lắng nghe, diễn ra, trong khi khách hàng đang chờ trang thành công của anh ấy hoặc bất cứ điều gì khác.

Điều này có nghĩa là, khi dịch vụ web của bạn bị hỏng hoặc hoạt động kém, khách hàng của bạn có thể đợi hơn 30 giây và sau khi hết thời gian, cuối cùng họ cũng nhận được chiếc mũ mà họ muốn.

Cách khác là lắng nghe sự kiện thanh toán, được kích hoạt bởi IPN hoặc một cái gì đó tương tự hoặc:

thực hiện hàng đợi / cron

Chỉ cần thêm một thuộc tính mới vào đơn hàng, chạy một cron cứ sau vài phút và chuyển mọi thứ chưa được đánh dấu là đã chuyển.


đây có phải là cách bạn làm không? Chia sẻ tâm trí?
MB34

Không có dự án bằng tay với điều này, xin lỗi. Nhưng nếu bạn nói tiếng Đức, nó được mô tả ở đâu đó trong cuốn sách này, nếu tôi nhớ chính xác amazon.de/Magento-Das-Handbuch-f%C3%BCr-Entwickler/dp/ trộm
Fabian Blechschmidt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.