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){ $accessToken = self::_getAccessToken(); } return $accessToken['access_token']; } /** * 从微信服务器获取微信ACCESS_TOKEN * 这个方法构造请求微信服务器获取access_token的URL,并发起GET请求获取access_token。 * @return Ambigous|bool 返回获取到的access_token数组或者在失败时返回错误信息 */ private static function _getAccessToken(){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.WECHAT_APPID.'&secret='.WECHAT_APPSECRET; $accessToken = Curl::callWebServer($url, '', 'GET'); if(!isset($accessToken['access_token'])){ return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败'); } $accessToken['time'] = time(); $accessTokenJson = json_encode($accessToken); //存入数据库 /** * 请将变量$accessTokenJson给存起来,这个变量是一个字符串 */ $f = fopen('access_token', 'w+'); fwrite($f, $accessTokenJson); fclose($f); return $accessToken; } /** * 检测微信ACCESS_TOKEN是否过期 * 这个方法检查本地存储的access_token是否过期,-10是预留的网络延迟时间。 * @return bool 返回access_token是否有效 */ private static function _checkAccessToken(){ //获取access_token。是上面的获取方法获取到后存起来的。 // $accessToken = YourDatabase::get('access_token'); $data = file_get_contents('access_token'); $accessToken['value'] = $data; if(!empty($accessToken['value'])){ $accessToken = json_decode($accessToken['value'], true); if(time() - $accessToken['time'] < $accessToken['expires_in']-10){ return $accessToken; } } return false; } }