一、前言

昨天小组开了个会,让我今天实现一个微信网页授权的功能,可以让用户在授权之后无需再次登录既可进入用户授权界面。在这之前我也从没接触过微信公众号开发之类的,也不知道公众号后台是啥样子的,自己所在的小组也没有自己的认证公众号,就在这种情况下用一天的实现微信网页授权的功能。

二、准备工作

1.一个怎样的项目

上面也说了我所在的小组没有自己的认证公众号(普通申请的公众号是不会开放高级接口的)也就说自己申请的公众号是无法实现这类功能的。还有一点是我们所要实现的这个微信网页授权并不是针对某个公众号的,而是可以让任意公众号可以绑定我们的程序,自己的公众号并不需要实现微信网页授权这个功能,就可以使用授权功能。

2.技术调研

了解了上面的需求,自然是针对所要用到的技术进行调研了,主要用到就是微信的一些接口,所以我们先到微信公众平台技术文档查找我们需要的资料。主要如下

 

UserAppAuthSerHello, I want authorization。Are you sure?Yes, give me authority!Callback, return code.Request, access_token.return access_token.UserAppAuthSer

1.回调域名

看来上面的示意图我们知道,这个回调域名是在给我们请求网页授权返回code的时候用的。所以开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。

请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头; 另外授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权

2.获取授权

在这里官方提供了两种授权方式"snsapi_base"和"snsapi_userinfo",他们都可以获取用户基本信息,但是既然提供两种方式肯定有不一样的地方。下面就介绍一下

  • 相同点:都可以获取用户的基本信息
  • 不同点:"snsapi_userinfo"发起的网页授权,需要用户手动同意才可以继续(如果用户已关注公众号则为静默模式,像snsapi_base一样不会弹出提示),而"snsapi_base"授权不需要,比前者少了①②两步;"snsapi_userinfo"授权获取用户基本信息不需要关注,而"snsapi_base"授权需要关注才可获取到

注意:上面有一个加粗标识的地方,因为我在这里在了一个跟头。下面为"snsapi_base"未关注公众号时返回的错误提示信息。

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: Ftu8IA0999s106 ]"}

第一步:获取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
redirect_url 授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

下图为scope等于snsapi_userinfo时的授权页面:

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

第二步:通过code换取access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
secret 公众号的appsecret
code 填写第一步获取的code参数
scope 填写为authorization_code

返回说明 - 正确时返回的JSON数据包如下:

