diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/AuthService.cs b/server/HoneyBox/src/HoneyBox.Core/Services/AuthService.cs index 72e474de..713188c1 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/AuthService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/AuthService.cs @@ -52,8 +52,11 @@ public class AuthService : IAuthService /// public async Task WechatMiniProgramLoginAsync(string code, int? pid, string? clickId) { + _logger.LogInformation("[AuthService] 微信登录开始,code={Code}, pid={Pid}, clickId={ClickId}", code, pid, clickId); + if (string.IsNullOrWhiteSpace(code)) { + _logger.LogWarning("[AuthService] 微信登录失败:code为空"); return new LoginResult { Success = false, @@ -65,22 +68,31 @@ public class AuthService : IAuthService { // 1.6 防抖机制 - 3秒内不允许重复登录 var debounceKey = $"{LoginDebounceKeyPrefix}wechat:{code}"; + _logger.LogInformation("[AuthService] 检查防抖锁: {Key}", debounceKey); var lockAcquired = await _redisService.TryAcquireLockAsync(debounceKey, "1", TimeSpan.FromSeconds(DebounceSeconds)); if (!lockAcquired) { - _logger.LogWarning("Login debounce triggered for code: {Code}", code); + _logger.LogWarning("[AuthService] 防抖触发,拒绝重复登录请求: {Code}", code); return new LoginResult { Success = false, ErrorMessage = "请勿频繁登录" }; } + _logger.LogInformation("[AuthService] 防抖锁获取成功"); // 1.1 调用微信API获取openid和unionid + _logger.LogInformation("[AuthService] 开始调用微信API获取openid..."); var wechatResult = await _wechatService.GetOpenIdAsync(code); + _logger.LogInformation("[AuthService] 微信API调用完成,Success={Success}, OpenId={OpenId}, UnionId={UnionId}, Error={Error}", + wechatResult.Success, + wechatResult.OpenId ?? "null", + wechatResult.UnionId ?? "null", + wechatResult.ErrorMessage ?? "null"); + if (!wechatResult.Success) { - _logger.LogWarning("WeChat API failed: {Error}", wechatResult.ErrorMessage); + _logger.LogWarning("[AuthService] 微信API调用失败: {Error}", wechatResult.ErrorMessage); return new LoginResult { Success = false, @@ -95,16 +107,21 @@ public class AuthService : IAuthService User? user = null; if (!string.IsNullOrWhiteSpace(unionId)) { + _logger.LogInformation("[AuthService] 尝试通过unionid查找用户: {UnionId}", unionId); user = await _userService.GetUserByUnionIdAsync(unionId); + _logger.LogInformation("[AuthService] unionid查找结果: {Found}", user != null ? $"找到用户ID={user.Id}" : "未找到"); } if (user == null) { + _logger.LogInformation("[AuthService] 尝试通过openid查找用户: {OpenId}", openId); user = await _userService.GetUserByOpenIdAsync(openId); + _logger.LogInformation("[AuthService] openid查找结果: {Found}", user != null ? $"找到用户ID={user.Id}" : "未找到"); } if (user == null) { // 1.3 用户不存在,创建新用户 + _logger.LogInformation("[AuthService] 用户不存在,开始创建新用户..."); var createDto = new CreateUserDto { OpenId = openId, @@ -116,25 +133,30 @@ public class AuthService : IAuthService }; user = await _userService.CreateUserAsync(createDto); - _logger.LogInformation("New user created via WeChat login: UserId={UserId}, OpenId={OpenId}", user.Id, openId); + _logger.LogInformation("[AuthService] 新用户创建成功: UserId={UserId}, OpenId={OpenId}", user.Id, openId); } else { // 1.4 用户存在,更新unionid(如果之前为空) if (string.IsNullOrWhiteSpace(user.UnionId) && !string.IsNullOrWhiteSpace(unionId)) { + _logger.LogInformation("[AuthService] 更新用户unionid: UserId={UserId}", user.Id); await _userService.UpdateUserAsync(user.Id, new UpdateUserDto { UnionId = unionId }); - _logger.LogInformation("Updated unionid for user: UserId={UserId}", user.Id); + _logger.LogInformation("[AuthService] unionid更新成功"); } } // 1.5 生成JWT Token + _logger.LogInformation("[AuthService] 开始生成JWT Token: UserId={UserId}", user.Id); var token = _jwtService.GenerateToken(user); + _logger.LogInformation("[AuthService] JWT Token生成成功,长度={Length}", token?.Length ?? 0); // 3.6 同时在数据库UserAccount表中存储account_token用于兼容旧系统 + _logger.LogInformation("[AuthService] 更新UserAccount表..."); await CreateOrUpdateAccountTokenAsync(user.Id, token); + _logger.LogInformation("[AuthService] UserAccount更新成功"); - _logger.LogInformation("WeChat login successful: UserId={UserId}", user.Id); + _logger.LogInformation("[AuthService] 微信登录成功: UserId={UserId}", user.Id); return new LoginResult { @@ -145,7 +167,8 @@ public class AuthService : IAuthService } catch (Exception ex) { - _logger.LogError(ex, "WeChat login failed for code: {Code}", code); + _logger.LogError(ex, "[AuthService] 微信登录异常: code={Code}, Message={Message}, StackTrace={StackTrace}", + code, ex.Message, ex.StackTrace); return new LoginResult { Success = false, diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/WechatService.cs b/server/HoneyBox/src/HoneyBox.Core/Services/WechatService.cs index 812257d9..e7a61a11 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/WechatService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/WechatService.cs @@ -45,9 +45,11 @@ public class WechatService : IWechatService /// public async Task GetOpenIdAsync(string code) { + _logger.LogInformation("[微信登录] 开始处理,code={Code}", code); + if (string.IsNullOrWhiteSpace(code)) { - _logger.LogWarning("GetOpenIdAsync called with empty code"); + _logger.LogWarning("[微信登录] code为空"); return new WechatAuthResult { Success = false, @@ -57,16 +59,28 @@ public class WechatService : IWechatService try { + // 记录配置信息(脱敏) + var maskedAppId = _wechatSettings.AppId?.Length > 8 + ? $"{_wechatSettings.AppId.Substring(0, 4)}****{_wechatSettings.AppId.Substring(_wechatSettings.AppId.Length - 4)}" + : "未配置"; + var maskedSecret = string.IsNullOrEmpty(_wechatSettings.AppSecret) + ? "未配置" + : $"{_wechatSettings.AppSecret.Substring(0, 4)}****"; + _logger.LogInformation("[微信登录] 配置信息: AppId={AppId}, AppSecret={AppSecret}", maskedAppId, maskedSecret); + var url = $"{WechatCodeToSessionUrl}?appid={_wechatSettings.AppId}&secret={_wechatSettings.AppSecret}&js_code={code}&grant_type=authorization_code"; - _logger.LogInformation("Calling WeChat API to get openid for code: {Code}", code); + _logger.LogInformation("[微信登录] 调用微信API: {Url}", WechatCodeToSessionUrl); var response = await _httpClient.GetAsync(url); var content = await response.Content.ReadAsStringAsync(); + + _logger.LogInformation("[微信登录] 微信API响应状态码: {StatusCode}", response.StatusCode); + _logger.LogInformation("[微信登录] 微信API响应内容: {Content}", content); if (!response.IsSuccessStatusCode) { - _logger.LogError("WeChat API returned error status {StatusCode}: {Content}", response.StatusCode, content); + _logger.LogError("[微信登录] 微信API返回HTTP错误 {StatusCode}: {Content}", response.StatusCode, content); return new WechatAuthResult { Success = false, @@ -81,7 +95,7 @@ public class WechatService : IWechatService if (root.TryGetProperty("errcode", out var errCode) && errCode.GetInt32() != 0) { var errMsg = root.TryGetProperty("errmsg", out var msg) ? msg.GetString() : "未知错误"; - _logger.LogWarning("WeChat API returned error: {ErrorCode} - {ErrorMessage}", errCode.GetInt32(), errMsg); + _logger.LogWarning("[微信登录] 微信API返回业务错误: errcode={ErrorCode}, errmsg={ErrorMessage}", errCode.GetInt32(), errMsg); return new WechatAuthResult { Success = false, @@ -92,10 +106,16 @@ public class WechatService : IWechatService // 提取openid和unionid var openId = root.TryGetProperty("openid", out var openIdProp) ? openIdProp.GetString() : null; var unionId = root.TryGetProperty("unionid", out var unionIdProp) ? unionIdProp.GetString() : null; + var sessionKey = root.TryGetProperty("session_key", out var sessionKeyProp) ? sessionKeyProp.GetString() : null; + + _logger.LogInformation("[微信登录] 解析结果: openid={OpenId}, unionid={UnionId}, session_key={SessionKey}", + openId ?? "null", + unionId ?? "null", + string.IsNullOrEmpty(sessionKey) ? "null" : "已获取"); if (string.IsNullOrEmpty(openId)) { - _logger.LogError("WeChat API response missing openid"); + _logger.LogError("[微信登录] 微信API响应中缺少openid"); return new WechatAuthResult { Success = false, @@ -103,7 +123,7 @@ public class WechatService : IWechatService }; } - _logger.LogInformation("Successfully retrieved openid from WeChat API"); + _logger.LogInformation("[微信登录] 成功获取openid: {OpenId}", openId); return new WechatAuthResult { @@ -114,7 +134,7 @@ public class WechatService : IWechatService } catch (HttpRequestException ex) { - _logger.LogError(ex, "HTTP request error when calling WeChat API"); + _logger.LogError(ex, "[微信登录] HTTP请求异常: {Message}", ex.Message); return new WechatAuthResult { Success = false, @@ -123,7 +143,7 @@ public class WechatService : IWechatService } catch (JsonException ex) { - _logger.LogError(ex, "JSON parsing error when processing WeChat API response"); + _logger.LogError(ex, "[微信登录] JSON解析异常: {Message}", ex.Message); return new WechatAuthResult { Success = false, @@ -132,7 +152,7 @@ public class WechatService : IWechatService } catch (Exception ex) { - _logger.LogError(ex, "Unexpected error when calling WeChat API"); + _logger.LogError(ex, "[微信登录] 未知异常: {Message}", ex.Message); return new WechatAuthResult { Success = false,