PHP获得微信access_token及ticket并进行文件缓存

时间:2017-09-05 22:31:08 类型:PHP
字号:    

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


微信获得access_token类