You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
3.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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