ThinkPHP3.2微信JSSDK签名配置config信息

ThinkPHP3.2  controller代码

/*
 *
 * 微信jssdk踩坑记:
 * 必须在服务器部署才有用
 * 1.配置js接口安全域名不要加http://等(大坑)
 * 2.用appid和appsecret发起请求换取access_token并将其全局缓存
 * 3.用换取到的access_token发起请求换取ticket
 * 4.签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
 * 5.将wxConfig(配置信息)返回
 *
 * */
//显示首页
public function index(){
    $wxConfig=$this->wxconfig(); //调用生成签名方法:返回配置信息
    $this->assign('wxConfig',$wxConfig);
    $this->display('index');
}


//签名算法并将配置信息返回
public function wxconfig(){
    $appid=C("appid"); //获取config中的appid
    $appsecret=C("appsecret");  //获取config中的appsecret
    //如果session中不存在token则发起请求,如果存在则获取session中的token
    if(!session("?token")){
        //拼接获取access_token请求路径
        $access_token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
        //发起请求,并将返回的json对象转为数组
        $access_token_result=json_decode($this->https_request($access_token_url),ture);
        session('token',$access_token_result['access_token']);//全局缓存token
    }
    $token=session('token');
    //如果session中不存在ticket则发起请求,如果存在则获取session中的ticket
    if(!session("?ticket")){
        //拼接获取jsapi_ticket请求路径
        $jsapi_ticket_url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$token&type=jsapi";
        //发起请求,并将返回的json对象转为数组
        $jsapi_ticket_result=json_decode($this->https_request($jsapi_ticket_url),true);
        session('ticket',$jsapi_ticket_result['ticket']); //全局缓存ticket
    }
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $currentUrl = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";//当前url
    $jsapi_ticket=session('ticket');  //jsapi_ticket
    $time=time();  //当前时间戳
    $randomStr=$this->createNonceStr();  //随机16位字符串
    //按照ASCII 码从小到大排序拼接
    $string = "jsapi_ticket=$jsapi_ticket&noncestr=$randomStr&timestamp=$time&url=$currentUrl";
    //对string进行sha1签名
    $signature = sha1($string);
    //wxjssdk配置信息
    $wxConfig=array(
        'appid'      =>  $appid,
        'timestamp'  =>  $time,
        'nonceStr'   =>  $randomStr,
        'signature'  =>  $signature,
    );
    return $wxConfig;
}
//生成16位随机字符串
public function createNonceStr($length = 16) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
}
//自定义函数,访问url返回结果
public function https_request($url){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl,  CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($curl);
    if (curl_errno($curl)){
        return 'ERROR'.curl_error($curl);
    }
    curl_close($curl);
    return $data;
}

config代码:

//微信公众号配置项

'appid'=>'APPID', //将此处appid改为正式公众号appid

'appsecret'=>'APPSECRET', //将此处appsecret改为正式公众号appsecret

html代码:(通过config接口注入权限验证配置)

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: "{$wxConfig['appid']}", // 必填,公众号的唯一标识

timestamp: "{$wxConfig['timestamp']}", // 必填,生成签名的时间戳

nonceStr: "{$wxConfig['nonceStr']}", // 必填,生成签名的随机串

signature: "{$wxConfig['signature']}",// 必填,签名

jsApiList: [



] // 必填,需要使用的JS接口列表

});

猜你喜欢

转载自blog.csdn.net/weixin_42028285/article/details/93481767
今日推荐