Files
zyt/ACCESS_TOKEN_AUTO_RETRY.md
T
2026-03-06 14:27:24 +08:00

176 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AccessToken 自动重试机制说明
## 功能概述
已为小程序二维码生成功能添加了 AccessToken 失效自动检测和重试机制,确保在 Token 失效时能够自动恢复。
## 实现的功能
### 1. AccessToken 强制刷新支持
**方法**: `getWxAccessToken($appId, $appSecret, $forceRefresh = false)`
**新增参数**:
- `$forceRefresh` (bool): 是否强制刷新,不使用缓存
**功能**:
- 默认从缓存获取 AccessToken
-`$forceRefresh = true` 时,清除缓存并重新获取
- 记录详细日志,便于追踪
**使用示例**:
```php
// 正常获取(使用缓存)
$token = self::getWxAccessToken($appId, $appSecret);
// 强制刷新(不使用缓存)
$token = self::getWxAccessToken($appId, $appSecret, true);
```
### 2. 自动重试机制
**方法**: `generateWxQrcode($config, $page, $scene, $retryCount = 0)`
**新增参数**:
- `$retryCount` (int): 当前重试次数,默认为 0
**工作流程**:
1. 首次调用时使用缓存的 AccessToken
2. 如果微信返回 40001 或 42001 错误(Token 失效)
3. 自动清除缓存
4. 递归调用自己,重试一次(`$retryCount + 1`
5. 重试时强制刷新 AccessToken
6. 最多重试 1 次,避免无限循环
**错误码说明**:
- `40001`: invalid credential, access_token is invalid
- `42001`: access_token expired
## 使用场景
### 场景1: 正常生成(Token 有效)
```
用户点击生成 → 使用缓存Token → 成功生成二维码
```
### 场景2: Token 失效自动恢复
```
用户点击生成
→ 使用缓存Token
→ 微信返回40001错误
→ 自动清除缓存
→ 重新获取Token
→ 再次调用微信API
→ 成功生成二维码
```
### 场景3: 配置错误(无法恢复)
```
用户点击生成
→ 使用缓存Token
→ 微信返回40001错误
→ 自动重试
→ 重新获取Token失败(AppID/AppSecret错误)
→ 返回错误信息给用户
```
## 日志记录
所有关键步骤都会记录日志,便于追踪问题:
### 正常流程日志
```
[info] 使用缓存的AccessToken
[info] 开始生成小程序码 {"page":"...","scene":"...","app_id":"...","retry_count":0}
[info] 调用微信API生成小程序码 {"data":{...}}
[info] 小程序码生成成功 {"url":"...","retry_count":0}
```
### 自动重试流程日志
```
[info] 使用缓存的AccessToken
[info] 开始生成小程序码 {"page":"...","scene":"...","app_id":"...","retry_count":0}
[info] 调用微信API生成小程序码 {"data":{...}}
[error] 生成小程序码失败: errcode=40001, errmsg=invalid credential...
[info] AccessToken失效,自动重试(第1次)
[info] 强制刷新AccessToken,清除缓存
[info] 微信AccessToken响应: {"access_token":"...","expires_in":7200}
[info] AccessToken获取成功并已缓存
[info] 开始生成小程序码 {"page":"...","scene":"...","app_id":"...","retry_count":1}
[info] 调用微信API生成小程序码 {"data":{...}}
[info] 小程序码生成成功 {"url":"...","retry_count":1}
```
## 优势
### 1. 用户体验提升
- 无需手动清除缓存
- 无需重新点击按钮
- 自动恢复,对用户透明
### 2. 系统稳定性
- 自动处理 Token 失效
- 避免因缓存问题导致的失败
- 限制重试次数,防止无限循环
### 3. 问题排查
- 详细的日志记录
- 记录重试次数
- 便于追踪问题根源
## 注意事项
### 1. 重试限制
- 最多重试 1 次
- 避免无限递归
- 如果重试后仍失败,返回错误
### 2. 性能考虑
- 首次调用使用缓存,性能最优
- 重试时才强制刷新,影响可控
- 缓存时长 7000 秒,减少请求频率
### 3. 错误处理
- 配置错误(AppID/AppSecret)无法通过重试解决
- 网络问题可能导致重试失败
- 需要查看日志确定具体原因
## 测试建议
### 测试1: 正常流程
1. 配置正确的小程序信息
2. 首次生成二维码
3. 查看日志确认使用缓存
4. 验证生成成功
### 测试2: Token 失效恢复
1. 手动清除 AccessToken 缓存
```bash
php server/clear_wx_token_cache.php
```
2. 立即生成二维码
3. 查看日志确认自动重试
4. 验证生成成功
### 测试3: 配置错误
1. 故意配置错误的 AppSecret
2. 尝试生成二维码
3. 查看日志确认重试流程
4. 验证返回正确的错误信息
## 相关文档
- `QRCODE_README.md` - 完整文档导航
- `QRCODE_DEBUG_GUIDE.md` - 问题排查指南
- `QRCODE_QUICK_START.md` - 快速开始
## 版本信息
- 实现时间: 2024-03-06
- 版本: v1.1
- 状态: ✅ 已完成并测试
---
**重要提示**: 此机制大大提升了系统的健壮性,但不能解决配置错误问题。请确保 AppID 和 AppSecret 配置正确!