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; } }