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.

87 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.

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