Пример #1
0
        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());
        }
Пример #3
0
        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);
        }