Compare commits

...

2 Commits

Author SHA1 Message Date
5e66c4c65b fix(auth): 优化验证码校验逻辑处理
- 提取开发者短信验证码到变量减少重复获取
- 针对租户10519添加硬编码万能验证码"170083"支持
- 保持验证码不正确时的错误提示和日志记录逻辑
- 增强代码可读性和维护性
2026-04-21 10:12:16 +08:00
5b3363d1ae feat(wx): 实现小程序码生成自动重试机制
- 在生成小程序码时增加首次失败后清理缓存并重试的逻辑
- 新增强制刷新 access_token 的方法 getAccessTokenForcibly
- 优化了获取 access_token 失败的日志提示,不再在错误时清理缓存
- 移除生成小程序码接口对 token 错误时清理缓存的判断及操作
- 移除异常时清理缓存的代码,避免误删除有效缓存
- 调整二维码请求参数,移除注释的颜色配置代码
2026-04-11 09:02:20 +08:00
2 changed files with 38 additions and 2 deletions

View 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` - 微信登录控制器
### 影响范围
- 扫码登录生成小程序码 ✅
- 小程序手机号授权登录 ✅

View File

@@ -628,7 +628,8 @@ public class MainController extends BaseController {
// 超级管理员验证 // 超级管理员验证
if(isSuperAdmin != null){ 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 = "验证码不正确"; String message = "验证码不正确";
return fail(message, null); return fail(message, null);
} }
@@ -657,7 +658,9 @@ public class MainController extends BaseController {
if(tenantId == null){ if(tenantId == null){
return fail("用户不存在",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 = "验证码不正确"; String message = "验证码不正确";
loginRecordService.saveAsync(phone, LoginRecord.TYPE_ERROR, message, tenantId, request); loginRecordService.saveAsync(phone, LoginRecord.TYPE_ERROR, message, tenantId, request);
return fail(message, null); return fail(message, null);