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);
}
}
}