在magento中退款时如何更改订单状态?

在magento中退款时如何更改订单状态?,magento,paypal,magento-1.7,paypal-ipn,Magento,Paypal,Magento 1.7,Paypal Ipn,我正在研究Magento 1.7版本。我下了一个订单,用贝宝付款,然后离线退款。订单状态更改如下:- 待付款 已创建发票#100000001 处理(IPN“已完成”。关于捕获金额1英镑的注册通知。交易ID:“0CT123456789874521”。) 处理(已通知客户有关发票的信息#10000001) 已创建信用备忘录#100000001 处理(离线退款金额为1英镑。) 处理(IPN“已退款”。注:可退款的最高金额为0.00英镑) 处理(已退还测试订单。) 订单状态仍显示正在处理,但应已完成。在

我正在研究Magento 1.7版本。我下了一个订单,用贝宝付款,然后离线退款。订单状态更改如下:-

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

  • 订单状态仍显示正在处理,但应已完成。

    在Magento中,只有在为订单创建发票和装运后,订单才会标记为已完成。当您为订单创建信用备忘录时,它将被标记为已关闭

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

    也就是说,如果您真的想手动设置这些,您可以这样绕过它:

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

    您可以查看更多信息。

    查看处理退款的
    Mage\u Sales\u Model\u Order\u Payment::return()

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

    订单状态设置为“处理”后,将发送
    事件销售\订单\付款\退款
    。您可以编写一个侦听此事件的观察者。如果付款方式是PayPal,您可以按照Cristian Quiroz的回答更新订单状态。

    在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;
    }
    

    希望这能有所帮助。

    我一直在调查这个问题,似乎它实际上是一个舍入问题。创建信用备忘录后,订单状态应为关闭状态,但在我的情况下,一些退款订单仍保持其原始状态

    创建信用备忘录时,会调用两个函数
    Mage\u Sales\u Model\u Order::canCreditmemo()
    Mage\u Sales\u Model\u Order\u Invoice::CanReturn()
    。如果总金额和退款金额之间的差异小于0.0001,则两者都返回false

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

    我通过在local中重写两个Magento核心类解决了这个问题,并将以下行替换为:

    Mage\ U销售\型号\订单:

    if (abs($this->getStore()->roundPrice($this->getTotalPaid()) - $this->getTotalRefunded()) < .001) {
        return false;
    }
    
    if(abs($this->getStore()->roundPrice($this->getTotalPaid())-$this->getTotalRefunded())<.001){
    返回false;
    }
    
    图像\销售\型号\订单\发票:

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

    我希望这对其他人有帮助,因为我花了一些时间来追踪这个bug。

    谢谢你的回答,但我需要自动完成。它应该在创建信用备忘录后关闭,但它没有发生。当从payp返回时,它显示为:-IPN“已退款”。注意:可退款的最高金额为0.00英镑。在Magento CE中退款订单不会导致实际付款退款。您必须自行退款。信用备忘录只是用于跟踪退款并在报告中提供适当值的记录。您需要设置状态,以在退款完成后完成。是的,我知道REFmagento中的nd offline仅用于维护记录。但magento在信用备忘录生成的订单状态更改为closed时提供了这一功能。不幸的是,并非所有订单都会发生这种情况。如果这仅发生在某些订单上,则一定还有其他我们不知道的情况。请检查您的日志,了解其中一个或多个订单发生的时间ders遇到了这个问题;而且,可能是第三方模块挡住了你的去路?尝试逐个禁用你的扩展。这种情况只发生在少数订单上。不知道为什么。所有订单中都没有常见问题。在1000个订单中,它发生在20个订单中。退款后订单状态应关闭,但不会发生。事件仅针对20个订单发送creditmemos?日志中没有任何内容?可能是“锁定等待超时”?默认情况下应该是这样。Magento提供了当信用备忘录生成的订单状态更改为“已关闭”时的功能。除了100张信用备忘录中的20张订单外,所有订单都会出现这种情况。有些订单使用paypal下单,有些订单使用sagepay下单。请显示订单注释历史记录。已关闭订单和未关闭订单是否相同?始终是完整的订单退款金额?我的问题有订单评论历史记录。这是全额退款谢谢,但默认情况下应该这样做,因为magento会这样做。除了一些订单之外,这也适用于其他订单。是否可以创建“退款”状态并使用它来代替“已关闭”?在巴西,我们使用“已关闭”来表示“已发货”,显然是我们的语言。因此,我希望有一个“退款”状态,以便向客户说明他的订单发生了什么。有什么帮助吗?我需要将值增加到0.005,因为总金额和退款金额之间的差异大于0.001。