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

浏览:2266 最后更新:2016-09-17 17:45 分类:示例 关键字: thinkphp 微信公众号
公众号支付是指在微信app中访问的页面通过js直接调起微信支付;

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

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

一:设置域名

登录微信公众平台;

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



设置授权域名;



二:导入sdk

/ThinkPHP/Library/Vendor/Weixinpay

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

需要注意的是170行处的商品数据需要根据业务实际情况从数据库中获取;$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    '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方法
 */
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<!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方法/**
 * 微信 公众号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/**
 * notify_url接收页面
 */
public function notify(){
    // 导入微信支付sdk
    Vendor('Weixinpay.Weixinpay');
    $wxpay=new \Weixinpay();
    $result=$wxpay->notify();
    if ($result) {
        // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单id
        
    }
}
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客http://baijunyao.com
评论( 相关
后面还有条评论,点击查看>>