【问题标题】:How to change order status when refund in magento?在magento退款时如何更改订单状态?
【发布时间】:2014-06-16 12:54:47
【问题描述】:

我正在开发 Magento 1.7 版本。我下了订单并使用 Paypal 付款并离线退款。订单状态更改如下:-

  1. 待付款
  2. 已创建发票 #100000001
  3. 处理中(IPN“已完成”。已注册通知关于捕获金额为 1 英镑。交易 ID:“0CT123456789874521”。)
  4. 处理中(通知客户有关发票 #100000001。)
  5. 已创建信用备忘录 #100000001
  6. 处理中(离线退款 1 英镑。)
  7. 处理中(IPN“已退款”。注意:可退款的最高金额为 0.00 英镑)
  8. 处理中(测试订单已退款。)

订单状态仍显示处理中,但应该已完成。

【问题讨论】:

    标签: magento paypal magento-1.7 paypal-ipn


    【解决方案1】:

    在 Magento 中,只有在您为其创建发票和发货后,订单才会被标记为完成。当您为订单创建贷项通知单时,它会被标记为已关闭。

    如果您尝试使用setStatus 方法直接将订单设置为完成或关闭,您将收到异常:订单状态“完成”不得手动设置。同样,这些状态应该由 Magento 自动设置。

    话虽如此,如果你真的想手动设置这些,你可以像这样绕过它:

    $order->setData('state', 'complete');
    $order->setStatus('complete');
    $history = $order->addStatusHistoryComment('Manually set order to Complete.', false);
    $history->setIsCustomerNotified(false);
    $order->save();
    

    您可以查看this stackoverflow thread 了解更多信息。

    【讨论】:

    • 感谢您的回答,但我需要自动完成。它应该在创建贷项通知单后关闭,但没有发生。当从 payp [al 返回时,它显示如下:- IPN“已退款”。注意:可退款的最高金额为 0.00 英镑
    • 在 Magento CE 中退款订单不会导致实际付款退款。您必须自行退还款项。贷项通知单只是用于跟踪退款并在报告中提供适当值的记录。退款完成后,您需要将状态设置为完成。
    • 是的,我知道在 magento 中脱机退款仅用于维护记录。但 magento 提供了这一点,即当贷项通知单生成的订单状态更改为已关闭。不幸的是,并非所有订单都会出现这种情况。
    • 如果这种情况仅发生在 一些 订单中,那么肯定还有其他我们不知道的情况。请检查您的日志,了解这些订单之一发生的时间问题;另外,也许第三方模块妨碍了?尝试一一禁用您的扩展程序。
    【解决方案2】:

    我一直在调查这个问题,似乎它实际上是一个四舍五入的问题。创建贷项通知单后,订单状态应该关闭,但在我的情况下,一些已退款的订单也保持其原始状态。

    创建贷项通知单时,会调用两个函数 Mage_Sales_Model_Order::canCreditmemo()Mage_Sales_Model_Order_Invoice::canRefund()。如果总计和退款金额之间的差额小于 0.0001,则它们都返回 false。

    在我的测试中,无论使用何种付款方式,某些退款订单都不是这种情况。在这两个函数中将值增加到 0.001 会导致已关闭订单状态。这也解释了为什么只有一些订单保持状态,而一些订单根据价格和税额正确关闭。

    我通过在本地覆盖两个 Magento 核心类解决了这个问题,并将以下几行替换为:

    Mage_Sales_Model_Order:

    if (abs($this->getStore()->roundPrice($this->getTotalPaid()) - $this->getTotalRefunded()) < .001) {
        return false;
    }
    

    Mage_Sales_Model_Order_Invoice:

    if (abs($this->getBaseGrandTotal() - $this->getBaseTotalRefunded()) < .001) {
        return false;
    }
    

    我希望这对其他人有所帮助,因为我花了一些时间来追查那个错误。

    【讨论】:

    • 我需要将值增加到 0.005,因为总金额和退款金额之间的差值大于 0.001 的订单。
    【解决方案3】:

    查看处理退款的Mage_Sales_Model_Order_Payment::refund()

        $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, $message);
        Mage::dispatchEvent('sales_order_payment_refund', array('payment' => $this, 'creditmemo' => $creditmemo));
    

    在订单状态设置为处理后,event sales_order_payment_refund 被调度。您可以编写一个侦听此事件的观察者。如果付款方式是 PayPal,您可以按照 Cristian Quiroz 的回答中所述更新订单状态。

    【讨论】:

    • 只有少数订单会发生这种情况。不知道为什么。没有共同的问题。在 1000 个订单中,它发生在 20 个订单中。退款后订单状态应该被关闭,但这不会发生.
    • 在 1000 个 creditmemos 中只为 20 个发送事件?日志里什么都没有?也许是“锁定等待超时”?
    • 应该是默认的。 Magento 提供的功能是,当贷项通知单生成的订单状态更改为已关闭。所有订单都会发生这种情况,但 100 个贷项通知单中的 20 个订单除外。有些是使用 paypal 下达的,有些是使用 sagepay 下达的。
    • 请显示订单评论历史。已关闭和未关闭的订单是否相同?是否总是全额退款?
    • 我的问题有评论历史。这是全额退款
    【解决方案4】:

    在 app\code\core\Mage\Payment\Model\Method\Abstract.php

    您可以将订单状态设置为完成

    public function processBeforeRefund($invoice, $payment)
    {
        // Add your code to set order as complete
    
        $payment->setRefundTransactionId($invoice->getTransactionId());
        return $this;
    }
    

    希望这会有所帮助..

    【讨论】:

    • 谢谢,但应该这样做默认情况下,magento 会这样做。除某些订单外,这适用于其他订单
    • 是否可以创建状态“已退款”并使用它而不是“关闭”?在巴西,很明显,在我们的语言中,我们使用“Closed”表示“Shipped”。因此,我希望有一个“已退款”状态,以便向客户说明他的订单发生了什么。有什么帮助吗?
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2012-05-21
    • 1970-01-01
    • 2013-04-30
    • 2011-06-04
    相关资源
    最近更新 更多