using Common; using Common.Utils; using Common.WX; using Common.WX.Response; using CommonInfrastructure; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using UserService; using UserService.Param; using UserService.Response; using UserService.User; namespace UserApi.Login { [ApiController, Route("api/[controller]")] public class LoginController : BaseController { private readonly IUserService _userService; private readonly WXBaseHelper _weiXinPayHelper; public LoginController(IUserService userService, WXBaseHelper weiXinPayHelper) { _userService = userService; _weiXinPayHelper = weiXinPayHelper; } /// /// 获取 access_token - 获取微信小程序的接口调用凭证 /// [HttpGet("GetAccessToken")] public async Task> GetAccessToken() { var result = await _weiXinPayHelper.GetAccessToken(); if (!result.isok) return this.ToFailResult("登陆失败" + result.msg); else { return this.ToResult(result.accessToken); } } /// /// 登录凭证校验 - 用微信登录 code(js_code) 换取用户的会话信息 /// [HttpGet("GetSessionToken")] public async Task> GetSessionToken(string js_code) { var result = await _weiXinPayHelper.GetAccessTokenByCode(js_code); if (!result.isok) return this.ToFailResult("登陆失败" + result.msg); else { return this.ToResult(result.response); } } private string GetClientIp() { var forwarded = HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (!string.IsNullOrWhiteSpace(forwarded)) return forwarded.Split(',')[0].Trim(); return HttpContext.Connection.RemoteIpAddress?.ToString() ?? ""; } /// /// 注册用户通过微信账号 /// [HttpPost("registerWX")] public async Task> RegisterWX(RegisterUserWeiXinParam param) { var ip = GetClientIp(); var result = await _userService.RegisterWeiXin(param, ip); return this.ToResult(result); } /// /// 注册用户通过短信和验证码 /// [HttpPost("register")] public async Task> Register(RegisterUserParam param) { var ip = GetClientIp(); var result = await _userService.Register(param, ip); if (result.isok) return this.ToResult(result.user); else return this.ToFailResult(result.msg); } /// /// 发送短信验证码 /// [HttpGet("SendMobileCode")] public async Task> SendMobileCode(string mobile) { var result = await _userService.SendMobileCode(mobile); if (result.isok) return this.ToResult(result.msg); else return this.ToFailResult(result.msg); } /// /// 微信用户登陆 /// [HttpGet("LoginWx")] public async Task> LoginWx(string openId) { var ip = GetClientIp(); var result = await _userService.LoginWx(openId, ip); return this.ToResult(result); } /// /// 用户登陆 - 手机号 + 验证码登录 /// [HttpGet("Login")] public async Task> Login(string mobile, string code) { if (string.IsNullOrEmpty(mobile)) return this.ToFailResult("请输入手机号"); if (string.IsNullOrEmpty(code)) return this.ToFailResult("请输入验证码或密码"); if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$")) return this.ToFailResult("手机号格式错误"); var ip = GetClientIp(); var result = await _userService.Login(mobile, code, ip); if (result.isok) return this.ToResult(result.user); else return this.ToFailResult(result.msg); } /// /// 密码登录 - 手机号 + 密码登录 /// [HttpGet("LoginByPassword")] public async Task> LoginByPassword(string mobile, string password) { if (string.IsNullOrEmpty(mobile)) return this.ToFailResult("请输入手机号"); if (string.IsNullOrEmpty(password)) return this.ToFailResult("请输入密码"); if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$")) return this.ToFailResult("手机号格式错误"); var ip = GetClientIp(); var result = await _userService.LoginByPassword(mobile, password, ip); if (result.isok) return this.ToResult(result.user); return this.ToFailResult(result.msg); } /// /// 获取服务器时间 - 返回服务器本地时间与 UTC 时间,用于客户端校准 /// [HttpGet("GetDateTime")] public async Task> GetDateTime() { var now = DateTime.Now; var nowOffset = new DateTimeOffset(now); var utcNow = DateTimeOffset.UtcNow; var nowTimestamp = nowOffset.ToUnixTimeMilliseconds(); var utcNowTimestamp = utcNow.ToUnixTimeMilliseconds(); var localNow = now; return this.ToResult(new DateTimeResponse { Year = localNow.Year, Month = localNow.Month, Day = localNow.Day, Hour = localNow.Hour, Minute = localNow.Minute, Seconds = localNow.Second, MilliSeconds = localNow.Millisecond, DateTime = localNow.ToString("yyyy-MM-dd HH:mm:ss"), Date = localNow.ToString("yyyy-MM-dd"), Time = localNow.ToString("HH:mm:ss"), TimeZone = TimeZoneInfo.Local.DisplayName, DayOfWeek = localNow.DayOfWeek.ToString(), DstActive = TimeZoneInfo.Local.IsDaylightSavingTime(localNow), Timestamp = utcNowTimestamp, Service = "UserApi", DateTimeNow = now.ToString("yyyy-MM-dd HH:mm:ss.fff"), DateTimeNowKind = now.Kind.ToString(), DateTimeNowTimestamp = nowTimestamp, DateTimeOffsetUtcNow = utcNow.ToString("yyyy-MM-dd HH:mm:ss.fff zzz"), DateTimeOffsetUtcNowTimestamp = utcNowTimestamp, DifferenceMs = utcNowTimestamp - nowTimestamp, Container = Environment.MachineName }); } /// /// 修改密码 - 通过短信验证码重置密码 /// [HttpGet("ResetPassword")] public async Task> ResetPassword(string mobile, string password, string code) { if (string.IsNullOrEmpty(mobile)) return this.ToFailResult("请输入手机号"); if (string.IsNullOrEmpty(code)) return this.ToFailResult("请输入验证码"); if (string.IsNullOrEmpty(password)) return this.ToFailResult("请输入新密码"); if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$")) return this.ToFailResult("手机号格式错误"); var result = await _userService.UpdatePassword(mobile, password, code); if (result.isok) return this.ToResult(result.msg); else return this.ToFailResult(result.msg); } } }