Beispiel #1
0
        /// <summary>
        /// 根据微信小程序平台提供的解密算法解密数据,推荐直接使用此方法
        /// </summary>
        /// <param name="loginInfo">登陆信息</param>
        /// <returns>用户信息</returns>
        public WechatUserInfo Decrypt(WechatLoginInfo loginInfo)
        {
            if (loginInfo == null)
            {
                return(null);
            }

            if (String.IsNullOrEmpty(loginInfo.code))
            {
                return(null);
            }

            OpenIdAndSessionKey oiask = DecodeOpenIdAndSessionKey(loginInfo);

            if (oiask == null)
            {
                return(null);
            }

            if (!VaildateUserInfo(loginInfo, oiask))
            {
                return(null);
            }

            WechatUserInfo userInfo = Decrypt(loginInfo.encryptedData, loginInfo.iv, oiask.session_key);

            return(userInfo);
        }
Beispiel #2
0
        /// <summary>
        /// 反序列化包含OpenId和SessionKey的Json数据包
        /// </summary>
        /// <param name="code">Json数据包</param>
        /// <returns>包含OpenId和SessionKey的类</returns>
        public OpenIdAndSessionKey DecodeOpenIdAndSessionKey(WechatLoginInfo loginInfo)
        {
            OpenIdAndSessionKey oiask = JsonConvert.DeserializeObject <OpenIdAndSessionKey>(GetOpenIdAndSessionKeyString(loginInfo.code));

            if (!String.IsNullOrEmpty(oiask.errcode))
            {
                return(null);
            }
            return(oiask);
        }
Beispiel #3
0
        /// <summary>
        /// 获取小程序账号信息(推荐使用这个,关注不关注都可以)
        /// </summary>
        /// <param name="loginInfo"></param>
        /// <returns></returns>
        public ActionResult GetInfo1(WechatLoginInfo loginInfo)
        {
            loginInfo.iv            = "8lQK9zSsprNF4nt7EWr28g==";
            loginInfo.code          = " 023nkGR901amAw1KKkV90nGzR90nkGRj";
            loginInfo.encryptedData = "P7Laqsb2NRvDXEc8A2c+6EVUHGdPkX3StB/waXPAkQSeZIK5Qu5L5xKQWgPoJ5nl+RZCZuxpKM6njeuFlfGV1uGTyPiMhOvOInioZI+xv+/Ufgxs7H/YnECc5oc5I78abmdpv/g/kerzUg9TW5tbiYG065HUlXJc+v1wPbhybKgU4PqLAHWpXtU7NPxn6Tsm89nQLJMm8c6QP3/uLckrJmJRMISKAPppuBROfVWDPYhGClsLf00t+SCLIsyVX2GPAOOgIYucXGXyd/9BsiguwkaNUiQRYm2sqwjIqvbWg5AY1Cxi7JWB09JcRJdjU7UG07Vk6juCMgCJ8CRn4XyjUpWfQ2tTP1DvS5bZ5yHcDX8KaZWkt4Is+WcG2kc2JR4exsfftYoDuZ23tRIgS6Ophl23In1epUIwIc65eRcRaCpiLemNt3RPjBnXC90EIKGTRTp1ogrA5teVz/s+TyxCIg==";
            XiaoWeiXinAppDecryptTask _appDecrypt = new XiaoWeiXinAppDecryptTask("wx32506441a78e116c", "c4cc7d0c56eaae726009bcec74d99ab5");

            return(Json(new RequestResultDto()
            {
                Msg = JsonConvert.SerializeObject(_appDecrypt.Decrypt(loginInfo)), Ret = 0
            }, JsonRequestBehavior.AllowGet));
        }
Beispiel #4
0
        public async Task <WechatUserInfo> WeChatAuthenticate([FromBody] WechatLoginInfo model)
        {
            var c = new WeChatAppDecrypt("wx3462f1fc533ebe71", "a3f39a8d450d822d232eb9ae2c43fc78");
            var r = c.Decrypt(model);

            if (r == null)
            {
                throw new UserFriendlyException("微信认证失败");
            }
            var customer = await _customerAppService.GetCustomerByKeyAsync(new EntityDto <string>(r.openId));

            if (customer == null)
            {
                return(r);
            }
            r.hasRegister = true;
            r.CustomerId  = customer.Id;
            r.Family      = customer.Family;
            r.Balance     = customer.Balance;
            r.FamilyCode  = customer.FamilyCode;
            r.Title       = customer.Title;
            r.JobsCount   = customer.JobsCount;
            return(r);
        }
