【新增】增加对接微信公众号通过code换取网页授权access_token,并存储微信用户数据方法。

This commit is contained in:
jianweie code
2023-03-21 01:19:21 +08:00
parent 36577d2bc9
commit 3e01e1c307
2 changed files with 189 additions and 73 deletions

View File

@@ -25,6 +25,13 @@ namespace CoreCms.Net.Model.FromBody
/// </summary> /// </summary>
[Required(ErrorMessage = "请提交合法数据")] [Required(ErrorMessage = "请提交合法数据")]
public string code { get; set; } public string code { get; set; }
/// <summary>
/// 来源类型对标GlobalEnumVars下的UserAccountTypes
/// </summary>
public int type { get; set; } = 2;
} }
/// <summary> /// <summary>

View File

@@ -178,102 +178,211 @@ namespace CoreCms.Net.Web.WebApi.Controllers
{ {
try 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 (entity.type == (int)GlobalEnumVars.UserAccountTypes.)
if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.)
{ {
var userInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == response.OpenId); var client = _weChatApiHttpClientFactory.CreateWxOpenClient();
if (userInfo == null) var accessToken = WeChatCacheAccessTokenHelper.GetWxOpenAccessToken();
var request = new SnsJsCode2SessionRequest
{ {
userInfo = new CoreCmsUserWeChatInfo JsCode = entity.code,
{ AccessToken = accessToken
openid = response.OpenId, };
type = (int)GlobalEnumVars.UserAccountTypes.,
sessionKey = response.SessionKey, var response = await client.ExecuteSnsJsCode2SessionAsync(request, HttpContext.RequestAborted);
gender = 1, if (response.ErrorCode == (int)WeChatReturnCode.ReturnCode.)
createTime = DateTime.Now,
unionId = response.UnionId
};
await _userWeChatInfoServices.InsertAsync(userInfo);
}
else
{ {
if (userInfo.sessionKey != response.SessionKey) var userInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == response.OpenId);
if (userInfo == null)
{ {
await _userWeChatInfoServices.UpdateAsync( userInfo = new CoreCmsUserWeChatInfo
p => new CoreCmsUserWeChatInfo() { sessionKey = response.SessionKey, updateTime = DateTime.Now }, {
p => p.openid == userInfo.openid); openid = response.OpenId,
type = (int)GlobalEnumVars.UserAccountTypes.,
sessionKey = response.SessionKey,
gender = 1,
createTime = DateTime.Now,
unionId = response.UnionId
};
await _userWeChatInfoServices.InsertAsync(userInfo);
} }
} else
if (userInfo is { userId: > 0 })
{
var user = await _userServices.QueryByClauseAsync(p => p.id == userInfo.userId);
if (user != null)
{ {
if (user.status == (int)GlobalEnumVars.UserStatus.) if (userInfo.sessionKey != response.SessionKey)
{ {
jm.status = false; await _userWeChatInfoServices.UpdateAsync(
jm.msg = "您的账号已经被禁用。"; p => new CoreCmsUserWeChatInfo() { sessionKey = response.SessionKey, updateTime = DateTime.Now },
return jm; 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; if (user.status == (int)GlobalEnumVars.UserStatus.)
jm.msg = "您的账号已经被禁用。"; {
return jm; jm.status = false;
} jm.msg = "您的账号已经被禁用。";
return jm;
}
var claims = new List<Claim> { if (user.isDelete == true)
{
jm.status = false;
jm.msg = "您的账号已经被禁用。";
return jm;
}
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, user.nickName), new Claim(ClaimTypes.Name, user.nickName),
new Claim(JwtRegisteredClaimNames.Jti, user.id.ToString()), new Claim(JwtRegisteredClaimNames.Jti, user.id.ToString()),
new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_permissionRequirement.Expiration.TotalSeconds).ToString(CultureInfo.InvariantCulture)) }; new Claim(ClaimTypes.Expiration, DateTime.Now.AddSeconds(_permissionRequirement.Expiration.TotalSeconds).ToString(CultureInfo.InvariantCulture)) };
//用户标识 //用户标识
var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme); var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
identity.AddClaims(claims); identity.AddClaims(claims);
jm.status = true; jm.status = true;
jm.data = new jm.data = new
{ {
auth = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement), auth = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement),
user user
}; };
jm.otherData = response.OpenId; jm.otherData = response.OpenId;
//录入登录日志 //录入登录日志
var log = new CoreCmsUserLog var log = new CoreCmsUserLog
{ {
userId = user.id, userId = user.id,
state = (int)GlobalEnumVars.UserLogTypes., state = (int)GlobalEnumVars.UserLogTypes.,
ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1", ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null ? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString() : "127.0.0.1",
createTime = DateTime.Now, createTime = DateTime.Now,
parameters = GlobalEnumVars.UserLogTypes..ToString() parameters = GlobalEnumVars.UserLogTypes..ToString()
}; };
await _userLogServices.InsertAsync(log); 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<Claim> {
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) catch (Exception e)
{ {