using LiveForum.Code.Base; using LiveForum.Code.ExceptionExtend; using LiveForum.Code.JwtInfrastructure; using LiveForum.IService.Auth; using LiveForum.IService.Others; using LiveForum.Model.Dto.Auth; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; namespace LiveForum.WebApi.Controllers { /// /// 登录注册相关接口 /// [Route("api/[controller]/[action]")] [ApiController] public class AuthController : ControllerBase { private ILoginService _loginService; private readonly IWechatMiniProgramService _wechatMiniProgramService; /// /// 构造函数 /// /// 登录服务 /// 微信小程序服务 public AuthController(ILoginService loginService, IWechatMiniProgramService wechatMiniProgramService) { _loginService = loginService; _wechatMiniProgramService = wechatMiniProgramService; } /// /// 微信手机号登录(新版) /// [HttpPost] public async Task> WechatPhoneLogin(WechatPhoneLoginReq req) { if (req == null || string.IsNullOrEmpty(req.LoginCode) || string.IsNullOrEmpty(req.PhoneCode)) { throw new ArgumentNullException("请求参数错误"); } // 1. 用 loginCode 换取 openId var loginInfo = await _wechatMiniProgramService.GetLoginInfoByCodeAsync(req.LoginCode); if (!loginInfo.IsSuccessful) { throw new LoginErrorException($"登录失败,获取用户openId失败: {loginInfo.ErrorMessage}"); } // 2. 用 phoneCode 获取手机号 var phoneNumber = await _wechatMiniProgramService.GetPhoneNumberByCodeAsync(req.PhoneCode); if (string.IsNullOrEmpty(phoneNumber)) { throw new LoginErrorException("获取手机号失败,请重试"); } // 3. 执行手机号登录逻辑 var data = await _loginService.WechatPhoneLogin(loginInfo.OpenId, phoneNumber, loginInfo.SessionKey, loginInfo.UnionId); return new BaseResponse(data); } /// /// 微信小程序登录(旧版,保留兼容) /// /// /// [HttpPost] public async Task> WechatMpLogin(WechatLoginReq wechatLogin) { if (wechatLogin == null || string.IsNullOrEmpty(wechatLogin.Code)) { throw new ArgumentNullException("请求参数错误"); } // 使用微信小程序服务获取登录信息 var loginInfo = await _wechatMiniProgramService.GetLoginInfoByCodeAsync(wechatLogin.Code); if (!loginInfo.IsSuccessful) { throw new LoginErrorException($"登录失败,获取用户openId失败: {loginInfo.ErrorMessage}"); } var data = await _loginService.WechatMpLogin(loginInfo.OpenId, loginInfo.SessionKey, loginInfo.UnionId); return new BaseResponse(data); } /// /// 刷新Token /// /// [Authorize] [HttpPost] public async Task> RefreshToken() { var token = await _loginService.RefreshToken(); return new BaseResponse(token); } /// /// 账号密码登录 /// /// 登录请求参数 /// [HttpPost] public async Task> AccountLogin([FromBody] AccountLoginReq request) { if (request == null || string.IsNullOrEmpty(request.Account) || string.IsNullOrEmpty(request.Password)) { throw new ArgumentNullException("请求参数错误"); } var data = await _loginService.AccountLogin(request.Account, request.Password, request.AccountType); return new BaseResponse("登录成功", data); } /// /// 账号密码注册 /// /// 注册请求参数 /// [HttpPost] public async Task> AccountRegister([FromBody] AccountRegisterReq request) { if (request == null || string.IsNullOrEmpty(request.LoginAccount) || string.IsNullOrEmpty(request.Password) || string.IsNullOrEmpty(request.NickName)) { throw new ArgumentNullException("请求参数错误"); } var data = await _loginService.AccountRegister(request.LoginAccount, request.AccountType, request.Password, request.NickName, request.VerifyCode); return new BaseResponse("注册成功", data); } } }