随笔——mvc公众号自动登录跳转到原页面的方法

页面路径传参跳到那带到哪

1、全局过滤(继承过滤也行)。这里使用的全局过滤

2、过滤判断需要登录的话,获取本次路径传到登录的页面

3、登录的页面判断是微信浏览器的话,参数带到微信登录接口

4、微信登录接口处理后的返回Handle方法不就得到了原页面的URL

上代码

----------------------------------------------------------------------全局过滤begin--------------------------------------------------

 protected void Application_Start()
    {
        //在applicationstart注册过滤类
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
       / /application_start在Global.asax里面。这个知道吧。
    }

    //过滤类有很多全局过滤
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //在FilterConfig中注册全局异常过滤类
            filters.Add(new ExceptionFilter());
            //在FilterConfig中注册全局HTTP过滤类 加粗标红,要考的
            filters.Add(new SupportFilterAttribute());
        }
    }    

  

public class SupportFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string ctlName = filterContext.Controller.ToString();
            string[] routeInfo = ctlName.Split('.');
            string controller = null;
            int ctlIndex = Array.IndexOf(routeInfo, "Controllers");
            controller = routeInfo[ctlIndex].Replace("Controller", "").ToLower();
            if (controller != "login")
            {
                if (filterContext.HttpContext.Session["Account"] == null)
                {
                    //获取当前url
                    string _url = HttpContext.Current.Request.Url.ToString().ToLower();

                    //重定向到登录
                    filterContext.HttpContext.Response.Redirect("/Login/Index?oldurl=" + _url);
                }
            }
        }
    }

----------------------------------------------------------------------全局过滤end--------------------------------------------------

----------------------------------------------------------------------Login页面begin--------------------------------------------------

<script>

    $(function () {
        //看吧,这里获取到原来的路径
        var _oldurl = request("oldurl"); 
        if (_auto != "false") {
            if (wx_or_browser() == 1) {
                layui.use(['layer'], function () {
                    var $ = layui.$;
                    layer.msg('登录中...', {
                        icon: 16
                        , shade: 0.01
                    });
                });
               //是微信浏览器打开的页面。跳转到自动登录
                window.location.href = "/Login/WxWebLogin?oldurl=" + _oldurl;
            }
        }
    })
</script>

//下面是封装的js方法
<script>
//获取前台传值
function request(strParame) {
    var args = new Object();
    var query = location.search.substring(1);
    var pairs = query.split("&"); // Break at ampersand 
    for (var i = 0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('=');
        if (pos == -1) continue;
        var argname = pairs[i].substring(0, pos);
        var value = pairs[i].substring(pos + 1);
        value = decodeURIComponent(value);
        args[argname] = value;
    }
    return args[strParame];
}
 //判断微信浏览器还是别的浏览器 微信浏览器返回1,其他返回2
function wx_or_browser() {
        var ua = navigator.userAgent.toLowerCase();
        var isWeixin = ua.indexOf('micromessenger') != -1;
        if (isWeixin) {//是在微信中打开的
            return 1;
        } else {
            return 2;
        }
    }
</script>     

----------------------------------------------------------------------Login页面end--------------------------------------------------

----------------------------------------------------------------------微信公众号自动登录begin--------------------------------------------------

 //微信浏览器打开的时候,转到这个页面
        public ActionResult WxWebLogin()
        {
            //获取当前域名
            string domainName = ConfigurationManager.AppSettings["DomainName"].ToString();
            //原页面继续传输
            string sysurl = Request.QueryString["oldurl"];

            string redirect_uri = string.Format("http://{0}/Login/WxWebLoginHandle?oldurl={1}", domainName, sysurl);
            string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=snsapi_userinfo_ok#wechat_redirect", WXmodel.appid, redirect_uri);
            Response.Redirect(url);
            return View();
        }
        //公众号获取权限信息后跳转到这里,WxWebLogin方法设置的
        public ActionResult WxWebLoginHandle()
        {
            try
            {

                if (HttpContext.Request.QueryString["state"] != null)
                {
                    
                    string state = HttpContext.Request.QueryString["state"].ToString();
                    string code = HttpContext.Request.QueryString["code"].ToString();
                    //取出原页面地址
                    string oldurl = HttpContext.Request.QueryString["oldurl"].ToString();
    
                    //获取网页token
                    //获取webtoken
                    WxBegin.GetWebToken(code, ref postString);
                    //拉取用户信息
                    string url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", WXmodel.web_access_token, WXmodel.web_openid);
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                    req.Method = "GET";
                    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                    Stream stream = resp.GetResponseStream();
                    string result = "";
                    //获取内容
                    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    {
                        result = reader.ReadToEnd();
                    }

                    string errcode = JSCommon.GetJsonValue(result, "errcode");
                    if (string.IsNullOrEmpty(errcode))
                    {
                      
                        WXUserInfo wxU = JsonHandler.Deserialize<WXUserInfo>(result);
               
                        int i = new Apps.BLL.PhoneLoginBLL().CreateUser(wxU, ref postString);
                        if (i > 0)
                        {
                            tb_User user = new Apps.BLL.PhoneLoginBLL().GetUser(wxU.openid);
                            //自动登录
                            postString += "
user:" + user.openId;
                            AccountModel account = new AccountModel();
                            account.Id = user.guid;
                            account.Photo = user.headimgurl;
                            account.UserName = user.userName;
                            account.LoginSource = "gzh-auto";
                            account.OpenId = user.openId;
                            account.UserType = user.uType;
                            Session["Account"] = account;
                            postString += "
sessionid:" + Session.SessionID;
                            LoginUserManage.Add(Session.SessionID, account.Id);

                            //检查是否有快捷跳转的
                            if (!string.IsNullOrEmpty(oldurl))
                            {
                                Response.Redirect(oldurl);
                            }
                            else
                            {
                                if (user.uType == 1)
                                {
                                    //用户首页
                                    Response.Redirect("/home/index");
                                }
                                else
                                {
                                //别的首页
                                       Response.Redirect("/enjoy/index");
                                }
                            }
                        }
                        else
                        {
                            return Content(@"<script >alert('用户信息拉取失败,正跳转手动登录');
setTimeout(function(){
window.location.href='/Login/index?auto=false';
},300)
</script >");
                        }
                    }
                    else
                    {
                        string a = WxError.WxErrorHadle(result);
                        if (!string.IsNullOrEmpty(a))
                        {
                            throw new Exception(a);
                        }
                    }
                }

            }
            catch (Exception)
            {
                throw;
            }
            return Content("");
        }                                

  

----------------------------------------------------------------------微信公众号自动登录end--------------------------------------------------

原文地址:https://www.cnblogs.com/bklsj/p/13858537.html