首页 > 代码库 > 解决magento 订单0元的情况

解决magento 订单0元的情况

magento 有着强大的促销规则,再加上自己开发或者安装 积分插件等功能,总会出现用户结账后订单为 0元的情况,这个时候

第三方支付平台往往是不支持这个价格的。

(测试了 支付宝 和快钱 是这样的)


这个时候怎么解决?对于magento 当然有现成解决办法

(可是我是自己开发完才注意到的。。。。所以我的解决方法就放后面吧,可以当作进一步理解magento用的 技术分享,其实对于有些用户就选择支付宝等支付方式的话,还是需要做我这种类似的开发的)

1.

在magento 后台 System -> Configuration -> Payment Methods  中有个支付方式是

Zero Subtotal Checkout (中文翻译的应该是 “无小计结账”)


技术分享


启用这个支付方式,当订单为 0元的时候就会显示这个 支付方式 。

我这里设置 New Order Status 为 Processing 就表明用户订单为 0元的时候选择这个支付方式。

这会直接将订单状态置为 processing。 如果你选择了 new oreder status 是 processing 会同时出现选项

Automatically Invoice All Items 选择no 表明 不同时创建发票 。


2.

我的解决办法是在确认订单,跳转链接的时候判断 订单金额 是0元的直接 跳转到success 页面并且 做订单状态 创建发票和发邮件等操作。

例如支付宝

在支付宝插件的model中有 方法getOrderPlaceRedirectUrl() 这个决定了确认订单后跳转的链接。

 public function getOrderPlaceRedirectUrl()
    {
        return Mage::getUrl('alipay/payment/redirect');
    }

我是在 controller 的 redirectAction() 中做相应操作的

在合适位置加入如下代码:

$order = $this->getOrder();

        $orderGrandTotal = (int)$order->getGrandTotal();
        if($orderGrandTotal == 0){

            if($order->getStatus() == "pending"){
                $order->addStatusToHistory(
                    'processing',
                    Mage::helper('customer')->__('总计为 0 元的订单直接置为processing'));
            }
            try{
                $order->sendNewOrderEmail();
                if($this->saveInvoice($order)){
                    $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true);
                }
                $order->save();
            } catch(Exception $e){

            }
            $this->_redirectUrl(Mage::getUrl('checkout/onepage/success'));
            return;
        }

你可以将 第三方支付插件的redirectAction 中都加入这个判断来解决问题。

这时当用户选择 支付宝支付 但是 订单又是0元的时候 并不会跳转到支付宝也就不会提示价格参数 不合法。

当然 你也可以采用 订单价格为0元的时候

只显示 无小计结账的支付方式。

根据订单价格屏蔽其它支付方式 可以在

template/checkout/onepage/payment/methods.phtml 中修改。(这里的修改,用户是可以修改 post数据来更改的)











解决magento 订单0元的情况