微信公众号网页开发js配置服务端签名
本程序适用于thinkphp,原生php自己适当改下代码。S('wx_token')是thinkphp中的缓存函数。
$appid="###";
$secret="#";
$token = S('wx_token');
if (!$token) {
$url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
$res = file_get_contents($url);
$res = json_decode($res, true);
$token = $res['access_token'];
// 注意:这里需要将获取到的token缓存起来(或写到数据库中)
// 不能频繁的访问https://api.weixin.qq.com/cgi-bin/token,每日有次数限制
// 通过此接口返回的token的有效期目前为2小时。令牌失效后,JS-SDK也就不能用了。
// 因此,这里将token值缓存1小时,比2小时小。缓存失效后,再从接口获取新的token,这样
// 就可以避免token失效。
// S()是ThinkPhp的缓存函数,如果使用的是不ThinkPhp框架,可以使用你的缓存函数,或使用数据库来保存。
S('wx_token', $token, 3600);
}
$ticket = S('wx_ticket');
if(!$ticket){
$url2 = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$token&type=jsapi";
$res = file_get_contents($url2);
$res = json_decode($res, true);
$ticket = $res['ticket'];
// 注意:这里需要将获取到的ticket缓存起来(或写到数据库中)
// ticket和token一样,不能频繁的访问接口来获取,在每次获取后,我们把它保存起来。
S('wx_ticket', $ticket, 3600);
}
// 注意 URL 一定要动态获取,不能 hardcode.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$wxticket = $ticket;
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$nonceStr = "";
for ($i = 0; $i < 16; $i++) {
$nonceStr .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$wxticket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$data['token']=$token;
$data['ticket']=$ticket;
$data['url']=$url;
$data['timestamp']=$timestamp;
$data['nonceStr']=$nonceStr;
$data['signature']=$signature;
$data['wx']=$string;
//api("100","成功",$data);
echo '
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
wx.config({
debug: true,
appId: "'.$appid.'",
timestamp: "'.$timestamp.'",
nonceStr: "'.$nonceStr.'",
signature: "'.$signature.'",
jsApiList: [
// 所有要调用的 API 都要加到这个列表中
\'chooseImage\'
]
});
wx.ready(function () {
// 在这里调用 API
alert("neng");
wx.checkJsApi({
jsApiList: [\'chooseImage\'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
success: function(res) {
alert("success");
// 以键值对的形式返回,可用的api值true,不可用为false
// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
}
});
});
</script>
';