/// <summary>
        ///微信网页授权回调
        ///如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
        ///若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
        ///http://mp.weixin.qq.com/wiki/9/01f711493b5a02f24b04365ac5d8fd95.html
        /// </summary>
        /// <returns></returns>
        public ActionResult OAuthCallback()
        {
            _log.Write("微信网页授权接口发起回调", HttpContext.Request.Url.ToString(), TraceEventType.Verbose);

            string code  = HttpContext.Request.QueryString["code"];
            string state = HttpContext.Request.QueryString["state"];

            //完成网页鉴权后要转回的页面地址
            string redirectUrl = null;

            if (String.IsNullOrEmpty(state) == false)
            {
                redirectUrl = Server.UrlDecode(state);
            }
            else
            {
                _log.Write("没有指定完成网页鉴权后要转回的页面地址: state", TraceEventType.Warning);
                return(new HttpStatusCodeResult(404));
            }

            string domainId = HttpContext.Request.QueryString["domainId"];

            if (String.IsNullOrEmpty(domainId))
            {
                _log.Write("没有指定 domainId ", TraceEventType.Warning);
                return(new HttpStatusCodeResult(404));
            }

            DomainContext domainContext = _domainPool.GetDomainContext(Guid.Parse(domainId));

            if (domainContext == null)
            {
                _log.Write("指定的 domainId 不存在", TraceEventType.Warning);
                return(new HttpStatusCodeResult(404));
            }

            if (String.IsNullOrEmpty(code))
            {
                //重定向到错误页面
                return(new RedirectResult(String.Format(
                                              "~/Home/ErrorView/{0}?message={1}", domainContext.Domain.Id, "td1")));
            }

            //domainContext.AppSecret
            RequestApiResult <WeixinWebAccessTokenResult> getWebAccessToken =
                TokenApi.GetWebAccessToken(domainContext.AppId, "domainContext.AppSecret", code);

            if (getWebAccessToken.Success == false)
            {
                _log.Write("请求网页AccessToken失败。", getWebAccessToken.Message, TraceEventType.Warning);
                //重定向到错误页面
                return(new RedirectResult(String.Format(
                                              "~/Home/ErrorView/{0}?message={1}", domainContext.Domain.Id, "td2")));
            }

            //此处拿到OpenId了,接下来判断该用户是否是已关注用户
            RequestApiResult <WeixinUser> getUserInfoResult =
                UserApiWrapper.GetUserInfo(domainContext, getWebAccessToken.ApiResult.OpenId);

            if (getUserInfoResult.Success == false)
            {
                //重定向到错误页面
                return(new RedirectResult(String.Format(
                                              "~/Home/ErrorView/{0}?message={1}", domainContext.Domain.Id, "td3")));
            }

            //值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
            //跳转到引导关注页面
            if (getUserInfoResult.ApiResult.Subscribe == 0)
            {
                //用户取消关注有消息推送
                //在那时设置member中是否在关注为false
                //重定向到提示关注页面
                return(new RedirectResult("~/Home/GuideSubscribe/" + domainContext.Domain.Id));
            }

            //根据OpenId获取用户信息
            MemberEntity member = _memberManager.GetMemberByOpenId(domainContext.Domain.Id, getUserInfoResult.ApiResult.OpenId);

            if (member == null)
            {
                //添加新用户
                member = _memberManager.AddMember(domainContext, getUserInfoResult.ApiResult);
            }
            else
            {
                //更新当前用户信息
                _memberManager.UpdateMember(member, getUserInfoResult.ApiResult);
            }

            MemberContext memberContext = new MemberContext(member);

            SessionContainer.SetMemberContext(HttpContext, memberContext);

            //转回初始业务页面
            return(new RedirectResult(redirectUrl));
        }