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

Jacinth 2018-05-14

流程图

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

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

public class BaseController : Controller
     {
         public string openid
         {
             get {
                 return Session["openid"].ToString();
             }
             set {
                 Session["openid"] = value;
             }
         }
 
     }

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

public class HomeController : BaseController
     {
         // GET: Home
         public ActionResult Login()
         {
             if (string.IsNullOrEmpty(openid)) //openid不存在  跳转授权
             {
                 //此处忽略10万行授权相关代码
             }
             //此处忽略3000行获取用户信息相关
             return View();
         }
     }

以上为一个大概 忽略大部分无关紧要代码后的微信授权登录功能代码 当然很多人要的都不是这些 接下来 是一些更详细的代码 大概分为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 切 整个授权过程到次结束

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

相关推荐