fix(system): 优化扫码登录状态更新逻辑

- 修改Redis键命名为更规范的格式
- 先尝试获取已有扫码登录数据并解析更新
- 只有在无现有数据时才创建新的扫码登录记录
- 统一设置状态为confirmed,保证有效期60秒
- 增加日志区分新建与更新扫码登录完成情况
- 捕获异常并记录错误日志完善容错处理
This commit is contained in:
2026-04-06 18:34:26 +08:00
parent aa910870cc
commit 4eba22e42d

View File

@@ -296,16 +296,32 @@ public class WxOfficialController extends BaseController {
*/
private void completeQrLogin(String token, Integer userId, Integer tenantId) {
try {
// 更新扫码登录状态
String redisKey = "QR_LOGIN_TOKEN:" + token;
JSONObject qrLoginData = new JSONObject();
qrLoginData.put("status", "confirmed");
qrLoginData.put("userId", userId);
qrLoginData.put("tenantId", tenantId);
qrLoginData.put("confirmTime", System.currentTimeMillis());
// 保存1分钟给前端足够时间获取
redisUtil.set(redisKey, qrLoginData.toJSONString(), 60L, TimeUnit.SECONDS);
System.out.println("扫码登录完成token=" + token + ", userId=" + userId);
// 获取已有的扫码登录数据
String redisKey = "qr-login:token:" + token;
String existingData = redisUtil.get(redisKey);
// 如果有现有数据,解析后更新
if (StrUtil.isNotBlank(existingData)) {
JSONObject jsonData = JSONObject.parseObject(existingData);
jsonData.put("status", "confirmed");
jsonData.put("userId", userId);
jsonData.put("tenantId", tenantId);
jsonData.put("confirmTime", System.currentTimeMillis());
// 保存60秒给前端足够时间获取
redisUtil.set(redisKey, jsonData.toJSONString(), 60L, TimeUnit.SECONDS);
System.out.println("扫码登录完成token=" + token + ", userId=" + userId);
} else {
// 没有现有数据,创建一个新的
JSONObject qrLoginData = new JSONObject();
qrLoginData.put("token", token);
qrLoginData.put("status", "confirmed");
qrLoginData.put("userId", userId);
qrLoginData.put("tenantId", tenantId);
qrLoginData.put("confirmTime", System.currentTimeMillis());
// 保存60秒
redisUtil.set(redisKey, qrLoginData.toJSONString(), 60L, TimeUnit.SECONDS);
System.out.println("扫码登录完成新建token=" + token + ", userId=" + userId);
}
} catch (Exception e) {
log.error("完成扫码登录失败: {}", e.getMessage());
}