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×tamp=$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接口列表
});