{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔

错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

第三步:拉取用户信息

如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。如果网页授权作用域为snsapi_base需要关注后才能拉取用户信息

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

返回说明 - 正确时返回的JSON数据包如下:

{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":"1",
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":[ "PRIVILEGE1" "PRIVILEGE2"],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

参数说明

参数 描述
openid 用户的唯一标识
nickname 用户昵称
sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
province 用户个人资料填写的省份
city 普通用户个人资料填写的城市
country 国家,如中国为CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

错误时微信会返回JSON数据包如下(示例为openid无效):

{"errcode":40003,"errmsg":" invalid openid "}

附录

另外还有"刷新access_token"、"检验授权凭证(access_token)"接口这里就不作说明了,需要了解的可以去查阅官方文档

3.开发

上面我们已经了大概的流程了,自己有认证公众号的人自己就可以尝试开发了,我这边没有公众号所以是从隔壁组借来的一个“appid”然后从他们那儿代理再跳到我这边。什么意思呢?就是回调域名调用的是他们那边的接口,同时我也把自己这边写的一个接口(用来接收OpenId和access_token)带过去,等他那边获取到OpenId和access_token在通过刚才传的那个接口返回给我。这样我这边就得到OpenId和access_token了,我也在这边获取用户基本信息了。

三、常见问题

1.获取不到用户信息 答:你看你是用的是"snsapi_base"方式授权还是"snsapi_userinfo"方式授权,前者需要关注才能获取到用户信息,而后者无需关注也可以获取;也有可能是access_token过期导致获取失败,具体根据返回提示信息判断。

2.关于代理的问题 答:所谓的代理就是回调域名调用的是他们那边的接口,同时我也把自己这边写的一个接口(用来接收OpenId和access_token)带过去,等他那边获取到OpenId和access_token在通过刚才传的那个接口返回给我。这样我这边就得到OpenId和access_token了,我也在这边获取用户基本信息了。

3.微信有缓存怎么办 答:浏览器都有缓存,但是微信清理起来挺麻烦的,我们该怎么解决这类问题?这个和PC中处理的方式一样可以使用时间戳,或者加版本号,通过版本号判断文件是重新拉取还是从缓存中获取

4.两种授权方式有什么不同 答:"snsapi_userinfo"发起的网页授权,需要用户手动同意才可以继续(如果用户已关注公众号则为静默模式,像snsapi_base一样不会弹出提示),而"snsapi_base"授权不需要;"snsapi_userinfo"授权获取用户基本信息不需要关注,而"snsapi_base"授权需要关注才可获取到

上面大概就是我实现"微信网页授权"功能的大致流程,欢迎大家探讨指点。

参考:微信公众平台技术文档

Wechat login authorization(OAuth2.0)的更多相关文章

  1. 那些年,我们开发的接口之:QQ登录(OAuth2.0)

    那些年,我们开发的接口之:QQ登录(OAuth2.0) 吴剑 2013-06-14 原创文章,转载必须注明出处:http://www.cnblogs.com/wu-jian 前言 开发这些年,做过很多 ...

  2. QQ登录(OAuth2.0)

    QQ登录(OAuth2.0) 那些年,我们开发的接口之:QQ登录(OAuth2.0) 吴剑 2013-06-14 原创文章,转载必须注明出处:http://www.cnblogs.com/wujian ...

  3. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  4. 微信公众平台开发——微信授权登录(OAuth2.0)

    1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...

  5. 第三方登录:微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  6. 微信授权登录(OAuth2.0)-- 随记

    1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...

  7. php微信开放平台--第三方网页微信扫码登录(OAuth2.0)

    第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...

  8. 夺命雷公狗---微信开发53----网页授权(oauth2.0)获取用户基本信息接口(3)实现世界留言版

    前面两节课我们讲的是base型的授权了,那么现在我们开始Userinfo型授权, 先来看下我们的原理图 我们这节课来做一个 世界留言版 系统 1..首先我还是在微信测试平台那里设置好回调页面的域名 2 ...

  9. 夺命雷公狗---微信开发51----网页授权(oauth2.0)获取用户基本信息接口(1)

    如果用户在微信客户端访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,从而实现业务逻辑. 一般我们用来“数据采集”,“市场调查”,“投票”,只要授权了第三方网页,微信用户无需注册就可 ...

随机推荐

  1. datatable 列名重新排序

    1. DataTable.Columns["MONEY"].SetOrdinal[4]; 2.dt = dt.DefaultView.ToTable(false, listarr. ...

  2. 3星|《创投42章经》:前VC投资人的商业评论文集

    创投42章经:互联网商业逻辑与投资进阶指南 作者2014年入行VC做投资人,2016年退出改作自媒体.书中主要是作者的各类商业评论的文集,少部分是跟投资相关的内容. 投资相关的内容,有些作者自己的视角 ...

  3. 请教MAC OS下PHP的mcrypt怎么安装

    安装方法一: 通过Homebrew安装mcrypt,安装成功 [Shell] 纯文本查看 复制代码 brew install mcrypt MCrypt是一个功能强大的加密算法扩展库,它包括有22种算 ...

  4. 管道流_PipedInputStream与PipedOutputStream

    输入和输出可以直接进行连接,通过结合线程使用(一个线程用于写,另一个用于读,因为管道输入流(读)是要读取管道输出流的数据的,又因为输入流中的read方法是阻塞式的,当两个流在同一个线程中时,输入流的r ...

  5. python第四十九课——对象序列化与反序列化

    person.py class Person: def __init__(self,*args,**kwargs): print('我是Person类的构造...') # self.name=name ...

  6. 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作

    版权声明:本文为博主原创文章.转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/deta ...

  7. Spring Component注解处理过程

    接下来: org.springframework.context.annotation.ComponentScanBeanDefinitionParser#parse方法展开加载过程:

  8. jQuery添加自定义函数的三种方法

    原文链接:http://caibaojian.com/284.html 方法一: jQuery.fn.setApDiv=function () { //apDiv浮动层显示位置居中控制 var whe ...

  9. go标准库的学习-crypto/des

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/des" des包实现了DES标准和TDEA算法,参见U.S. Fed ...

  10. gas问题out of gas的解决

    1.昨天遇见了还是以前遇见的问题,就是发现有些函数就是不能用web3调用,然后怎么弄都写不到数组上,但是今天终于将它解决了web3的学习:https://github.com/ethereum/wik ...