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) {