在進行微信二次開發(fā)時, 我們需要獲得access_token, 及ticket, 同時這些信息每天獲取次數(shù)的限制, 并且有效時間為7200秒, 為了避免重復獲取, 同時也為了訪問速度更快, 我們有必要獲取后, 進行文件緩存處理, 這樣既提升了訪問效率, 也避免了重復的獲取, 有些人不清楚該怎么來緩存文件, 這里專門寫了一個類, 方便大家的使用和學習, 可以直接調(diào)用
//微信類 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數(shù)據(jù) $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獲取請求文本內(nèi)容 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);//設置頭文件的信息作為數(shù)據(jù)流輸出 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);//執(zhí)行命令 curl_close($curl);//關(guān)閉URL請求 } return $data; } //生成簽名的隨機串, JSSDK會調(diào)用 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; } }