当前位置: 首页 > news >正文

基于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 切 整个授权过程到次结束

 

转载于:https://www.cnblogs.com/suitao/p/9038547.html

相关文章:

  • PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
  • composer移除依赖包
  • 在Linux,误删磁盘分区怎么恢复呢【转】
  • 纯html页面中js如何获得项目路径
  • Confluence 6 后台中的选择站点首页
  • 算法18-----判断是否存在符合条件的元素【list】
  • 邪恶的三位一体:机器学习、黑暗网络和网络犯罪
  • sql查询本周,本月数据
  • 生产环境Vmware新增硬盘扩展VG并新建文件系统
  • 通过7个函数解密区块链(附代码)
  • php面试题三
  • CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲
  • kafa单机版环境搭建
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • 100 个网络基础知识普及(上)
  • Angular 2 DI - IoC DI - 1
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js递归,无限分级树形折叠菜单
  • js继承的实现方法
  • Less 日常用法
  • Mac转Windows的拯救指南
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Redash本地开发环境搭建
  • Twitter赢在开放,三年创造奇迹
  • 今年的LC3大会没了?
  • 开源SQL-on-Hadoop系统一览
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 使用权重正则化较少模型过拟合
  • 算法之不定期更新(一)(2018-04-12)
  • 我的zsh配置, 2019最新方案
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​力扣解法汇总946-验证栈序列
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.each()与$(selector).each()
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (10)STL算法之搜索(二) 二分查找
  • (C++)八皇后问题
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计大学生兼职系统
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)jdk与jre的区别
  • (转)大道至简,职场上做人做事做管理
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 药厂业务系统 CPU爆高分析