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