FlexJobApi.Core/FlexJobApi.Core.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/FlexJobApi.Core.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Models/UserServer/Auths/Commands/BindWxmpUserInfoCommand.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Web.Entry/Startup.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -26,6 +26,7 @@ <PackageReference Include="MediatR" Version="13.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.7" /> <PackageReference Include="RabbitMQ.Client" Version="6.8.1" /> <PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="9.0.3" /> </ItemGroup> <ItemGroup> FlexJobApi.Core/FlexJobApi.Core.xml
@@ -3911,6 +3911,26 @@ 验证码 </summary> </member> <member name="T:FlexJobApi.Core.BindWxmpUserInfoCommand"> <summary> 绑定微信小程序用户信息 </summary> </member> <member name="P:FlexJobApi.Core.BindWxmpUserInfoCommand.EncryptedData"> <summary> 包括敏感数据在内的完整用户信息的加密数据 </summary> </member> <member name="P:FlexJobApi.Core.BindWxmpUserInfoCommand.Iv"> <summary> 加密算法的初始向量 </summary> </member> <member name="P:FlexJobApi.Core.BindWxmpUserInfoCommand.SessionKey"> <summary> 获取会话密钥 </summary> </member> <member name="T:FlexJobApi.Core.PasswordLoginCommand"> <summary> 密码登录 FlexJobApi.Core/Models/UserServer/Auths/Commands/BindWxmpUserInfoCommand.cs
New file @@ -0,0 +1,58 @@ using MediatR; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 绑定微信小程序用户信息 /// </summary> [Resource([EnumResourceController.Auth])] public class BindWxmpUserInfoCommand : IRequest<LoginCommandCallback> { /// <summary> /// 包括敏感数据在内的完整用户信息的加密数据 /// </summary> [Required] public string EncryptedData { get; set; } /// <summary> /// 加密算法的初始向量 /// </summary> [Required] public string Iv { get; set; } /// <summary> /// 获取会话密钥 /// </summary> [Required] public string SessionKey { get; set; } } public class BindWxmpUserInfoCommandEncryptedData { public string OpenId { get; set; } public string PhoneNumber { get; set; } public string NickName { get; set; } public int Gender { get; set; } public string Language { get; set; } public string City { get; set; } public string Province { get; set; } public string Country { get; set; } public string AvatarUrl { get; set; } public string CountryCode { get; set; } } } 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,6 +25,7 @@ IRequestHandler<PasswordLoginCommand, LoginCommandCallback>, IRequestHandler<SmsLoginCommand, LoginCommandCallback>, IRequestHandler<WxmpLoginCommand, LoginCommandCallback>, IRequestHandler<BindWxmpUserInfoCommand, LoginCommandCallback>, IRequestHandler<BindPhoneNumberCommand, bool> { private readonly IRepository<User> rep = rep; @@ -143,6 +145,77 @@ } /// <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> FlexJobApi.UserServer.Application/EnumUserErrorCodeType.cs
@@ -20,6 +20,22 @@ /// </summary> [ErrorCodeItemMetadata("账号已禁用")] u1001 = 1001, /// <summary> /// 当前账号未绑定微信小程序 /// </summary> [ErrorCodeItemMetadata("当前账号未绑定微信小程序")] u1100 = 1100, /// <summary> /// 手机授权失败 /// </summary> [ErrorCodeItemMetadata("手机授权失败")] u1110 = 1110, /// <summary> /// 已有其他微信绑定该手机号 /// </summary> [ErrorCodeItemMetadata("已有其他微信绑定该手机号")] u1120 = 1120, } } FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -46,6 +46,15 @@ <param name="cancellationToken"></param> <returns></returns> </member> <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.BindWxmpUserInfoCommand,System.Threading.CancellationToken)"> <summary> 绑定微信小程序用户信息 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> <exception cref="T:System.NotImplementedException"></exception> </member> <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType)"> <summary> 获取当前登录用户 @@ -200,6 +209,21 @@ 账号已禁用 </summary> </member> <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1100"> <summary> 当前账号未绑定微信小程序 </summary> </member> <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1110"> <summary> 手机授权失败 </summary> </member> <member name="F:FlexJobApi.UserServer.Application.EnumUserErrorCodeType.u1120"> <summary> 已有其他微信绑定该手机号 </summary> </member> <member name="T:FlexJobApi.UserServer.Application.DeleteMenuCommandHandler"> <summary> 删除菜单 FlexJobApi.Web.Entry/Startup.cs
@@ -62,6 +62,7 @@ options.OperationFilter<CustomOperationIdFilter>(); options.SchemaFilter<EnumSchemaFilter>(); }); services.AddSwaggerGenNewtonsoftSupport(); services.AddControllers() .AddNewtonsoftJson(options =>