热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信公众平台开发之OAuth2.0有什么用

这篇文章主要为大家展示了“微信公众平台开发之OAuth2.0有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起

这篇文章主要为大家展示了“微信公众平台开发之OAuth2.0有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信公众平台开发之OAuth2.0有什么用”这篇文章吧。

理解OAuth3.0

  首先我们通过一张图片来了解一下OAuth3.0的运作模式:

微信公众平台开发之OAuth2.0有什么用

  从上图我们可以看到,整个过程进行了2次“握手”,最终利用授权的AccessToken进行一系列的请求,相关的过程说明如下:

A:由客户端向服务器发出验证请求,请求中一般会携带这些参数

ID标识,例如appId

验证后跳转到的URL(redirectUrl)

状态参数(可选)

授权作用域scope(可选)

响应类型(可选)

B:服务器返回一个grant授权标识(微信默认情况下称之为code),类似于一个一次性的临时字符串密钥。如果在A中提供了redirectUrl,这里服务器会做一次跳转,带上grant和状态参数,访问redirectUrl。

C:客户端的redirectUrl对应页面,凭借grant再次发起请求,这次请求通常会携带一些敏感信息:

ID标识

密码

grant字符串(code)

grant类型(可选,微信中默认为code)

D:服务器验证ID标识、密码、grant都正确之后,返回AccessToken(注意,这里的AccessToken和之前通用接口、高级接口介绍的AccessToken没有关系,不能交叉使用)

E:客户端凭借AccessToken请求一系列的API,在此过程中不再会携带appId,Secret,grant等敏感的信息。

F:服务器返回请求结果。

微信的OAuth3.0使用

  了解了OAuth3.0的基本原理之后,我们来看一下OAuth3.0在微信中是如何运用的。

  假设一个场景:用户进入了一个微信公众账号,随后通过消息中的链接,在微信内嵌浏览器中打开了一个游戏网页,这个游戏需要用户登录并且记录用户的游戏得分。

  这种情况下我们有两种处理方式:

让用户在网页中进行注册、登录(并且每次打开这个网页都可能要重新进行登录,因为微信内置浏览器的COOKIE保存时间非常短),这个当然是个很坑爹的设计。

利用OAuth3.0。在用户进入这个页面的时候,先判断用户是否登录,如果没有,自动跳转到OAuth3.0授权页面,这个页面又自动进行了上述ABCD一系列验证,再通过EF得到用户的OpenId甚至更加详细的信息(包括头像),自动完成登录(或必要的注册)过程,随后用户以登录状态直接进入游戏。

  可以看出,使用OAuth3.0大幅度提高了用户体验,并且可以自动绑定识别用户微信OpenId。

  需要注意的是,上面提到的“OAuth3.0授权页面”还有两种形式:

当请求A中的Scope为snsapi_base时,整个授权过程自动完成,用户的客户端不会有任何中间页面显示,但是授权的结果仅能获取用户的OpenId(不管用户是否已关注,当然如果用户是关注用户,再次利用高级接口中的用户信息接口,利用OpenId获取用户资料也是可以的,只不过绕了几个弯)

当请求A中的Scope为snsapi_userinfo时,需要提供一个授权页面(类似很多网站利用微博账号、QQ号登陆的那种授权),仅当用户同意之后,立即获取到用户的详细信息,这里的用户可以是关注用户,也可以是未关注用户,返回的内容一致。

  也就是说,snsapi_base的方法可以“神不知鬼不觉”地获取用户OpenId,全自动完成登录注册过程,但是信息量有限;snsapi_userinfo需要用户在指定界面上授权之后,自动完成整个过程,这个授权有一个时间段,超过时间后需要重新询问用户。

Senparc.Weixin.MP OAuth3.0接口

  源文件文件夹:Senparc.Weixin.MP/AdvancedAPIs/OAuth

  源代码中相关方法如下:

namespace Senparc.Weixin.MP.AdvancedAPIs
{
    //官方文档:http://mp.weixin.qq.com/wiki/index.php?title=%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code

    /// 
    /// 应用授权作用域
    /// 
    public enum OAuthScope
    {
        /// 
        /// 不弹出授权页面,直接跳转,只能获取用户openid
        /// 
        snsapi_base,
        /// 
        /// 弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
        /// 
        snsapi_userinfo
    }

    public static class OAuth
    {
        /// 
        /// 获取验证地址
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        /// 
        public static string GetAuthorizeUrl(string appId, string redirectUrl, string state, OAuthScope scope, string responseType = "code")
        {
            var url =
                string.Format("https://open.weixin.qq.com/connect/oauth3/authorize?appid={0}&redirect_uri={1}&response_type={2}&scope={3}&state={4}#wechat_redirect",
                                appId, redirectUrl.UrlEncode(), responseType, scope, state);

            /* 这一步发送之后,客户会得到授权页面,无论同意或拒绝,都会返回redirectUrl页面。
             * 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。这里的code用于换取access_token(和通用接口的access_token不通用)
             * 若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
             */
            return url;
        }

        /// 
        /// 获取AccessToken
        /// 
        /// 
        /// 
        /// code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
        /// 
        /// 
        public static OAuthAccessTokenResult GetAccessToken(string appId, string secret, string code, string grantType = "authorization_code")
        {
            var url =
                string.Format("https://api.weixin.qq.com/sns/oauth3/access_token?appid={0}&secret={1}&code={2}&grant_type={3}",
                                appId, secret, code, grantType);

            return CommonJsonSend.Send(null, url, null, CommonJsonSendType.GET);
        }

        /// 
        /// 刷新access_token(如果需要)
        /// 
        /// 
        /// 填写通过access_token获取到的refresh_token参数
        /// 
        /// 
        public static OAuthAccessTokenResult RefreshToken(string appId, string refreshToken, string grantType = "refresh_token")
        {
            var url =
                string.Format("https://api.weixin.qq.com/sns/oauth3/refresh_token?appid={0}&grant_type={1}&refresh_token={2}",
                                appId, grantType, refreshToken);

            return CommonJsonSend.Send(null, url, null, CommonJsonSendType.GET);
        }

        public static OAuthUserInfo GetUserInfo(string accessToken,string openId)
        {
            var url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}",accessToken,openId);
            return CommonJsonSend.Send(null, url, null, CommonJsonSendType.GET);
        }
    }
}

  具体的示例方法见Senparc.Weixin.MP.Sample/Controllers/OAuth3Controller.cs,以及对应视图的代码。

注意点

必须是通过认证的服务号才可以使用OAuth接口。

接口中用到的AccessToken和高级接口(包括通用接口)中用到的AccessToken互不相关,即使他们都是通过相同的AppId和Secret得到的。

目前官方的授权页面不是100%稳定,有时候需要多点几次才能顺利通过,如果发现此类情况,需要做一些判断反复请求,至少在表面上可以不让用户看到错误页面。

出于安全,在使用OAuth3.0之前,需要进入到微信后台的【我的服务】对回调页面的域名进行设置:

微信公众平台开发之OAuth2.0有什么用

微信公众平台开发之OAuth2.0有什么用

以上是“微信公众平台开发之OAuth2.0有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程笔记行业资讯频道!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Thisworkcameoutofthediscussioninhttps://github.com/typesafehub/config/issues/272 ... [详细]
author-avatar
我就是老笨2013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有