微信页面授权–(js-sdk使用权限签名算法)
使用方法:实例化此类,然后调用其中的getsignpackage()方法即可。
注意:其中涉及获取access_token和jsapi_ticket需要自己缓存,不能频繁获取!
appid = $appid; $this->appsecret = $appsecret; } /* * 获取access_token * (需要缓存,可利用数据库存储,不要频繁刷新获取) * http请求方式: get https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret * 接口请求参数 * 参数 是否必须 说明 grant_type 是 获取access_token填写client_credential appid 是 第三方用户唯一凭证 secret 是 第三方用户唯一凭证密钥,即appsecret * 接口返回说明 * {access_token:access_token,expires_in:7200} access_token 获取到的凭证 expires_in 凭证有效时间,单位:秒 * 接口错误说明 * {errcode:40013,errmsg:invalid appid} * */privatefunctiongetaccesstoken(){$appid = $this->appid; $appsecret = $this->appsecret; $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret; $res = $this->api_request($url); if(isset($res->access_token)){ returnarray( 'errcode' =>0, 'errmsg' =>'success', 'access_token' =>$res->access_token, 'expires_in' =>$res->expires_in ); }else{ returnarray( 'errcode' =>$res->errcode, 'errmsg' =>$res->errmsg, 'access_token' =>null, 'expires_in' =>null ); } } /* * 获取jsapi_ticket * (有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket) * 请求方式:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=access_token&type=jsapi * 接口返回值:json * { errcode:0, errmsg:ok, ticket:bxldikrxvbtpdhsm05e5u5suoxnkd8-41zo3mhkoyn5ofkwitdggnr2fwj0m9e8nyzwkvzvdvtaugwvsdshfka, expires_in:7200 } * */privatefunctiongetjsapiticket(){$access_token_data = $this->getaccesstoken(); if($access_token_data['errcode']==0){ $access_token = $access_token_data['access_token']; $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi'; $res = $this->api_request($url); if($res->errcode==0){ returnarray( 'errcode' =>$res->errcode, 'errmsg' =>$res->errmsg, 'ticket' =>$res->ticket, 'expires_in' =>$res->expires_in ); }else{ returnarray( 'errcode' =>$res->errcode, 'errmsg' =>$res->errmsg, 'ticket' =>null, 'expires_in' =>null ); } }else{ returnarray( 'errcode' =>$access_token_data['errcode'], 'errmsg' =>$access_token_data['errmsg'], 'ticket' =>null, 'expires_in' =>null ); } } /* * 签名算法 * 签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的url,不包含#及其后面部分) 。 * 1、对所有待签名参数按照字段名的ascii 码从小到大排序(字典序)后, * 2、使用url键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。 * 这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行url 转义。 * *//* * 获取随机字符串 * mt_rand() 使用 mersenne twister 算法返回随机整数。 * mt_rand(min,max)如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 rand_max 之间的伪随机数。 * 想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5, 15)。 * 此函数rand()快四倍 * *//* * 1.签名用的noncestr和timestamp必须与wx.config中的noncestr和timestamp相同。 * 2.签名用的url必须是调用js接口页面的完整url。 * 3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。 * 注意: * 确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。 * 如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeuricomponent), * 因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。 * */publicfunctiongetsignpackage() {$jsapiticket_data = $this->getjsapiticket(); $noncestr = $this->getnoncestr(); $timestamp = time(); $url = $this->geturl(); if($jsapiticket_data['errcode']==0){ $jsapiticket = $jsapiticket_data['ticket']; // 这里参数的顺序要按照 key 值 ascii 码升序排序$string = jsapi_ticket=$jsapiticket&n/span>; $signature = sha1($string); returnarray( appid => $this->appid, noncestr => $noncestr, timestamp => $timestamp, url => $url, signature => $signature, rawstring => $string, errcode => $jsapiticket_data['errcode'], errmsg => $jsapiticket_data['errmsg'] ); }else{ returnarray( appid => $this->appid, noncestr => $noncestr, timestamp => $timestamp, url => $url, signature => null, rawstring => null, errcode => $jsapiticket_data['errcode'], errmsg => $jsapiticket_data['errmsg'] ); } } /* * 获取noncestr * */privatefunctiongetnoncestr($length = 16) {$chars = abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789; $noncestr = ; for ($i = 0; $i $length; $i++) { $noncestr .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return$noncestr; } /* * 获取url * url(当前网页的url,不包含#及其后面部分) * */privatefunctiongeturl(){$protocol = (!empty($_server['https']) && $_server['https'] !== 'off' || $_server['server_port'] == 443) ? https:// : http://; $url = $protocol$_server[http_host]$_server[request_uri]; return$url; } /* * 微信api调用方法 * */privatefunctionapi_request($url,$data=null){//初始化curl方法$ch = curl_init(); //设置curl参数(基本参数)$opts = array( //在局域网内访问https站点时需要设置以下两项,关闭ssl验证!//此两项正式上线时需要更改(不检查和验证认证) curlopt_ssl_verifypeer => false, curlopt_ssl_verifyhost => false, curlopt_timeout => 500, curlopt_returntransfer => true, curlopt_url => $url, ); curl_setopt_array($ch, $opts); //post请求参数if (!empty($data)) { curl_setopt($ch, curlopt_post, true); curl_setopt($ch, curlopt_postfields, $data); } //执行curl操作$output = curl_exec($ch); if (curl_errno($ch)) { //curl操作发生错误处理。 var_dump(curl_error($ch)); die; } //关闭curl curl_close($ch); $res = json_decode($output); return ($res); //返回json数据 }}
').addclass('pre-numbering').hide(); $(this).addclass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadein(1700); }); }); 以上就介绍了微信jssdk页面授权实现类php,包括了php,ssd方面的内容,希望对php教程有兴趣的朋友有所帮助。