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