4.6 KiB
4.6 KiB
AccessToken 自动重试机制说明
功能概述
已为小程序二维码生成功能添加了 AccessToken 失效自动检测和重试机制,确保在 Token 失效时能够自动恢复。
实现的功能
1. AccessToken 强制刷新支持
方法: getWxAccessToken($appId, $appSecret, $forceRefresh = false)
新增参数:
$forceRefresh(bool): 是否强制刷新,不使用缓存
功能:
- 默认从缓存获取 AccessToken
- 当
$forceRefresh = true时,清除缓存并重新获取 - 记录详细日志,便于追踪
使用示例:
// 正常获取(使用缓存)
$token = self::getWxAccessToken($appId, $appSecret);
// 强制刷新(不使用缓存)
$token = self::getWxAccessToken($appId, $appSecret, true);
2. 自动重试机制
方法: generateWxQrcode($config, $page, $scene, $retryCount = 0)
新增参数:
$retryCount(int): 当前重试次数,默认为 0
工作流程:
- 首次调用时使用缓存的 AccessToken
- 如果微信返回 40001 或 42001 错误(Token 失效)
- 自动清除缓存
- 递归调用自己,重试一次(
$retryCount + 1) - 重试时强制刷新 AccessToken
- 最多重试 1 次,避免无限循环
错误码说明:
40001: invalid credential, access_token is invalid42001: 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: 正常流程
- 配置正确的小程序信息
- 首次生成二维码
- 查看日志确认使用缓存
- 验证生成成功
测试2: Token 失效恢复
- 手动清除 AccessToken 缓存
php server/clear_wx_token_cache.php - 立即生成二维码
- 查看日志确认自动重试
- 验证生成成功
测试3: 配置错误
- 故意配置错误的 AppSecret
- 尝试生成二维码
- 查看日志确认重试流程
- 验证返回正确的错误信息
相关文档
QRCODE_README.md- 完整文档导航QRCODE_DEBUG_GUIDE.md- 问题排查指南QRCODE_QUICK_START.md- 快速开始
版本信息
- 实现时间: 2024-03-06
- 版本: v1.1
- 状态: ✅ 已完成并测试
重要提示: 此机制大大提升了系统的健壮性,但不能解决配置错误问题。请确保 AppID 和 AppSecret 配置正确!