根据前面几节介绍的微信支付分析这里大致介绍一下magento中微信支付功能的编写思路,用户可以选择微信支付(JsApi)也可以选择微信扫码支付(Native).
首先在magento 的app/code/local 下创建模块 并在 module设置active 为true
大致目录结构如图
编写 etc/system.xml 为后台配置模块
可以将微信支付所需要的 appid appsecret mchid 和 key等信息配置到这里。这样在后台启用这个模块就会在前台支付过程中显示这个支付方式了。
当我们点击确认支付的时候 其实是调用了相关支付方式Model中的
getOrderPlaceRedirectUrl() 函数。我们可以在这个函数中设定下一步要走的流程。
例如:
public function getOrderPlaceRedirectUrl()
{
return Mage::getUrl(‘wxpay/wxselect‘);
}
即调用 WxselectController.php 中的indexAction()方法,一般其它支付是直接跳转到相应的PaymentController.php 中的redirectAction() 方法,这里这么做的目的是展示给用户一个选择支付方式的页面。因为如果用户在PC端打开或者在移动浏览器中打开是不能使用微信JsApi支付的,(即使在微信中还可能存在跨号支付的问题)所以同时展示出来微信扫码支付的支付方式,当然你可以在代码上通过判断智能的实现支付方式的选择。
在选择页面用户选择了支付方式后,跳转到 PaymentController.php中的indexAction() 方法中。
核心代码如下:
$order = $this->getOrder();
if (!$order->getId())
{
$this->norouteAction();
return;
}
$order->addStatusToHistory(
$order->getStatus(),
Mage::helper(‘customer‘)->__(‘微信支付‘)
);
$order->save();
$this->getResponse()
->setBody($this->getLayout()
->createBlock(‘wxpay/redirect‘)
->setOrder($order)
->toHtml());
程序实例化 Block 展示微信支付页面。在Block 中获取order
$order = $this->getOrder();
JsApi 所需要的参数 通过Model 获取
$jsApiParameters = $model->createPackageInfo($order,$currentUrl);
如果是Native 方式则代码为:
$urlParam = $model->createPackageInfoNative($order);
因为微信支付需要设定支付发起的目录(具体可参见前面的微信支付相关文章)并且只有在这个目录下支付才能生效。
而magento(很多mvc 框架都是)是通过router形式运行的。我大致测试了一下设定支付目录就是 controller下的一个方法,支付没有成功,也可能我编写的有不对的地方,总之没有继续深究,而是干脆把支付放到了magento 根目录下的自定义目录下,例如是wxp目录。
这时候要做的操作就是微信支付所需要的参数 以get形式传递给相应的支付发起文件就可以了。(get形式就可以了,看了应该下没有什么需要保密的内容,有建议欢迎指出。)
例如 jsapi方式那么直接创建文件 jsapi.php
部分代码:
<?php
$jsApiParameters=$_GET[‘jsApiParameters‘]
?>
然后将参数传给 js 就可以了
同理 native.php
最后就是 编写 notify 函数,我设定的notify都是通知给 PaymentController.php中的notifyAction()方法
部分代码:
$notify = new PayNotifyCallBack();
$resCheck = $notify->Handle(false);
if($resCheck){
// 验证签名等成功
$xmlBackData = $GLOBALS[‘HTTP_RAW_POST_DATA‘];
$array_data = json_decode(json_encode(simplexml_load_string($xmlBackData, ‘SimpleXMLElement‘, LIBXML_NOCDATA)), true);
$out_trade_no = $array_data[‘out_trade_no‘];
$model = Mage::getModel(‘wxpay/payment‘);
$order = Mage::getModel(‘sales/order‘)->loadByIncrementId($out_trade_no);
// 获取到了order 那么此时就可以对这个order 做状态更改了
大致思路就是这样,这是第一次使用CSDN 的MarkDown 编辑器编写的使用起来还不错 ╭(′▽`)╯
原文地址:http://blog.csdn.net/m0sh1/article/details/45449679