|  |  | namespace LaneWeChat\Core;
 | 
						
						
						
							|  |  | /**
 | 
						
						
						
							|  |  |  * 微信Access_Token的获取与过期检查
 | 
						
						
						
							|  |  |  * 创建者:Lane
 | 
						
						
						
							|  |  |  * 用户名:lane
 | 
						
						
						
							|  |  |  * 日期:13-12-29
 | 
						
						
						
							|  |  |  * 时间:下午5:54
 | 
						
						
						
							|  |  |  * 邮箱:lixuan868686@163.com
 | 
						
						
						
							|  |  |  * 网站:http://www.lanecn.com  
 | 
						
						
						
							|  |  |  */
 | 
						
						
						
							|  |  | class AccessToken{
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     /**
 | 
						
						
						
							|  |  |      * 获取微信Access_Token
 | 
						
						
						
							|  |  |      * 这个方法首先检查本地是否已经存在有效的access_token,如果不存在或已过期,则调用_getAccessToken方法从微信服务器获取新的access_token。
 | 
						
						
						
							|  |  |      */
 | 
						
						
						
							|  |  |     public static function getAccessToken(){
 | 
						
						
						
							|  |  |         //检测本地是否已经拥有access_token,并且检测access_token是否过期
 | 
						
						
						
							|  |  |         $accessToken = self::_checkAccessToken();
 | 
						
						
						
							|  |  |         if($accessToken === false){
 | 
						
						
						
							|  |  |             //如果本地没有有效的access_token,则从微信服务器获取新的access_token
 | 
						
						
						
							|  |  |             $accessToken = self::_getAccessToken();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |         //返回access_token的值
 | 
						
						
						
							|  |  |         return $accessToken['access_token'];
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     /**
 | 
						
						
						
							|  |  |      * 从微信服务器获取微信ACCESS_TOKEN
 | 
						
						
						
							|  |  |      * 这个方法构造请求微信服务器获取access_token的URL,并发起GET请求获取access_token。
 | 
						
						
						
							|  |  |      * @return Ambigous|bool 返回获取到的access_token数组或者在失败时返回错误信息
 | 
						
						
						
							|  |  |      */
 | 
						
						
						
							|  |  |     private static function _getAccessToken(){
 | 
						
						
						
							|  |  |         //构造请求微信服务器获取access_token的URL
 | 
						
						
						
							|  |  |         $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.WECHAT_APPID.'&secret='.WECHAT_APPSECRET;
 | 
						
						
						
							|  |  |         //使用Curl类的callWebServer方法发起GET请求获取access_token
 | 
						
						
						
							|  |  |         $accessToken = Curl::callWebServer($url, '', 'GET');
 | 
						
						
						
							|  |  |         //检查返回的数据中是否包含access_token字段
 | 
						
						
						
							|  |  |         if(!isset($accessToken['access_token'])){
 | 
						
						
						
							|  |  |             //如果获取access_token失败,则返回错误信息
 | 
						
						
						
							|  |  |             return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败');
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |         //记录获取access_token的时间
 | 
						
						
						
							|  |  |         $accessToken['time'] = time();
 | 
						
						
						
							|  |  |         //将access_token数据转换为JSON格式的字符串
 | 
						
						
						
							|  |  |         $accessTokenJson = json_encode($accessToken);
 | 
						
						
						
							|  |  |         //存入数据库
 | 
						
						
						
							|  |  |         /**
 | 
						
						
						
							|  |  |          * 请将变量$accessTokenJson给存起来,这个变量是一个字符串
 | 
						
						
						
							|  |  |          */
 | 
						
						
						
							|  |  |         //将access_token数据写入文件
 | 
						
						
						
							|  |  |         $f = fopen('access_token', 'w+');
 | 
						
						
						
							|  |  |         fwrite($f, $accessTokenJson);
 | 
						
						
						
							|  |  |         fclose($f);
 | 
						
						
						
							|  |  |         //返回获取到的access_token数据
 | 
						
						
						
							|  |  |         return $accessToken;
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     /**
 | 
						
						
						
							|  |  |      * 检测微信ACCESS_TOKEN是否过期
 | 
						
						
						
							|  |  |      * 这个方法检查本地存储的access_token是否过期,-10是预留的网络延迟时间。
 | 
						
						
						
							|  |  |      * @return bool 返回access_token是否有效
 | 
						
						
						
							|  |  |      */
 | 
						
						
						
							|  |  |     private static function _checkAccessToken(){
 | 
						
						
						
							|  |  |         //获取本地存储的access_token数据
 | 
						
						
						
							|  |  |         //注释掉的代码是使用数据库获取access_token数据的示例
 | 
						
						
						
							|  |  |         // $accessToken = YourDatabase::get('access_token');
 | 
						
						
						
							|  |  |         $data = file_get_contents('access_token');
 | 
						
						
						
							|  |  |         //将获取到的数据转换为关联数组
 | 
						
						
						
							|  |  |         $accessToken['value'] = $data;
 | 
						
						
						
							|  |  |         if(!empty($accessToken['value'])){
 | 
						
						
						
							|  |  |             //将JSON格式的字符串转换为关联数组
 | 
						
						
						
							|  |  |             $accessToken = json_decode($accessToken['value'], true);
 | 
						
						
						
							|  |  |             //检查access_token是否过期,预留10秒的网络延迟时间
 | 
						
						
						
							|  |  |             if(time() - $accessToken['time'] < $accessToken['expires_in']-10){
 | 
						
						
						
							|  |  |                 //如果access_token未过期,则返回access_token数据
 | 
						
						
						
							|  |  |                 return $accessToken;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |         //如果access_token不存在或已过期,则返回false
 | 
						
						
						
							|  |  |         return false;
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | } |