在进行微信二次开发时, 我们需要获得access_token, 及ticket, 同时这些信息每天获取次数的限制, 并且有效时间为7200秒, 为了避免重复获取, 同时也为了访问速度更快, 我们有必要获取后, 进行文件缓存处理, 这样既提升了访问效率, 也避免了重复的获取, 有些人不清楚该怎么来缓存文件, 这里专门写了一个类, 方便大家的使用和学习, 可以直接调用
//微信类 class Wx{ //测试账号: private $AppID = "wx533c0237aaa819c0"; private $AppSecret = "5d8974aba181fabe8c03b2728f88da40"; private $token = "zhuangzi"; public $request; //获取access_token, 如果过期,就重新获得,没过期,仍然使用原来的 public function get_access_token(){ $file_path = ROOT_PATH."public/temp/wx_token.php"; if(file_exists($file_path)){ /*判断签名有没有过期 begin*/ $arr = include($file_path); $last_time = $arr["times"]; $len = (time()-$last_time); if($len>=7200) { $this -> _make_access_token(); } /*判断签名有没有过期 end*/ } else{ $this -> _make_access_token(); } $arr = include($file_path); return $arr["access_token"]; } //将 获得的 access_token 存储到 文件中 //access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效 public function _make_access_token(){ $AppID = $this->AppID; $AppSecret = $this->AppSecret; //通过curl方式获取json数据 $requesturl= "https://api.weixin.qq.com/cgi-bin/token? grant_type=client_credential&appid=$AppID&secret=$AppSecret"; $data = $this -> get_curl_contents($requesturl); $result = json_decode($data); //将获得的 token 存储到文件中 $file_path = ROOT_PATH."public/temp/wx_token.php"; $myfile = fopen($file_path, "w") or die("不能写入文件"); $txt = "<?php\n"; $txt .= " return array(\n"; $txt .= " 'access_token'=>'".$result->access_token."',\n" ; $txt .= " 'times' =>'".time()."' \n" ; $txt .= " );\n"; $txt .= "?>\n"; fwrite($myfile, $txt); fclose($myfile); } //获取微信公众号ticket public function get_jsapi_ticket() { $file_path = ROOT_PATH."public/temp/wx_ticket.php"; if(file_exists($file_path)){ /*判断签名有没有过期 begin*/ $arr = include($file_path); $last_time = $arr["times"]; $len = (time()-$last_time); if($len>=7200) { $this -> _make_jsapi_ticket(); } /*判断签名有没有过期 end*/ } else{ $this -> _make_jsapi_ticket(); } $arr = include($file_path); return $arr["wx_ticket"]; } //将 获得的 jsapi_ticket 存储到 文件中 //jsapi_ticket的有效期目前为2个小时,需定时刷新 public function _make_jsapi_ticket(){ $access_token = $this -> get_access_token(); // echo $access_token; $url = sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket? access_token=%s&type=jsapi", $access_token); $res = $this -> get_curl_contents($url); $res = json_decode($res, true); //将获得的 ticket 存储到文件中 $file_path = ROOT_PATH."public/temp/wx_ticket.php"; $myfile = fopen($file_path, "w") or die("不能写入文件"); $txt = "<?php\n"; $txt .= " return array(\n"; $txt .= " 'wx_ticket'=>'".$res['ticket']."',\n" ; $txt .= " 'times' =>'".time()."' \n" ; $txt .= " );\n"; $txt .= "?>\n"; fwrite($myfile, $txt); fclose($myfile); } //curl获取请求文本内容 public function get_curl_contents($url, $method ='GET', $data = array()) { if($method == 'GET'){ $curl = curl_init(); //初始化 curl_setopt($curl, CURLOPT_URL, $url);//设置抓取的url 为 $requesturl curl_setopt($curl, CURLOPT_HEADER, 0);//设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //跳过证书验证 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 $data = curl_exec($curl);//执行命令 curl_close($curl);//关闭URL请求 } return $data; } //生成签名的随机串, JSSDK会调用 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; } }