mirror of
http://git.coreshop.cn/jianweie/coreshoppro.git
synced 2025-12-06 17:43:26 +08:00
【新增】增加对接微信公众号通过code换取网页授权access_token,并存储微信用户数据方法。
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user