Codex Assistant
昨天 afeeed281e60466b576fbe74d339634cc5d07b82
backend/src/main/java/com/rongyichuang/auth/service/AuthService.java
@@ -293,9 +293,9 @@
            logger.warn("⚠️ unionid为空或用户已找到,跳过unionid查找");
        }
        // 4. 如果都没找到用户,不创建新用户,只记录登录信息
        // 4. 如果都没找到用户,为小程序访问创建匿名用户对象(不保存到数据库)
        if (user == null) {
            logger.info("未找到现有用户,普通访问用户不创建user记录,只记录登录信息");
            logger.info("未找到现有用户,为小程序访问创建匿名用户对象");
            logger.info("访问用户信息:");
            logger.info("- openid: {}", wxLoginRequest.getWxOpenid());
            logger.info("- unionid: {}", wxLoginRequest.getWxUnionid());
@@ -321,17 +321,44 @@
                throw new RuntimeException("创建登录记录失败: " + e.getMessage(), e);
            }
            
            // 返回访问用户的响应(无用户信息,无token)
            // 6. 为匿名用户生成特殊的JWT token(使用专门的wxopenid字段)
            logger.info("步骤4: 为匿名用户生成JWT token");
            String token = null;
            try {
                // 使用特殊的用户ID(负数)来标识匿名用户,避免与真实用户ID冲突
                Long anonymousUserId = -Math.abs(wxLoginRequest.getWxOpenid().hashCode()) % 1000000L;
                // 使用新的三参数方法:userId, phone(null), wxopenid
                token = jwtUtil.generateToken(anonymousUserId, null, wxLoginRequest.getWxOpenid());
                logger.info("✅ 成功生成匿名用户JWT token,wxopenid: {}", wxLoginRequest.getWxOpenid());
            } catch (Exception e) {
                logger.error("❌ 生成匿名用户JWT token失败: {}", e.getMessage());
                logger.error("异常堆栈:", e);
                throw new RuntimeException("生成JWT token失败: " + e.getMessage(), e);
            }
            // 7. 构建匿名用户信息
            logger.info("步骤5: 构建匿名用户信息响应");
            LoginResponse.UserInfo userInfo = new LoginResponse.UserInfo(
                    null, // userId为null,表示匿名用户
                    "微信用户", // 默认名称
                    null, // 没有电话号码
                    "anonymous" // 用户类型为匿名
            );
            // 返回匿名用户的响应(包含用户信息和token)
            WxLoginResponse response = new WxLoginResponse();
            response.setSuccess(true);
            response.setMessage("访问成功");
            response.setMessage("匿名访问成功");
            response.setToken(token);
            response.setUserInfo(userInfo);
            response.setSessionKey(wxLoginRequest.getSessionKey());
            response.setIsNewUser(false);
            response.setHasEmployee(false);
            response.setHasJudge(false);
            response.setHasPlayer(false);
            response.setLoginRecordId(loginRecord.getId());
            
            logger.info("=== 微信访问流程完成(无用户创建) ===");
            logger.info("=== 微信匿名访问流程完成 ===");
            return response;
        }
@@ -408,12 +435,13 @@
        // 6. 生成JWT token
        logger.info("步骤5: 生成JWT token");
        String tokenIdentifier = user.getPhone() != null ? user.getPhone() : user.getWxOpenid();
        logger.info("Token标识符: {}", tokenIdentifier);
        logger.info("用户手机号: {}", user.getPhone());
        logger.info("用户wxopenid: {}", user.getWxOpenid());
        
        String token = null;
        try {
            token = jwtUtil.generateToken(user.getId(), tokenIdentifier);
            // 使用新的三参数方法:userId, phone, wxopenid
            token = jwtUtil.generateToken(user.getId(), user.getPhone(), user.getWxOpenid());
            logger.info("✅ 成功生成JWT token,长度: {}", token != null ? token.length() : 0);
        } catch (Exception e) {
            logger.error("❌ 生成JWT token失败: {}", e.getMessage());