public async Task <int> ExecSendMsgAsync(string accessToken, string data, int s)
        {
            LogHelper.Info("WeChatAppAuthorizeController->ExecSendMsgAsync");
            try
            {
                var a = await ThreadSleepAsync(s);

                accessToken = WeChatAppDecrypt.GetToken();
                //反序列化结果
                WechatToken    tokenModel = JsonConvert.DeserializeObject <WechatToken>(accessToken);
                string         url        = string.Format("https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token={0}", tokenModel.access_token);
                HttpWebRequest hwr        = WebRequest.Create(url) as HttpWebRequest;
                hwr.Method      = "POST";
                hwr.ContentType = "application/x-www-form-urlencoded";
                byte[] payload;
                payload           = System.Text.Encoding.UTF8.GetBytes(data); //通过UTF-8编码
                hwr.ContentLength = payload.Length;
                Stream writer = hwr.GetRequestStream();
                writer.Write(payload, 0, payload.Length);
                writer.Close();
                var    result = hwr.GetResponse() as HttpWebResponse; //此句是获得上面URl返回的数据
                string strMsg = WebResponseGet(result);
                LogHelper.Debug("strMsgAsync:" + strMsg);
            }
            catch (Exception e)
            {
                LogHelper.Debug("strMsgAsyncError:" + e.Message);
            };
            return(1);
        }
        public ActionResult GetToken()
        {
            ResponseMessage msg    = new ResponseMessage();
            var             result = WeChatAppDecrypt.GetToken();

            msg.Status = true;
            msg.Data   = result;
            return(Json(msg, JsonRequestBehavior.AllowGet));
        }
        public ActionResult GetToken()
        {
            LogHelper.Info("WeChatAppAuthorizeController->GetToken");

            ResponseMessage msg    = new ResponseMessage();
            var             result = WeChatAppDecrypt.GetToken();

            msg.Status = true;
            msg.Data   = result;
            return(Json(msg, JsonRequestBehavior.AllowGet));
        }
        public ActionResult <UserBindResModel> GetVisitOpenID(string code)
        {
            try
            {
                UserBindResModel result  = new UserBindResModel();
                WeChatAppDecrypt decrypt = new WeChatAppDecrypt();
                string           openIdAndSessionKeyString = decrypt.GetOpenID(code);
                string           openId = "";

                openId = openIdAndSessionKeyString;
                string msg = string.Empty;
                result.Status = "0";

                //if(openId=="")
                //{
                //     result.BindStatus = "1";
                //     result.OpenID = openId;
                //     msg += "获取openid失败";
                //     result.Msg = msg;
                //     return Ok(result);
                //}
                var userBind_Infos = _loginService.UserBindSearch(openId);


                if (userBind_Infos.Count == 0)
                {
                    result.BindStatus = "0";
                    result.OpenID     = openId;
                    msg       += "用户待绑定";
                    result.Msg = msg;
                }
                else
                {
                    result.BindStatus = "1";
                    result.OpenID     = openId;
                    result.RoleName   = "0";
                    result.Moblie     = userBind_Infos[0].Moblie;
                    result.userId     = userBind_Infos[0].userId;
                    result.passWord   = _loginService.Searchpwd(userBind_Infos[0].userId).UserPwd;
                    msg += "用户已绑定;";
                }
                return(Ok(result));
            }
            catch (Exception ex)
            {
                return(NotFound());
            }
        }
        public ActionResult GetOpenIdAndSessionKeyString(string code)
        {
            ResponseMessage msg = new ResponseMessage();

            msg.Status = true;
            try
            {
                string temp = WeChatAppDecrypt.GetOpenIdAndSessionKeyString(code);
                msg.Data = temp;
            }
            catch (Exception e)
            {
                msg.Status = false;
            }
            return(Json(msg, JsonRequestBehavior.AllowGet));
        }
        public ActionResult GetOpenIdAndSessionKeyString(string code)
        {
            LogHelper.Info("WeChatAppAuthorizeController->GetOpenIdAndSessionKeyString");


            ResponseMessage msg = new ResponseMessage();

            msg.Status = true;
            try
            {
                string temp = WeChatAppDecrypt.GetOpenIdAndSessionKeyString(code);
                msg.Data = temp;
            }
            catch (Exception e)
            {
                msg.Status = false;
                LogHelper.Error($"GetOpenIdAndSessionKeyString:{e.Message}");
            }
            return(Json(msg, JsonRequestBehavior.AllowGet));
        }
