微信支付

公众号支付是指在微信app中访问的页面通过js直接调起微信支付;

一:设置域名

登录微信公众平台;

微信支付中设置支付授权目录;把域名改为自己的;

注意最后是有一个斜线的/

微信支付_第1张图片

支付授权目录是  控制器的,   ,精准到     weixinpay控制器   

设置授权域名;  

微信支付_第2张图片

二:导入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

你可能感兴趣的:(微信支付)