公众号支付是指在微信app中访问的页面通过js直接调起微信支付;
一:设置域名
登录微信公众平台;
微信支付中设置支付授权目录;把域名改为自己的;
注意最后是有一个斜线的/
支付授权目录是 控制器的, ,精准到 weixinpay控制器
设置授权域名;
二:导入sdk
/ThinkPHP/Library/Vendor/Weixinpay
好吧;还是没忍住要吐槽;鹅厂的sdk那酸爽谁用谁知道;项目中的sdk是我根据官方文档重构精简打造而成的;
需要注意的是170行处的商品数据需要根据业务实际情况从数据库中获取;
根据订单号, 查出必要的数据,放入,
必须是查出来的,不能直接编辑
z$out_trade_no 这个是传过来的单号,根据单号去查自己的订单表,查出 下面所需要的数据
```
'10$openid=$result['openid'];
//订单数据请根据订单号out_trade_no从数据库中查出实际的body、total_fee、out_trade_no、product_id
$order=array(
'body'=>'test',//商品描述(需要根据自己的业务修改)
'total_fee'=>1,//订单金额以(分)为单位(需要根据自己的业务修改)
'out_trade_no'=>$out_trade_no,//订单号(需要根据自己的业务修改)
'product_id'=>'1',//商品id(需要根据自己的业务修改)
'trade_type'=>'JSAPI',// JSAPI公众号支付
'openid'=>$openid//获取到的openid
);'
```
三:配置项
/Application/Common/Conf/config.php
```
7'WEIXINPAY_CONFIG'=>array(
'APPID'=>'',//微信支付APPID
'MCHID'=>'',//微信支付MCHID商户收款账号
'KEY'=>'',//微信支付KEY
'APPSECRET'=>'',//公众帐号secert (公众号支付专用)
'NOTIFY_URL'=>'http://baijunyao.com/Api/Weixinpay/notify', //接收支付状态的连接
),
```
在微信公众平台和微信支付平台凑齐上面这些参数;
四:支付方法
/Application/Api/Controller/WeixinpayController.class.php
```
*公众号支付必须以get形式传递out_trade_no参数
*示例请看/Application/Home/Controller/IndexController.class.php
*中的wexinpay_js方法
*/
publicfunctionpay(){
//导入微信支付sdk
Vendor('Weixinpay.Weixinpay');
$wxpay=new\Weixinpay();
//获取jssdk需要用到的数据
$data=$wxpay->getParameters();
//将数据分配到前台页面
$assign=array(
'data'=>json_encode($data)
);
$this->assign($assign);
$this->display();
}
```
需要html的配合:/tpl/Api/Weixinpay/pay.html
```支付展示页
购买button>
function onBridgeReady(){
var data={$data};
WeixinJSBridge.invoke(
'getBrandWCPayRequest', data,
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
//使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}else{
alert(res.err_code+res.err_desc+res.err_msg); //显示错误信息
}
}
);
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
```
调用示例:/Application/Home/Controller/IndexController.class.php中的wexinpay_js方法
```项目订单提交的控制器
/**
*微信公众号jssdk支付
*/
publicfunctionwexinpay_js(){
//此处根据实际业务情况生成订单然后拿着订单去支付
//用时间戳虚拟一个订单号(请根据实际业务更改)
$out_trade_no=time();
//组合url
$url=U('Api/Weixinpay/pay',array('out_trade_no'=>$out_trade_no));
//前往支付
redirect($url);
}
```
五:异步接收通知
/Application/Api/Controller/WeixinpayController.class.php
支付成功时 走的判断,
```
/**
* notify_url接收页面
*/
publicfunctionnotify(){
//导入微信支付sdk
Vendor('Weixinpay.Weixinpay');
$wxpay=new\Weixinpay();
$result=$wxpay->notify();
if($result) {
//验证成功修改数据库的订单状态等$result['out_trade_no']为订单id
}
}
```
//*********************************增加curl_get_contents函数的分割线****************************
如果是整合到自己的项目中;则需要在自己的公共函数中增加curl_get_contents;
/Application/Common/Common/function.php
```公共方法内加入,直接复制进去就ok
/**
*使用curl获取远程数据
* @param string $url url连接
* @return string获取到的数据
*/
functioncurl_get_contents($url){
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL,$url);//设置访问的url地址
// curl_setopt($ch,CURLOPT_HEADER,1); //是否显示头部信息
curl_setopt($ch, CURLOPT_TIMEOUT, 5);//设置超时
curl_setopt($ch, CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);//用户访问代理User-Agent
curl_setopt($ch, CURLOPT_REFERER,$_SERVER['HTTP_HOST']);//设置referer
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//跟踪301
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回结果
$r=curl_exec($ch);
curl_close($ch);
return$r;
}
```
```
导入的 sdk 164 行, 更换自己 项目的 控制器的目录地址
取消 tp的 伪静态 后缀, 公共config 不取消,它会大U 自带 html
注意 url 访问模式,必须是 2 'URL_MODEL' => 2,
导入的微信cdk weixinpay 170 必须是 查出的数据 不能直接编辑
调试模式不能关, 只能关图标, 关调试 支付则不能用, 并不知道是什么原因
百度云,文件,
密码:figq