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 = (float)$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数据来更改的)
此文章通过 python 爬虫创建,原文是自己的csdn 地址: 解决magento 订单0元的情况