From 91bebd62f70a33c20a0a8880cfc0b2e99a9cc487 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期一, 11 八月 2025 14:16:00 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs | 148 +++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 125 insertions(+), 23 deletions(-) diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs index 11c64e3..6319fcd 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; @@ -24,7 +25,9 @@ IRequestHandler<PasswordLoginCommand, LoginCommandCallback>, IRequestHandler<SmsLoginCommand, LoginCommandCallback>, IRequestHandler<WxmpLoginCommand, LoginCommandCallback>, - IRequestHandler<BindPhoneNumberCommand, bool> + IRequestHandler<BindWxmpUserInfoCommand, LoginCommandCallback>, + IRequestHandler<ChangePhoneNumberCommand, bool>, + IRequestHandler<RegisterPersonalUserCommand, bool> { private readonly IRepository<User> rep = rep; private readonly SmsUtils smsUtils = smsUtils; @@ -66,19 +69,6 @@ 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) @@ -118,12 +108,114 @@ } /// <summary> - /// 缁戝畾鎵嬫満鍙� + /// 鏇存崲鎵嬫満鍙� /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> - public async Task<bool> Handle(BindPhoneNumberCommand request, CancellationToken cancellationToken) + public async Task<bool> Handle(ChangePhoneNumberCommand request, CancellationToken cancellationToken) + { + await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel + { + PhoneNumber = request.PhoneNumber, + VerifyCode = request.VerifyCode, + TemplateCode = EnumSmsTemplateCode.UpdateUserPhoneNumber + }); + var logier = JwtUtils.GetCurrentLogier(); + var user = await rep.AsQueryable() + .FirstOrDefaultAsync(it => it.Id == logier.Id); + if (user == null) + throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿涓嶅瓨鍦�"); + + var exist = await rep.AsQueryable() + .Where(it => it.Type == logier.Type && it.PhoneNumber == request.PhoneNumber && it.Id != user.Id) + .AnyAsync(cancellationToken); + if (exist) throw Oops.Oh(EnumUserErrorCodeType.u1010); + + 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> + /// 娉ㄥ唽涓汉璐﹀彿 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<bool> Handle(RegisterPersonalUserCommand request, CancellationToken cancellationToken) { await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel { @@ -131,14 +223,22 @@ 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; + .FirstOrDefaultAsync(it => it.Type == EnumUserType.Personal && it.UserName == request.PhoneNumber); + if (user != null) + throw Oops.Oh(EnumUserErrorCodeType.u1010); + + user = new User + { + Type = EnumUserType.Personal, + UserName = request.PhoneNumber, + PhoneNumber = request.PhoneNumber, + IsCheckPhoneNumber = true, + Level = 1, + Status = EnumUserStatus.Normal + }; + await rep.InsertAsync(user); + return true; } @@ -166,8 +266,10 @@ return new LoginCommandCallback { + Id = logier.Id, AccessToken = logier.AccessToken, RefreshToken = logier.RefreshToken, + IsBindPhoneNumber = logier.PhoneNumber.IsNotNull() }; } } -- Gitblit v1.9.1