基于ASP.NET MVC 微信网页登录授权(scope为snsapi_base) 流程 上 获取OPENID

流程图

 

 我们需要判断是否存在OPENID  首先我们得先定义一个全局的OPENID 类似于普通账号密码登录系统的 当前登录用户ID  因为我是MVC 框架  我这里定义一个控制器基类 BaseController 然后将OPENID定义在BaseController中

 1  public class BaseController : Controller
 2     {
 3         public string openid
 4         {
 5             get {
 6                 return Session["openid"].ToString();
 7             }
 8             set {
 9                 Session["openid"] = value;
10             }
11         }
12 
13     }

 然后定义一个HomeController   写一个 测试登录功能

 1     public class HomeController : BaseController
 2     {
 3         // GET: Home
 4         public ActionResult Login()
 5         {
 6             if (string.IsNullOrEmpty(openid)) //openid不存在  跳转授权
 7             {
 8                 //此处忽略10万行授权相关代码
 9             }
10             //此处忽略3000行获取用户信息相关
11             return View();
12         }
13     }

 以上为一个大概 忽略大部分无关紧要代码后的微信授权登录功能代码     当然很多人要的都不是这些  接下来 是一些更详细的代码  大概分为2个大模块

  1. 获取OPENID 
  2. 获取用户信息

这里我将这2个模块写成2个方法定义在WXHelper类中

    public class WXHelper {
        public string GetOpenID() {
            return "openid";
        }
        public User_UserInfo GetUserInfo() {
            User_UserInfo model_UserInfo = new User_UserInfo();

            return model_UserInfo;
        }
    }

 

然后之前的Login Action 可以改成这样

        public ActionResult Login()
        {
            if (string.IsNullOrEmpty(openid)) //openid不存在  跳转授权
            {
                openid = WXHelper.GetOpenID();
            }
            //LoginUserInfo 是我当前登录用户信息  你们自行找方式存 Session 或者全局变量之类的
            LoginUserInfo = WXHelper.GetUserInfo();
            return View();
        }

下面我们开始实现第一个方法    GetOpenID  官方API

这里具体请求我就不 多说了   主意 几个地方  这里我是采用的 方式为 scope=snsapi_base  

因为这里回调地址 无法写本地地址进行调试 所以我采用 手动记录code  并在有效期内手动在本地写入code 继续往下调试

不情愿的贴上代码

        /// <summary>
        /// 获取code 方法
        /// </summary>
        private static void GetWeChat_Code()
        {
            string urlhead = "https://";
            string rediretUrl = "https%3a%2f%2fxxxx.com%2fHome%2fLoadCode";
            string strUrl = $"{urlhead}open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={rediretUrl}&response_type=code&scope=snsapi_base&state=qwe12e12e#wechat_redirect";
            //此处省略n行get请求方法
        }    

 

细心的朋友可能会发现上面的redireUrl 地址指向的是Home 控制器下面 LoadCode 这个 方法  SO

       #region 微信授权回调
        public ActionResult LoadCode(string code, string state)
        {
            return View();
        }
        #endregion

 

因为MVC 的参数映射 所以我只需要把 code  和state  写成方法参数即可 这里我就可以获取到code方法了 然后我们直接通过code 获取OPENID 

        #region 获取OpenID

        public static string GetOpenId(string code)
        {
            string urlhead = "https://";
            string strUrl = $"{urlhead}api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code";
            Access_openid token = new Access_openid();
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);  //用GET形式请求指定的地址 
            req.Method = "GET";

            using (WebResponse wr = req.GetResponse())
            {
                //HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();  
                StreamReader reader = new StreamReader(wr.GetResponseStream(), Encoding.UTF8);
                string content = reader.ReadToEnd();
                reader.Close();
                reader.Dispose();

                //在这里对Access_token 赋值  
                token = JsonConvert.DeserializeObject<Access_openid>(content);
            }
            return token.openid;
        }

        #endregion

 

如果有人对这个Access_openid 对象感到懵逼的话  这里说一下 这个对象就是下图中 红框 获取到的JSON数据 的对象 这里我们是  snsapi_base  所以只需要 openid 切 整个授权过程到次结束

 

posted @ 2018-05-14 22:36 SuiTao 阅读(...) 评论(...) 编辑 收藏