【问题标题】:How to mark an order failed programmatically - Magento如何以编程方式标记订单失败 - Magento
【发布时间】:2012-05-24 18:16:29
【问题描述】:

我只想知道一个属性是什么,当设置它时会将订单标记为失败,以便调用app/code/core/Mage/Checkout/controller/OnepageController.php 中的failureAction()

我有一个 Observer.php,在其中我正在为成功付款和失败的付款保存订单创建发票,状态为 pending_payment,并希望将它们重定向到购物车页面,并在顶部显示错误消息。

这一切都很好。只是对于不成功/失败的付款,以及使用pending_payment状态保存订单n将它们重定向到带有错误消息的购物车页面,我还想保留/保存购物车以防变空。

但运气不好

Observer.php

 public function implementOrderStatus($event)
 {
    $order = $event->getEvent()->getOrder(); 
    if ($this->_getPaymentMethod($order) == 'mypaymentmodule') 
    {
                $quote = Mage::getModel('sales/quote')->load($order->getQuoteId());
        if($order->getPayment()->getCcTransId() == NULL)
        {
            $order->cancel();
            $order->setStatus('canceled');
            $order->save();
            $quote->setIsActive(1)->save();
            /*$state = 'pending_payment';
            $status = 'pending_payment';
            $comment = 'Payment transaction failed due to incorrect AVS/CVD details.';
            $isNotified = false;
            $order->setState($state,$status,$comment,$isNotified)->save();
            $order->setCanSendNewEmailFlag(false);*/

            Mage::getSingleton('checkout/session')->addError('Sorry, either of your card information (billing address or card validation digits) dint match. Please try again');                 

            Mage::app()->getFrontController()->getResponse()->setRedirect('checkout/cart/')->sendResponse();
        }
       else
       {
           if ($order->canInvoice())

            $this->_processOrderStatus($order);
       }
    }
    return $this;
}

$quote->setIsActive(true)->save() 似乎没有奏效。任何有关如何在将订单保存为“已取消”状态后避免我的购物车变空的帮助。

【问题讨论】:

    标签: php magento


    【解决方案1】:

    您也许应该看看./app/code/core/Mage/Sales/Model/Order.php。在那里你会发现一个订单的几个常量,它们可以用来设置订单的状态,如下所示:

    <?php
    // [...] all your code within your custom action or script
    
    //load your order by order_id (or by increment_id, if you like to, here, it's your order id
    $order = Mage::getModel('sales/order')->load($your_order_id);
    $order->setState(Mage_Sales_Model_Order::STATE_CANCELED); //or whatever distinct order status you'd like
    $order->save();
    

    控制器操作中的failureAction 没有任何作用,如果您想手动调用它,可以使用Mage::getUrl() 构建它的url

    【讨论】:

    • 感谢您的回复。我已经尝试过您建议的代码,但这并没有将我带到失败页面。我真正想做的是保存购物车,即$quote-&gt;setIsActive(true)-&gt;save(),以防止购物车因订单失败/取消而变空,这样客户就不必再经历添加物品的麻烦。有什么想法吗?
    • 观察者听哪个事件?您可以通过发送一个将位置更改回购物车的标题来通过它的异常。
    • 它的sales_order_place_after 事件。如果我抛出异常,我将无法使用pending_paymentstatus 保存订单。我可以吗?我需要这样,以便店主可以在后端看到每笔失败的付款交易。
    • sales_order_place_after 事件发出订单模型,因此您应该能够在抛出错误之前修改它,中止流程 - 如果这不起作用,您可以 orderwrite Mage_Sales_Model_Order::_placePayment 包含您的自己的支票
    • 我通过将参数 true 添加到此语句 $order->setState(Mage_Sales_Model_Order::STATE_CANCELED,true); //或您想要的任何不同的订单状态
    猜你喜欢
    • 2012-02-12
    • 2016-08-11
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多