| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Security.Cryptography; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | |
| | | IRequestHandler<PasswordLoginCommand, LoginCommandCallback>, |
| | | IRequestHandler<SmsLoginCommand, LoginCommandCallback>, |
| | | IRequestHandler<WxmpLoginCommand, LoginCommandCallback>, |
| | | IRequestHandler<BindWxmpUserInfoCommand, LoginCommandCallback>, |
| | | IRequestHandler<BindPhoneNumberCommand, bool> |
| | | { |
| | | private readonly IRepository<User> rep = rep; |
| | |
| | | } |
| | | |
| | | /// <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="user"></param> |