/// <summary>
        /// 在某个action执行之前进行拦截
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            IUserBLL ownerBll = BLLFactory <IUserBLL> .GetBLL("UserBLL");

            //获取当前保存的Session
            HttpContextBase ctx     = filterContext.HttpContext;
            string          Unionid = (string)ctx.Session["Unionid"];
            string          Openid  = (string)ctx.Session["OpenId"];

            //获取请求地址
            string controller = filterContext.RouteData.Values["controller"].ToString();
            string action     = filterContext.RouteData.Values["action"].ToString();

            if (Openid == null || Unionid == null || !ownerBll.Exist(o => o.WeixinUnionId == Unionid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT) ||
                !ownerBll.Exist(o => o.WeixinOpenId == Openid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT))
            {
                string url = HttpContext.Current.Request.Url.ToString();
                ctx.Session["VisitUrl"] = url;
                string oAuthUrl = OAuthApi.GetAuthorizeUrl(ConstantParam.AppId, "http://v.homekeeper.com.cn/WeixinOAuth2/UserInfoCallback", "sarnath", OAuthScope.snsapi_userinfo);
                filterContext.Result = new RedirectResult(oAuthUrl);
            }
            else if (!"WeixinPersonalCenter".Equals(controller) && !"WeixinIdentityBind".Equals(controller) && !"WeixinHome".Equals(controller))
            {
                var owner      = ownerBll.GetEntity(o => o.WeixinUnionId == Unionid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT);
                var userPlaces = owner.UserPlaces.Where(p => p.PropertyPlace.DelFlag == ConstantParam.DEL_FLAG_DEFAULT);
                if (userPlaces.Count() == 0)
                {
                    filterContext.Result = new RedirectResult("/WeixinIdentityBind/AddPlace");
                }
                else if (!"WeixinPropertyNotice".Equals(controller) && userPlaces.Select(p => IsVerified(p.PropertyPlace, p.User)).Count(i => i) == 0)
                {
                    filterContext.Result = new RedirectResult("/WeixinIdentityBind/Index");
                }
            }
            base.OnActionExecuting(filterContext);
        }
        /// <summary>
        /// OAuthScope.snsapi_userinfo方式回调
        /// </summary>
        /// <param name="code"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        public ActionResult UserInfoCallback(string code, string state)
        {
            if (string.IsNullOrEmpty(code))
            {
                return(Content("您拒绝了授权!"));
            }
            if (state != "sarnath")
            {
                //实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证
                return(Content("验证失败!请从正规途径进入!"));
            }
            OAuthAccessTokenResult result = null;

            //通过,用code换取access_token
            try
            {
                result = OAuthApi.GetAccessToken(ConstantParam.AppId, ConstantParam.AppSecret, code);
            }
            catch (Exception ex)
            {
                return(Content(ex.Message));
            }
            if (result.errcode != ReturnCode.请求成功)
            {
                return(Content("错误:" + result.errmsg));
            }
            //下面2个数据也可以自己封装成一个类,储存在数据库中(建议结合缓存)
            //如果可以确保安全,可以将access_token存入用户的cookie中,每一个人的access_token是不一样的
            Session["OAuthAccessTokenStartTime"] = DateTime.Now;
            Session["OAuthAccessToken"]          = result;

            //获取用户详细信息
            try
            {
                OAuthUserInfo userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid);

                IUserBLL ownerBll = BLLFactory <IUserBLL> .GetBLL("UserBLL");

                //如果微信Unionid不存在
                if (!ownerBll.Exist(o => o.WeixinUnionId == userInfo.unionid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT))
                {
                    //随机字符串
                    string str       = "1234567890abcdefghijklmnopqrstuvwxyz";
                    Random r         = new Random();
                    string RandomStr = "";
                    for (int i = 0; i < 16; i++)
                    {
                        RandomStr += str[r.Next(str.Length)].ToString();
                    }
                    T_User user = new T_User()
                    {
                        UserName      = RandomStr,
                        WeixinOpenId  = userInfo.openid,
                        WeixinUnionId = userInfo.unionid
                    };
                    if (userInfo.sex > 0)
                    {
                        user.Gender = userInfo.sex == 1 ? 0 : 1;
                    }
                    ownerBll.Save(user);
                }
                else if (!ownerBll.Exist(o => o.WeixinOpenId == userInfo.openid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT))
                {
                    T_User user = ownerBll.GetEntity(o => o.WeixinUnionId == userInfo.unionid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT);
                    user.WeixinOpenId = userInfo.openid;
                    ownerBll.Update(user);
                }
                var owner = ownerBll.GetEntity(o => o.WeixinUnionId == userInfo.unionid && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT);
                Session["OpenId"]  = owner.WeixinOpenId;
                Session["Unionid"] = owner.WeixinUnionId;
                return(Redirect((string)Session["VisitUrl"]));
            }
            catch (ErrorJsonResultException ex)
            {
                return(Content(ex.Message));
            }
        }
        public JsonResult GetValidateCode(string phoneNum, int actionCode)
        {
            JsonModel jm = new JsonModel();

            try
            {
                //如果是注册(设置手机号)操作获取验证码
                if (actionCode == 0)
                {
                    IUserBLL ownerBll = BLLFactory <IUserBLL> .GetBLL("UserBLL");

                    //如果手机号已存在
                    if (ownerBll.Exist(o => o.Phone == phoneNum && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT))
                    {
                        jm.Msg = APIMessage.PHONE_EXIST;
                        return(Json(jm, JsonRequestBehavior.AllowGet));
                    }
                }
                else if (actionCode == 1)
                {
                    IUserBLL ownerBll = BLLFactory <IUserBLL> .GetBLL("UserBLL");

                    //如果手机号对应用户不存在
                    if (!ownerBll.Exist(o => o.Phone == phoneNum && o.DelFlag == ConstantParam.DEL_FLAG_DEFAULT))
                    {
                        jm.Msg = APIMessage.PHONE_NO_EXIST;
                        return(Json(jm, JsonRequestBehavior.AllowGet));
                    }
                }
                string code = PropertyUtils.CreateValidateCode(6);
                string msg  = "感谢使用【Ai我家】微信公众号,验证码为:" + code + ",请在页面输入完成验证,如非本人操作请忽略";
                //如果短信发送成功
                if (PropertyUtils.SendSMS(phoneNum, msg, null))
                {
                    IPhoneValidateBLL phoneValidateBll = BLLFactory <IPhoneValidateBLL> .GetBLL("PhoneValidateBLL");

                    var phoneValidate = phoneValidateBll.GetEntity(v => v.PhoneNum == phoneNum && v.ActionCode == actionCode);
                    //如果该手机号在相同操作中不存在
                    if (phoneValidate == null)
                    {
                        T_PhoneValidate v = new T_PhoneValidate()
                        {
                            PhoneNum     = phoneNum,
                            ValidateCode = code,
                            InvalidTime  = DateTime.Now.AddMinutes(Convert.ToInt32(PropertyUtils.GetConfigParamValue("ValidateCodeInvalid"))),
                            ActionCode   = actionCode
                        };
                        phoneValidateBll.Save(v);
                    }
                    else
                    {
                        phoneValidate.ValidateCode = code;
                        phoneValidate.InvalidTime  = DateTime.Now.AddMinutes(Convert.ToInt32(PropertyUtils.GetConfigParamValue("ValidateCodeInvalid")));
                        phoneValidateBll.Update(phoneValidate);
                    }
                }
                else
                {
                    jm.Msg = APIMessage.VALDATE_GET_FAIL;
                }
            }
            catch
            {
                jm.Msg = APIMessage.REQUEST_EXCEPTION;
            }
            return(Json(jm, JsonRequestBehavior.AllowGet));
        }