|
|
<?php
|
|
|
namespace LaneWeChat\Core; // 定义命名空间为 LaneWeChat\Core,表示该类属于微信核心功能模块
|
|
|
|
|
|
/**
|
|
|
* 微信Access_Token的获取与过期检查
|
|
|
*
|
|
|
* 该类负责管理微信Access_Token的获取和有效期检查,确保在使用微信API时始终使用有效的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。
|
|
|
*
|
|
|
* @return string 返回有效的Access_Token字符串
|
|
|
*/
|
|
|
public static function getAccessToken() {
|
|
|
// 检查本地缓存中是否存在有效的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,并通过HTTP GET请求从微信服务器获取Access_Token。
|
|
|
*
|
|
|
* @return array|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;
|
|
|
// 发起HTTP 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);
|
|
|
// 将Access_Token数据存入文件
|
|
|
$f = fopen('access_token', 'w+');
|
|
|
fwrite($f, $accessTokenJson);
|
|
|
fclose($f);
|
|
|
// 返回获取到的Access_Token数据
|
|
|
return $accessToken;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 检测Access_Token是否过期
|
|
|
*
|
|
|
* 该方法检查本地存储的Access_Token是否已过期,预留10秒的网络延迟时间,以确保在使用Access_Token时不会因过期而导致请求失败。
|
|
|
*
|
|
|
* @return bool|array 返回Access_Token是否有效,若有效则返回Access_Token数据,否则返回false
|
|
|
*/
|
|
|
private static function _checkAccessToken() {
|
|
|
// 获取本地存储的Access_Token数据
|
|
|
$data = file_get_contents('access_token');
|
|
|
// 将获取到的数据转换为关联数组
|
|
|
$accessToken = json_decode($data, true);
|
|
|
if (!empty($accessToken)) {
|
|
|
// 检查Access_Token是否过期,预留10秒的网络延迟时间
|
|
|
if (time() - $accessToken['time'] < $accessToken['expires_in'] - 10) {
|
|
|
// 若Access_Token未过期,则返回Access_Token数据
|
|
|
return $accessToken;
|
|
|
}
|
|
|
}
|
|
|
// 若Access_Token不存在或已过期,则返回false
|
|
|
return false;
|
|
|
}
|
|
|
} |