From 1ed646654c13e57e452e31e60331e0bfafa8a026 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期一, 11 八月 2025 13:52:49 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs | 151 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 149 insertions(+), 2 deletions(-) diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs index dad1665..71a666a 100644 --- a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; @@ -19,12 +20,17 @@ /// </summary> public class LoginCommandHandler( IRepository<User> rep, - SmsUtils smsUtils) : + SmsUtils smsUtils, + WxmpUtils wxmpUtils) : IRequestHandler<PasswordLoginCommand, LoginCommandCallback>, - IRequestHandler<SmsLoginCommand, LoginCommandCallback> + IRequestHandler<SmsLoginCommand, LoginCommandCallback>, + IRequestHandler<WxmpLoginCommand, LoginCommandCallback>, + IRequestHandler<BindWxmpUserInfoCommand, LoginCommandCallback>, + IRequestHandler<BindPhoneNumberCommand, bool> { private readonly IRepository<User> rep = rep; private readonly SmsUtils smsUtils = smsUtils; + private readonly WxmpUtils wxmpUtils = wxmpUtils; /// <summary> /// 瀵嗙爜鐧诲綍 @@ -62,11 +68,151 @@ var user = await rep.AsQueryable().AsNoTracking() .Where(it => it.UserName == request.PhoneNumber && it.Type == request.Type) .FirstOrDefaultAsync(cancellationToken); + if (user == null && request.Type == EnumUserType.Personal) + { + user = new User + { + Type = request.Type, + UserName = request.PhoneNumber, + PhoneNumber = request.PhoneNumber, + IsCheckPhoneNumber = true, + Level = 1, + Status = EnumUserStatus.Normal + }; + await rep.InsertAsync(user); + } if (user == null) throw Oops.Oh(EnumUserErrorCodeType.u1000); if (user.Status == EnumUserStatus.Disabled) throw Oops.Oh(EnumUserErrorCodeType.u1001); return GetCurrentLogier(user, request.ClientType); + } + + /// <summary> + /// 寰俊灏忕▼搴忕櫥褰� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<LoginCommandCallback> Handle(WxmpLoginCommand request, CancellationToken cancellationToken) + { + var snsJscode2session = await wxmpUtils.SnsJscode2sessionAsync(request.Type, request.Code, cancellationToken); + var user = await rep.AsQueryable().AsNoTracking() + .Where(it => it.WxmpOpenId == snsJscode2session.openid && it.Type == request.Type) + .FirstOrDefaultAsync(cancellationToken); + if (user == null && request.Type == EnumUserType.Personal) + { + user = new User + { + Type = request.Type, + UserName = snsJscode2session.openid, + WxmpOpenId = snsJscode2session.openid, + Level = 1, + Status = EnumUserStatus.Normal + }; + await rep.InsertAsync(user); + } + if (user == null) + throw Oops.Oh(EnumUserErrorCodeType.u1000); + if (user.Status == EnumUserStatus.Disabled) + throw Oops.Oh(EnumUserErrorCodeType.u1001); + return GetCurrentLogier(user, EnumClientType.Wxmp); + } + + /// <summary> + /// 缁戝畾鎵嬫満鍙� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<bool> Handle(BindPhoneNumberCommand request, CancellationToken cancellationToken) + { + await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel + { + PhoneNumber = request.PhoneNumber, + VerifyCode = request.VerifyCode, + TemplateCode = EnumSmsTemplateCode.LoginOrRegister + }); + var logier = JwtUtils.GetCurrentLogier(); + var user = await rep.AsQueryable() + .FirstOrDefaultAsync(it => it.Id == logier.Id); + if (user == null) + throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿涓嶅瓨鍦�"); + user.UserName = request.PhoneNumber; + user.PhoneNumber = request.PhoneNumber; + user.IsCheckPhoneNumber = true; + return true; + } + + /// <summary> + /// 缁戝畾寰俊灏忕▼搴忕敤鎴蜂俊鎭� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + /// <exception cref="NotImplementedException"></exception> + public async Task<LoginCommandCallback> Handle(BindWxmpUserInfoCommand request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var user = await rep.AsQueryable() + .Where(it => it.Type == logier.Type && it.Id == logier.Id) + .FirstOrDefaultAsync(cancellationToken); + if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿"); + if (user.WxmpOpenId.IsNull()) throw Oops.Oh(EnumUserErrorCodeType.u1100); + + if (user.PhoneNumber.IsNull()) + { + var result = string.Empty; + RijndaelManaged rijalg = new RijndaelManaged(); + rijalg.KeySize = 128; + rijalg.Padding = PaddingMode.PKCS7; + rijalg.Mode = CipherMode.CBC; + rijalg.Key = Convert.FromBase64String(request.SessionKey); + rijalg.IV = Convert.FromBase64String(request.Iv); + byte[] encryptedData = Convert.FromBase64String(request.EncryptedData); + ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV); + using (MemoryStream msDecrypt = new MemoryStream(encryptedData)) + { + using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) + { + using (StreamReader srDecrypt = new StreamReader(csDecrypt)) + { + result = srDecrypt.ReadToEnd(); + } + } + } + var info = result.JsonTo<BindWxmpUserInfoCommandEncryptedData>(); + if (info == null || info.PhoneNumber.IsNull()) + { + throw Oops.Oh(EnumUserErrorCodeType.u1110); + } + + var bindPhoneNumberUser = await rep.AsQueryable() + .Where(it => it.Type == logier.Type && it.PhoneNumber == info.PhoneNumber && it.Id != user.Id) + .FirstOrDefaultAsync(cancellationToken); + if (bindPhoneNumberUser == null) + { + user.PhoneNumber = info.PhoneNumber; + user.ContactPhoneNumber = info.PhoneNumber; + user.IsCheckPhoneNumber = true; + + if (user.UserName == user.WxmpOpenId) + { + user.UserName = info.PhoneNumber; + } + } + else if (bindPhoneNumberUser.WxmpOpenId.IsNull()) + { + bindPhoneNumberUser.WxmpOpenId = user.WxmpOpenId; + await rep.DeleteAsync(user); + return GetCurrentLogier(bindPhoneNumberUser, EnumClientType.Wxmp); + } + else if (bindPhoneNumberUser.WxmpOpenId != user.WxmpOpenId) + { + throw Oops.Oh(EnumUserErrorCodeType.u1120); + } + } + return GetCurrentLogier(user, EnumClientType.Wxmp); } /// <summary> @@ -93,6 +239,7 @@ return new LoginCommandCallback { + Id = logier.Id, AccessToken = logier.AccessToken, RefreshToken = logier.RefreshToken, }; -- Gitblit v1.9.1