在进行微信二次开发时, 我们需要获得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;
}
}
