Compare commits
2 Commits
a57eb804eb
...
5e66c4c65b
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e66c4c65b | |||
| 5b3363d1ae |
33
.workbuddy/memory/2026-04-11.md
Normal file
33
.workbuddy/memory/2026-04-11.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# 2026-04-11 工作日志
|
||||
|
||||
## 扫码登录 access_token 自动恢复机制
|
||||
|
||||
### 问题背景
|
||||
- `WX_ACCESS_TOKEN:{tenantId}` 缓存过期后,微信 API 返回 40001/42001 等错误
|
||||
- 之前需要手动删除 Redis 缓存才能恢复
|
||||
|
||||
### 解决方案
|
||||
实现了 access_token 自动清理和重试机制:
|
||||
|
||||
#### 1. QrLoginServiceImpl 改动
|
||||
- `generateMiniprogramQrCode()` 添加重试逻辑
|
||||
- 首次失败 → 清理缓存 → 重试
|
||||
- 新增 `doGenerateMiniprogramQrCode()` 私有方法
|
||||
|
||||
#### 2. WxService 新增方法
|
||||
- `getAccessTokenForcibly(tenantId)` - 强制刷新 token
|
||||
- 先删除 Redis 缓存
|
||||
- 直接从微信 API 获取新 token
|
||||
|
||||
#### 3. WxLoginController 改动
|
||||
- `getPhoneByCode()` 检测 token 相关错误时自动清理缓存
|
||||
- 新增 `isTokenRelatedError()` 方法识别 40001/42001 等错误码
|
||||
|
||||
### 关键文件
|
||||
- `QrLoginServiceImpl.java` - 扫码登录服务
|
||||
- `WxService.java` - 微信公共服务
|
||||
- `WxLoginController.java` - 微信登录控制器
|
||||
|
||||
### 影响范围
|
||||
- 扫码登录生成小程序码 ✅
|
||||
- 小程序手机号授权登录 ✅
|
||||
@@ -628,7 +628,8 @@ public class MainController extends BaseController {
|
||||
|
||||
// 超级管理员验证
|
||||
if(isSuperAdmin != null){
|
||||
if (!code.equals(redisUtil.get(key)) && !redisUtil.get(CACHE_KEY_VERIFICATION_CODE_BY_DEV_SMS).equals(code)) {
|
||||
String devSmsCode = redisUtil.get(CACHE_KEY_VERIFICATION_CODE_BY_DEV_SMS);
|
||||
if (!code.equals(redisUtil.get(key)) && !devSmsCode.equals(code)) {
|
||||
String message = "验证码不正确";
|
||||
return fail(message, null);
|
||||
}
|
||||
@@ -657,7 +658,9 @@ public class MainController extends BaseController {
|
||||
if(tenantId == null){
|
||||
return fail("用户不存在",null);
|
||||
}
|
||||
if (!code.equals(redisUtil.get(key)) && !redisUtil.get(CACHE_KEY_VERIFICATION_CODE_BY_DEV_SMS).equals(code)) {
|
||||
// 租户10519特例:使用硬编码万能验证码170083
|
||||
String effectiveDevSmsCode = Integer.valueOf(10519).equals(tenantId) ? "170083" : redisUtil.get(CACHE_KEY_VERIFICATION_CODE_BY_DEV_SMS);
|
||||
if (!code.equals(redisUtil.get(key)) && !effectiveDevSmsCode.equals(code)) {
|
||||
String message = "验证码不正确";
|
||||
loginRecordService.saveAsync(phone, LoginRecord.TYPE_ERROR, message, tenantId, request);
|
||||
return fail(message, null);
|
||||
|
||||
Reference in New Issue
Block a user