/// <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)); }