微信平台开发02-OAuth2.0授权

1.背景

在微信中定义了菜单,然后就需要得到用户的登录信息来区别用户的操作,比如是谁下单,当前用户的账号里有多少money等等。这其中核心要素就是绑定用户,也就是获取用户的身份信息。

2.分析

授权过程比较复杂,但是还好是顺序的流程。

graph LR
用户关注服务号-->在服务号中发送url给用户
在服务号中发送url给用户-->用户点击URL并同意
用户点击URL并同意-->得到code
得到code-->向服务器获取AccessToken
向服务器获取AccessToken-->获取用户信息

对于程序的调用流程来说是:

  • 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

  • 通过code参数加上AppID和AppSecret等,通过API换取access_token;

  • 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

这远要比QQ的授权要复杂一些,至少在请求过程中需要多appid和appsecret参数才能正常通讯。


工作原理
第一步 配置权限和回调uri:
  • 确认在服务号后台的[开发者中心中]查看[接口权限列表],[网页服务]栏目中的[网页授权获取用户基本信息]是否是[已获得]的状态,这个需要服务号经过认证过才行;
  • 输入用于处理回调的页面域名,注意域名不能带http://
第二步 发给用户,用户同意授权,获取code:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect

[图片上传失败...(image-579681-1514516869173)]

参数 说明
appid 公众号的标识,在微信后台里可以找到
redirect_uri 授权之后重定向需要调用的地址
scope 授权的作用域,snsapi_base直接授权了,只能获得用户的openid,snsapi_userinfo,这个可以继续通过用户的openid获取进一步的用户信息
state 重定向之后需要保留的参数,值由调用者指定,任意值
#wechat_redirect 直接点击链接可以不放这个参数,如果是读文章,已经读了一半用这个参数可以保留阅读进度

这一步的主要作用就是用来获取进一步通讯使用的临时code,需要用这个code加上AppID和AppSecret来换调用api所需要的access_token。
成功调用之后,需要用户授权,同意微信平台将回调之前我们给定的redirect_uri地址,以get的方式传回code和之前给定的state参数。

第三步 通过code换取网页授权access_token:

跟上一个步骤是很类似的,组合一个url,通过get方式请求

https://api.weixin.qq.com/sns/oauth2/access_token?appid=${APPID}&secret=${SECRET}&code=${CODE}&grant_type=authorization_code
参数 说明
appid 公众号的标识
secret 公众号的secret密钥
code 第二步中请求获得的临时票据code
grant_type 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需要调用另外一个接口,因为refresh_token会有更长的有效期,所以可以凭借refresh_token来再次获取access_token,简化获取code后再去获取access_token的步骤
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔

如果调用错误那么会有一个错误的消息返回,具体可以参考【全局返回码】

第四步 拉取用户信息:

构建以下url,通过get方式获取

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 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见获取用户基本信息(UnionID机制)更新

这里简单展开一下openid和unionid的区别:

  • 每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同,公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
  • 多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。在返回的用户基本信息中,可以用unionid来区分用户的唯一性。

3.注意事项

因为access_token资源比较有限,一般使用存放我们微信服务程序的服务器来获取,简单来说,需要一个专门的程序去拉取access_token,之后所有需要用到请求的程序,都从服务器获取全局的access_token来实现调用。初步的设想是每隔7000秒去调用一次获取access_token的请求,然后存放在全局缓存中供整体使用。

4.代码实现

以上内容是参考网址学习整理所得:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容