From 3e01e1c307478497b59b3722d2de7314e65d9a37 Mon Sep 17 00:00:00 2001 From: jianweie code Date: Tue, 21 Mar 2023 01:19:21 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AF=B9=E6=8E=A5=E5=BE=AE=E4=BF=A1=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E9=80=9A=E8=BF=87code=E6=8D=A2=E5=8F=96=E7=BD=91?= =?UTF-8?q?=E9=A1=B5=E6=8E=88=E6=9D=83access=5Ftoken=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=BE=AE=E4=BF=A1=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CoreCms.Net.Model/FromBody/FMWxPost.cs | 7 + .../Controllers/UserController.cs | 255 +++++++++++++----- 2 files changed, 189 insertions(+), 73 deletions(-) diff --git a/CoreCms.Net.Model/FromBody/FMWxPost.cs b/CoreCms.Net.Model/FromBody/FMWxPost.cs index 981e125c..ecfb990c 100644 --- a/CoreCms.Net.Model/FromBody/FMWxPost.cs +++ b/CoreCms.Net.Model/FromBody/FMWxPost.cs @@ -25,6 +25,13 @@ namespace CoreCms.Net.Model.FromBody /// [Required(ErrorMessage = "请提交合法数据")] public string code { get; set; } + + + /// + /// 来源类型(对标GlobalEnumVars下的UserAccountTypes) + /// + public int type { get; set; } = 2; + } /// diff --git a/CoreCms.Net.Web.WebApi/Controllers/UserController.cs b/CoreCms.Net.Web.WebApi/Controllers/UserController.cs index dffcc958..75727dad 100644 --- a/CoreCms.Net.Web.WebApi/Controllers/UserController.cs +++ b/CoreCms.Net.Web.WebApi/Controllers/UserController.cs @@ -178,102 +178,211 @@ namespace CoreCms.Net.Web.WebApi.Controllers { try { - var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); - var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); - var request = new SnsJsCode2SessionRequest - { - JsCode = entity.code, - AccessToken = accessToken - }; - var response = await client.ExecuteSnsJsCode2SessionAsync(request, HttpContext.RequestAborted); - if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.请求成功) + if (entity.type == (int)GlobalEnumVars.UserAccountTypes.微信小程序) { - var userInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == response.OpenId); - if (userInfo == null) + var client = _weChatApiHttpClientFactory.CreateWxOpenClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken(); + var request = new SnsJsCode2SessionRequest { - userInfo = new CoreCmsUserWeChatInfo - { - openid = response.OpenId, - type = (int)GlobalEnumVars.UserAccountTypes.微信小程序, - sessionKey = response.SessionKey, - gender = 1, - createTime = DateTime.Now, - unionId = response.UnionId - }; - await _userWeChatInfoServices.InsertAsync(userInfo); - } - else + JsCode = entity.code, + AccessToken = accessToken + }; + + var response = await client.ExecuteSnsJsCode2SessionAsync(request, HttpContext.RequestAborted); + if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.请求成功) { - if (userInfo.sessionKey != response.SessionKey) + var userInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == response.OpenId); + if (userInfo == null) { - await _userWeChatInfoServices.UpdateAsync( - p => new CoreCmsUserWeChatInfo() { sessionKey = response.SessionKey, updateTime = DateTime.Now }, - p => p.openid == userInfo.openid); + userInfo = new CoreCmsUserWeChatInfo + { + openid = response.OpenId, + type = (int)GlobalEnumVars.UserAccountTypes.微信小程序, + sessionKey = response.SessionKey, + gender = 1, + createTime = DateTime.Now, + unionId = response.UnionId + }; + await _userWeChatInfoServices.InsertAsync(userInfo); } - } - - if (userInfo is { userId: > 0 }) - { - var user = await _userServices.QueryByClauseAsync(p => p.id == userInfo.userId); - if (user != null) + else { - if (user.status == (int)GlobalEnumVars.UserStatus.停用) + if (userInfo.sessionKey != response.SessionKey) { - jm.status = false; - jm.msg = "您的账号已经被禁用。"; - return jm; + await _userWeChatInfoServices.UpdateAsync( + p => new CoreCmsUserWeChatInfo() { sessionKey = response.SessionKey, updateTime = DateTime.Now }, + p => p.openid == userInfo.openid); } + } - if (user.isDelete == true) + if (userInfo is { userId: > 0 }) + { + var user = await _userServices.QueryByClauseAsync(p => p.id == userInfo.userId); + if (user != null) { - jm.status = false; - jm.msg = "您的账号已经被禁用。"; - return jm; - } + if (user.status == (int)GlobalEnumVars.UserStatus.停用) + { + jm.status = false; + jm.msg = "您的账号已经被禁用。"; + return jm; + } - var claims = new List { + if (user.isDelete == true) + { + jm.status = false; + jm.msg = "您的账号已经被禁用。"; + return jm; + } + + var claims = new List { new Claim(ClaimTypes.Name, user.nickName), new Claim(JwtRegisteredClaimNames.Jti, user.id.ToString()), new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_permissionRequirement.Expiration.TotalSeconds).ToString(CultureInfo.InvariantCulture)) }; - //用户标识 - var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); - identity.AddClaims(claims); - jm.status = true; - jm.data = new - { - auth = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement), - user - }; - jm.otherData = response.OpenId; + //用户标识 + var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); + identity.AddClaims(claims); + jm.status = true; + jm.data = new + { + auth = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement), + user + }; + jm.otherData = response.OpenId; - //录入登录日志 - var log = new CoreCmsUserLog - { - userId = user.id, - state = (int)GlobalEnumVars.UserLogTypes.登录, - ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1", - createTime = DateTime.Now, - parameters = GlobalEnumVars.UserLogTypes.登录.ToString() - }; - await _userLogServices.InsertAsync(log); + //录入登录日志 + var log = new CoreCmsUserLog + { + userId = user.id, + state = (int)GlobalEnumVars.UserLogTypes.登录, + ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1", + createTime = DateTime.Now, + parameters = GlobalEnumVars.UserLogTypes.登录.ToString() + }; + await _userLogServices.InsertAsync(log); - return jm; + return jm; + } } + //注意:生产环境下SessionKey属于敏感信息,不能进行传输! + //return new JsonResult(new { success = true, msg = "OK", sessionAuthId = sessionBag.Key, sessionKey = sessionBag.SessionKey, data = jsonResult, sessionBag = sessionBag }); + jm.status = true; + jm.data = response.OpenId; + jm.otherData = response.OpenId; + //jm.methodDescription = JsonConvert.SerializeObject(sessionBag); + jm.msg = "OK"; + } + else + { + jm.msg = response.ErrorMessage; } - //注意:生产环境下SessionKey属于敏感信息,不能进行传输! - //return new JsonResult(new { success = true, msg = "OK", sessionAuthId = sessionBag.Key, sessionKey = sessionBag.SessionKey, data = jsonResult, sessionBag = sessionBag }); - jm.status = true; - jm.data = response.OpenId; - jm.otherData = response.OpenId; - //jm.methodDescription = JsonConvert.SerializeObject(sessionBag); - jm.msg = "OK"; } - else + else if (entity.type == (int)GlobalEnumVars.UserAccountTypes.微信公众号) { - jm.msg = response.ErrorMessage; + var client = _weChatApiHttpClientFactory.CreateWeXinClient(); + var accessToken = WeChatCacheAccessTokenHelper.GetWeChatAccessToken(); + + + + var request = new SnsOAuth2AccessTokenRequest() + { + Code = entity.code, + AccessToken = accessToken, + GrantType = "authorization_code" + }; + + var response = await client.ExecuteSnsOAuth2AccessTokenAsync(request, HttpContext.RequestAborted); + if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.请求成功) + { + var userInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == response.OpenId); + if (userInfo == null) + { + userInfo = new CoreCmsUserWeChatInfo + { + openid = response.OpenId, + type = (int)GlobalEnumVars.UserAccountTypes.微信公众号, + sessionKey = response.AccessToken, + gender = 1, + createTime = DateTime.Now, + unionId = response.UnionId + }; + await _userWeChatInfoServices.InsertAsync(userInfo); + } + else + { + if (userInfo.sessionKey != response.AccessToken) + { + await _userWeChatInfoServices.UpdateAsync( + p => new CoreCmsUserWeChatInfo() { sessionKey = response.AccessToken, updateTime = DateTime.Now }, + p => p.openid == userInfo.openid); + } + } + + if (userInfo is { userId: > 0 }) + { + var user = await _userServices.QueryByClauseAsync(p => p.id == userInfo.userId); + if (user != null) + { + if (user.status == (int)GlobalEnumVars.UserStatus.停用) + { + jm.status = false; + jm.msg = "您的账号已经被禁用。"; + return jm; + } + + if (user.isDelete == true) + { + jm.status = false; + jm.msg = "您的账号已经被禁用。"; + return jm; + } + + var claims = new List { + new Claim(ClaimTypes.Name, user.nickName), + new Claim(JwtRegisteredClaimNames.Jti, user.id.ToString()), + new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_permissionRequirement.Expiration.TotalSeconds).ToString(CultureInfo.InvariantCulture)) }; + + //用户标识 + var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); + identity.AddClaims(claims); + jm.status = true; + jm.data = new + { + auth = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement), + user + }; + jm.otherData = response.OpenId; + + //录入登录日志 + var log = new CoreCmsUserLog + { + userId = user.id, + state = (int)GlobalEnumVars.UserLogTypes.登录, + ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1", + createTime = DateTime.Now, + parameters = GlobalEnumVars.UserLogTypes.登录.ToString() + }; + await _userLogServices.InsertAsync(log); + + return jm; + } + } + //注意:生产环境下SessionKey属于敏感信息,不能进行传输! + //return new JsonResult(new { success = true, msg = "OK", sessionAuthId = sessionBag.Key, sessionKey = sessionBag.SessionKey, data = jsonResult, sessionBag = sessionBag }); + jm.status = true; + jm.data = response.OpenId; + jm.otherData = response.OpenId; + //jm.methodDescription = JsonConvert.SerializeObject(sessionBag); + jm.msg = "OK"; + } + else + { + jm.msg = response.ErrorMessage; + } + } + } catch (Exception e) {