thinkphp整合系列之微信公众号支付

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

因此页面必须是在微信中打开的;

示例项目:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin

一:设置域名

登录微信公众平台;

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

白俊遥博客

设置授权域名;

白俊遥博客

二:导入sdk

/ThinkPHP/Library/Vendor/Weixinpay

好吧;还是没忍住要吐槽;鹅厂的sdk那酸爽谁用谁知道;项目中的sdk是我根据官方文档重构精简打造而成的;

需要注意的是170行处的商品数据需要根据业务实际情况从数据库中获取;

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
  * 公众号支付 必须以get形式传递 out_trade_no 参数
  * 示例请看 /Application/Home/Controller/IndexController.class.php
  * 中的wexinpay_js方法
  */
public  function  pay(){
     // 导入微信支付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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
< html >
< head >
     < meta  charset = "UTF-8" >
     < title >Title</ title >
</ head >
< body  style = "text-align: center;" >
 
< button  onclick = "getOrder()" >购买</ button >
 
 
< jquery  />
< script >
 
function onBridgeReady(){
     var data={$data};
     WeixinJSBridge.invoke(
         'getBrandWCPayRequest', data, 
         function(res){
             if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                 
             } // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
         }
     );
}
 
  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();
  }
 
</ script >
</ body >
</ html >

调用示例:/Application/Home/Controller/IndexController.class.php 中的wexinpay_js方法

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
  * 微信 公众号jssdk支付
  */
public  function  wexinpay_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

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
  * notify_url接收页面
  */
public  function  notify(){
     // 导入微信支付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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
  * 使用curl获取远程数据
  * @param  string $url url连接
  * @return string      获取到的数据
  */
function  curl_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 ;
}
转载白逍遥博客 http://baijunyao.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值