Exemple #7
0
 /// <summary>
 /// 获取手机号
 /// </summary>
 /// <param name="session">用户session</param>
 /// <param name="encryptedData">用户信息的加密数据</param>
 /// <param name="iv">加密算法的初始向量</param>
 /// <returns></returns>
 public Stream GetPhoneNumber(string session, string encryptedData, string iv)
 {
     try
     {
         WeChatAppDecrypt wcad  = new WeChatAppDecrypt();
         string           resul = wcad.GetPhoneNumber(session, encryptedData, iv);
         if (!string.IsNullOrEmpty(resul))
         {
             return(new MemoryStream(Encoding.UTF8.GetBytes(resul)));
         }
         else
         {
             return(new MemoryStream(Encoding.UTF8.GetBytes("error")));
         }
     }
     catch (Exception err)
     {
         Logger.Error("GetPhoneNumber Error", err);
         return(new MemoryStream(Encoding.UTF8.GetBytes("error")));
     }
 }
        /// <summary>
        /// 通过code获取微信openid和SessionKey
        /// </summary>
        /// <param name="code">login获取的code</param>
        /// <returns></returns>
        public Stream GetOpenidAndSessionKeyByCode(string code)
        {
            try
            {
                WeChatAppDecrypt wechat = new WeChatAppDecrypt();
                string           openidAndSessionKey = wechat.GetOpenIdAndSessionKeyString(code);

                if (!string.IsNullOrEmpty(openidAndSessionKey))
                {
                    return(new MemoryStream(Encoding.UTF8.GetBytes(openidAndSessionKey)));
                }
                else
                {
                    return(new MemoryStream(Encoding.UTF8.GetBytes("error")));
                }
            }
            catch (Exception err)
            {
                Logger.Error("GetOpenidAndSessionKeyByCode Error", err);
                return(new MemoryStream(Encoding.UTF8.GetBytes("error")));
            }
        }
Exemple #9
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);
        }
Exemple #10
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);
        }