Beispiel #5
0
        /// <summary>
        /// 根据微信小程序平台提供的解密算法解密数据,推荐直接使用此方法
        /// </summary>
        /// <param name="loginInfo">登陆信息</param>
        /// <returns>用户信息</returns>
        public WechatUserInfo Decrypt(WechatLoginInfo loginInfo)
        {
            WechatUserInfo userInfo;

            if (loginInfo == null)
            {
                return(null);
            }

            if (string.IsNullOrEmpty(loginInfo.code))
            {
                return(null);
            }

            OpenIdAndSessionKey oiask = DecodeOpenIdAndSessionKey(loginInfo);

            if (oiask == null)
            {
                return(null);
            }

            if (!String.IsNullOrWhiteSpace(oiask.openid) && !string.IsNullOrWhiteSpace(loginInfo.rawData))
            {
                userInfo         = JsonConvert.DeserializeObject <WechatUserInfo>(loginInfo.rawData);
                userInfo.openId  = oiask.openid;
                userInfo.unionId = oiask.unionId;
                return(userInfo);
            }

            //if (!VaildateUserInfo(loginInfo, oiask))
            //    return null;

            userInfo        = Decrypt(loginInfo.encryptedData, loginInfo.iv, oiask.session_key);
            userInfo.openId = oiask.openid;
            return(userInfo);
        }
        public ActionResult Weixin([FromBody] WechatLoginInfo loginInfo)
        {
            var result = _userService.WechatLogin(loginInfo);

            return(Ok(new { success = true, token = result.Item1, message = "登录成功!", data = result.Item2 }));
        }
Beispiel #7
0
 /// <summary>
 /// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效
 /// </summary>
 /// <param name="loginInfo">登陆信息</param>
 /// <param name="sessionKey">从服务端获取的SessionKey</param>
 /// <returns>True:资料有效,False:资料无效</returns>
 public bool VaildateUserInfo(WechatLoginInfo loginInfo, string sessionKey)
 {
     return(VaildateUserInfo(loginInfo.rawData, loginInfo.signature, sessionKey));
 }
Beispiel #8
0
 /// <summary>
 /// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效
 /// </summary>
 /// <param name="loginInfo">登陆信息</param>
 /// <param name="idAndKey">包含OpenId和SessionKey的类</param>
 /// <returns>True:资料有效,False:资料无效</returns>
 public bool VaildateUserInfo(WechatLoginInfo loginInfo, OpenIdAndSessionKey idAndKey)
 {
     return(VaildateUserInfo(loginInfo, idAndKey.session_key));
 }
Beispiel #9
0
        public UserDto PostLogin(LoginPo loginPo)
        {
            var wli = new WechatLoginInfo();

            wli.code          = loginPo.code;
            wli.encryptedData = loginPo.encryptedData;
            wli.iv            = loginPo.iv;
            wli.rawData       = loginPo.rawData;
            wli.signature     = loginPo.signature;

            WechatUserInfo wechatResult = new WeChatAppDecrypt().Decrypt(wli);

            if (wechatResult == null || string.IsNullOrWhiteSpace(wechatResult.openId))
            {
                throw new BizException("授权失败");
            }

            wechatResult.nickName = HttpUtility.UrlEncode(wechatResult.nickName);

            var userInfo = userClient.GetUserByOpenId(wechatResult.openId);

            var userid = 0;

            if (null == userInfo || userInfo.Id <= 0)
            {
                var model = new User()
                {
                    CreateTime       = DateTime.Now,
                    Phone            = wechatResult.phoneNumber,
                    wx_HeadImgUrl    = wechatResult.avatarUrl,
                    wx_NickName      = wechatResult.nickName,
                    wx_OpenID        = wechatResult.openId,
                    wx_UnionID       = wechatResult.unionId,
                    HasAuthenticated = false,
                    RoleName         = "1",
                    Status           = 1
                };
                var obj = userClient.PostUser(model);

                if (obj == null || obj.Id <= 0)
                {
                    throw new BizException("用户新增失败");
                }
                else
                {
                    userid = obj.Id;
                }
            }
            else
            {
                userid = userInfo.Id;
            }

            // 1、获取IdentityServer接口文档
            string userUrl = dynamicMiddleUrl.GetMiddleUrl("https", "UserServices");

            DiscoveryDocumentResponse discoveryDocument = httpClient.GetDiscoveryDocumentAsync(userUrl).Result;

            if (discoveryDocument.IsError)
            {
                Console.WriteLine($"[DiscoveryDocumentResponse Error]: {discoveryDocument.Error}");
            }

            // 2、根据用户名和密码建立token
            TokenResponse tokenResponse = httpClient.RequestPasswordTokenAsync(new PasswordTokenRequest()
            {
                Address      = discoveryDocument.TokenEndpoint,
                ClientId     = "client-password",
                ClientSecret = "secret",
                GrantType    = "password",
                UserName     = userid.ToString(),
                Password     = userInfo.Phone
            }).Result;

            // 3、返回AccessToken
            if (tokenResponse.IsError)
            {
                throw new BizException(tokenResponse.Error + "," + tokenResponse.Raw);
            }

            // 4、获取用户信息
            UserInfoResponse userInfoResponse = httpClient.GetUserInfoAsync(new UserInfoRequest()
            {
                Address = discoveryDocument.UserInfoEndpoint,
                Token   = tokenResponse.AccessToken
            }).Result;

            // 5、返回UserDto信息
            UserDto userDto = new UserDto();

            userDto.UserId      = userInfoResponse.Json.TryGetString("sub");
            userDto.UserName    = loginPo.UserName;
            userDto.AccessToken = tokenResponse.AccessToken;
            userDto.ExpiresIn   = tokenResponse.ExpiresIn;

            return(userDto);
        }