public static QQConnectProfile From(string issuer, TokenResponse token, OpenIdResponse openId, UserResponse user) { if (issuer == null) { throw new ArgumentNullException(nameof(issuer)); } if (token == null) { throw new ArgumentNullException(nameof(token)); } if (openId == null) { throw new ArgumentNullException(nameof(openId)); } if (user == null) { throw new ArgumentNullException(nameof(user)); } return(new QQConnectProfile { Issuer = issuer, ClientId = openId.ClientId, OpenId = openId.OpenId, NickName = user.NickName, Avatar = user.Avatar, AccessToken = token.AccessToken, RefreshToken = token.RefreshToken, ExpiresIn = int.Parse(token.ExpiresIn) }); }
/// <summary> /// 把解密的数据转成字符串,方便出现异常可能通过此数据进行调试 /// <para>作 者:蔡亚康</para> /// <para>创建时间:2019-03-18</para> /// </summary> /// <param name="request">登陆请求数据</param> /// <param name="openid">用户的OPENID信息</param> /// <returns></returns> private string GetDecryptData(StudentLoginRequest request, OpenIdResponse openid) { StringBuilder sbMsg = new StringBuilder(); sbMsg.Append(JsonConvert.SerializeObject(request)); sbMsg.Append(JsonConvert.SerializeObject(openid)); return(sbMsg.ToString()); }
public async Task <OpenIdResponse> GetOpenIdAsync(string accessToken, CancellationToken cancellationToken) { var openIdUrl = _options.BuildOpenIdUrl(accessToken); var response = await GetStringAsync(openIdUrl, cancellationToken); return(OpenIdResponse.From(response)); }
/// <summary> /// 描述:家校登陆 /// <para>作 者:蔡亚康</para> /// <para>创建时间:2019-03-06</para> /// </summary> /// <param name="request">用户登陆的手机号和验证码等信息</param> /// <exception> /// 异常ID:2->手机号码在系统不存在 /// 异常ID:1->验证码有误 /// 异常ID:6->微信号已被其他手机号绑定 /// 异常ID:7->用户信息数据解密失败 /// </exception> /// <returns>登陆结果</returns> public StudentLoginResponse SignIn(StudentLoginRequest request) { TblHssPassport passport = _repository.Value.GetByUserCode(request.Mobile); StudentLoginResponse result = new StudentLoginResponse(); //1、验证账户是否存在 this.ValidateUserExist(passport); //2、短信验证码校验 this.ValidateSmsCode(request.Mobile, request.SmsCode); //3、获取openid Code2SessionService wxService = new Code2SessionService(); OpenIdResponse openid = wxService.GetOpenId(request.WxCode); //4、检查openid是否已经被其他手机号绑定 TblHssPassport passport2 = _repository.Value.GetByOpenId(openid.OpenId); if (passport2 != null && passport2.OpenId == openid.OpenId && passport2.UserCode != request.Mobile) { throw new BussinessException(ModelType.Hss, 6); } //5、用户数据解密 try { string data = AESHelper.AESDecrypt(request.EncryptedData, openid.Session_Key, request.Iv); JObject wxUserInfo = (JObject)JsonConvert.DeserializeObject(data); //检查返回值是否包含unionID,防止出现异常。 JToken jtoke = null; if (wxUserInfo.TryGetValue("unionId", out jtoke)) { passport.UnionId = jtoke.ToString(); } else { LogWriter.Write(this, "解密数据没有unionID,原数据如下:" + GetDecryptData(request, openid), LoggerType.Warn); } } catch (Exception ex) { LogWriter.Write(this, "小程序解密失败,原数据如下:" + GetDecryptData(request, openid), LoggerType.Error); throw new BussinessException(ModelType.Hss, 7); } //获取到的unionID为空,有可能是用户未允许访问授权 if (string.IsNullOrEmpty(passport.UnionId)) { throw new BussinessException(ModelType.Hss, 8); } //6、绑定openid 并更新最新登陆信息,包括最新的openid passport.OpenId = openid.OpenId;//openid.OpenId; //如果在另外一个微信上登陆将会被新的替换 passport.LastLoginIp = passport.CurrentLoginIp; passport.LastLoginDate = passport.CurrentLoginDate; passport.CurrentLoginIp = request.IpAddress; passport.CurrentLoginDate = DateTime.Now; passport.LoginTimes = passport.LoginTimes + 1; _repository.Value.Update(passport); //6、记录登陆日记 AddOperationLog(passport); //7、返回登陆结果 JwtTokenService tokenService = new JwtTokenService(); result.Token = tokenService.CreateToken(passport); return(result); }