1

我创建了一种自定义支付方式,其中的订单网格在安装此支付扩展程序后,有另一列显示来自支付网关的订单状态。

要求是网格中的订单在处于某些特定支付网关状态(例如已交付、正在处理等)时不应被取消。当支付网关状态为待处理时,它应该被取消

我需要对支付网关进行 api 调用,要求取消订单。如果订单处于待处理状态,则订单将被取消。如果订单未挂起,API 会抛出带有错误代码和错误消息的响应,表示订单无法取消。

有一个 PHP-Library 可以处理所有的 API 调用。当我在上述情况下调用cancelOrder API服务时,如果无法取消订单,PHP库会使用API​​的错误代码作为异常代码并将错误消息作为异常消息来引发异常。

为此,我实现了一个处理 Order_save_before 事件的观察者。在观察者中,我编写了使用 PHP 库的 cancelOrder() 方法(内部进行 cancelOrder api 调用)的代码,当支付网关的状态处于挂起状态时,订单将被取消,如果无法取消,则会引发异常。

如果我打开由我的付款方式创建的单个订单并通过单击取消按钮取消订单,则异常会级联并显示在顶部,给出无法取消订单的异常消息。

但是当我尝试通过选择订单从订单网格中取消订单时,从下拉菜单中选择取消并点击提交,页面被重定向到异常页面,说发生了异常。在这种情况下,我不明白如何撤消或防止取消订单并处理异常。我的代码如下所示。

public function cancelOrderObserver(Varien_Event_Observer $Observer)
{
try
   {
        //code that cancels order if it is pending else throws exception saying cannot cancel order;
   }
catch (Exception $e){
    Mage::throwException(Mage::helper('adminhtml')->__($e->getMessage()));
}

请帮助我。

如果您需要有关此问题的更多解释,请告诉我。

4

2 回答 2

1
order_cancel_after 

不适合您的需求,因为在此阶段订单已被取消。

我会尝试类似的东西

order_save_before

在那里你应该检查订单是否被取消。并取消它以防万一。

更新 1

好吧,我“取消”的主要观点是回滚在 ->cancel() 调用期间采取的操作。

目前我想到了其他选择。您可以尝试观察 predispatch 呼叫(如果 massCancel 操作存在以下事件)并与您的服务检查是否可以取消订单。如果没有,则从请求中删除订单。像这样的东西。但我不确定这一点。

于 2012-05-02T13:02:03.873 回答
0

sales_order_save_before 事件:

$_order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);

于 2013-12-16T17:42:04.843 回答