Exemple #11
0
        public ResponseBaseModel <WeChatAuthResponseModel> GetUserOpenId([FromBody] WeChatLoginInfo loginInfo)
        {
            var data = RedisCacheHelper.Get <WeChatAuthResponseModel>(RedisCacheKey.AuthInfoKey + loginInfo.code);

            if (data != null)
            {
                return(new ResponseBaseModel <WeChatAuthResponseModel> {
                    ResultCode = ResponceCodeEnum.Success, Message = "微信认证成功", Data = data
                });
            }

            var weChatCheck = new WeChatAppDecrypt(
                string.IsNullOrEmpty(loginInfo.sys)
                    ? AppConfigurationHelper.GetString("XcxAppID", "")
                    : AppConfigurationHelper.GetString("XcxAppID" + loginInfo.sys),
                string.IsNullOrEmpty(loginInfo.sys)
                    ? AppConfigurationHelper.GetString("XcxAppSecrect", "")
                    : AppConfigurationHelper.GetString("XcxAppSecrect" + loginInfo.sys, ""));
            var openIdAndSessionKeyModel = weChatCheck.DecodeOpenIdAndSessionKey(loginInfo);

            if (openIdAndSessionKeyModel == null)
            {
                return(new ResponseBaseModel <WeChatAuthResponseModel> {
                    ResultCode = ResponceCodeEnum.Fail, Message = "微信认证失败"
                });
            }
            var isValidData = weChatCheck.VaildateUserInfo(loginInfo, openIdAndSessionKeyModel);

            if (!isValidData)
            {
                return(new ResponseBaseModel <WeChatAuthResponseModel> {
                    ResultCode = ResponceCodeEnum.Fail, Message = "请求信息验签失败"
                });
            }
            var responseData = weChatCheck.Decrypt(loginInfo.encryptedData, loginInfo.iv, openIdAndSessionKeyModel.session_key);

            if (responseData == null)
            {
                return(new ResponseBaseModel <WeChatAuthResponseModel> {
                    ResultCode = ResponceCodeEnum.Fail, Message = "微信认证失败"
                });
            }
            var server            = new WechatAccountService();
            var searchOpenIdModel = server.GetByOpenId(responseData.openId);

            //TODO:新的访问者
            if (searchOpenIdModel == null)
            {
                var newModel = new WeChatAccountModel
                {
                    AvatarUrl     = responseData.avatarUrl,
                    CreateTime    = DateTime.Now,
                    Gender        = DataTypeConvertHelper.ToInt(responseData.gender, 1),
                    IsDel         = FlagEnum.HadZore.GetHashCode(),
                    NickName      = responseData.nickName,
                    OpenId        = responseData.openId,
                    Remarks       = "新访问用户",
                    FamilyCode    = "",
                    HadBindFamily = FlagEnum.HadZore
                };
                server.SaveModel(newModel);

                var newSysModel = new SysUser
                {
                    Birthday   = "1900-01-01 00:00:00",
                    CreateTime = DateTime.Now,
                    IsDel      = FlagEnum.HadZore,
                    CreateAuth = 1,
                    HeadUrl    = newModel.AvatarUrl,
                    Password   = AesHelper.AesEncrypt("123456"),
                    Sex        = EnumHelper.GetEnumByValue <SexEnum>(newModel.Gender),
                    UpdateAuth = 1,
                    UpdateTime = DateTime.Now,
                    UserType   = UserTypeEnum.Usually,
                    UserName   = Guid.NewGuid().ToString()
                };
                var accountService = new AccountService();
                var resultId       = accountService.InsertWeChatUserAndBind(newSysModel, newModel.OpenId);
                newModel.AccountId = resultId;
                searchOpenIdModel  = newModel;
            }
            //TODO:未绑定用户,自动注册绑定
            else if (searchOpenIdModel.AccountId < 1)
            {
                var newSysModel = new SysUser
                {
                    Birthday   = "1900-01-01 00:00:00",
                    CreateTime = DateTime.Now,
                    IsDel      = FlagEnum.HadZore,
                    CreateAuth = 1,
                    HeadUrl    = searchOpenIdModel.AvatarUrl,
                    Password   = AesHelper.AesEncrypt("123456"),
                    Sex        = EnumHelper.GetEnumByValue <SexEnum>(searchOpenIdModel.Gender),
                    UpdateAuth = 1,
                    UpdateTime = DateTime.Now,
                    UserType   = UserTypeEnum.Usually,
                    UserName   = Guid.NewGuid().ToString()
                };
                var accountService = new AccountService();
                var resultId       = accountService.InsertWeChatUserAndBind(newSysModel, searchOpenIdModel.OpenId);
                searchOpenIdModel.AccountId = resultId;
            }
            //TODO:更新用户的昵称,头像
            else
            {
                searchOpenIdModel.AvatarUrl  = responseData.avatarUrl;
                searchOpenIdModel.NickName   = responseData.nickName;
                searchOpenIdModel.UpDateTime = DateTime.Now;
                server.SaveModel(searchOpenIdModel);
            }

            //TODO:获取家庭成员信息
            var userIds = new List <long>();

            if (searchOpenIdModel.HadBindFamily == FlagEnum.HadOne &&
                !string.IsNullOrEmpty(searchOpenIdModel.FamilyCode))
            {
                var members = _familyServer.GetFamilyMembers(searchOpenIdModel.FamilyCode);
                if (members != null && members.Count > 0)
                {
                    userIds.AddRange(members.Select(f => f.UserId));
                }
            }

            var weChatMemberList = new List <WeChatAuthResponseModel>();

            if (userIds.Count > 0)
            {
                var weChatMembers = server.Get(userIds);
                if (weChatMembers != null && weChatMembers.Count > 0)
                {
                    weChatMemberList = weChatMembers.Select(f => new WeChatAuthResponseModel
                    {
                        AvatarUrl = f.AvatarUrl,
                        AccountId = f.AccountId,
                        NickName  = f.NickName
                    }).ToList();
                }
            }

            var resultModel = new WeChatAuthResponseModel
            {
                Token            = Guid.NewGuid().ToString(),
                CodeTimeSpan     = responseData.watermark?.timestamp,
                AvatarUrl        = responseData.avatarUrl,
                AccountId        = searchOpenIdModel.AccountId,
                NickName         = responseData.nickName,
                WechatMemberList = weChatMemberList
            };

            //TODO:记录Token信息
            RedisCacheHelper.AddSet(RedisCacheKey.AuthInfoKey + loginInfo.code, resultModel, DateTime.Now.AddHours(2));
            RedisCacheHelper.AddSet(RedisCacheKey.AuthTokenKey + resultModel.Token, searchOpenIdModel, DateTime.Now.AddHours(2));
            return(new ResponseBaseModel <WeChatAuthResponseModel> {
                ResultCode = ResponceCodeEnum.Success, Message = "微信认证成功", Data = resultModel
            });
        }