微信授权有两种: 一种是UnionID机制的授权, 还有一种是Oauth 2.0的网页授权

UnionID机制授权

UnionID机制授权需要 openid 和 全局的access_token,与网页授权的access_token不同,这个全局token每天有更新次数限制,而网页授权token是无限的。
请求链接: https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
关注的用户返回数据格式:
{
“subscribe”: 1,
“openid”: “o6_bmjrPTlm6_2sgVt7hMZOPfL2M”,
“nickname”: “Band”,
“sex”: 1,
“language”: “zh_CN”,
“city”: “广州”,
“province”: “广东”,
“country”: “中国”,
“headimgurl”: “http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
“subscribe_time”: 1382694957,
“unionid”: “ o6_bmasdasdsad6_2sgVt7hMZOPfL”
“remark”: “”,
“groupid”: 0
}
,未关注则返回:
{
“subscribe”: 0,
“openid”: “o6_bmjrPTlm6_2sgVt7hMZOPfL2M”
}

openid

每个用户具有唯一的openid,用户与微信、公众号消息交互的时候都会传递openid,所以解析回调的XML是可以得到openid的。当然,也可以用一些请求链接获取,
比如 网页Oauth2.0授权的第一步https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

全局的access_token

这个access_token文档在这里http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html, 获取链接https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回数据格式:{“access_token”:”ACCESS_TOKEN”,”expires_in”:7200}

代码步骤

  • Oauth2.0授权第一步,取到openid
  • 取到全局access_token
  • UnionID机制 链接取到用户基本信息

网页Oauth2.0的授权

官方文档给出的相关API及步骤如下:
1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效

其中,直接的授权步骤为:
取openid -> 换取access_token -> 拉取用户数据

取openid

步骤1提供了两种授权作用域 snsapi_base和snsapi_userinfo。
snsapi_base 只能到步骤2,换取access_token 结束。
snsapi_userinfo 则能到步骤3, 获取用户信息。
所以, 一般情况直接用 snsapi_userinfo 授权,可以直接走完步骤取用户信息。

access_token

这个token是指网页授权的token,每天可以无限制的请求。
需要用步骤1返回的code来换取。
在请求的时候,可以传递一个 state 参数,这个参数是有用户的(优化代码逻辑,避免在第一步死循环请求)。

拉取用户信息

直接用上述获取的两个参数请求,不论用户是否关注公众号, 数据格式:
{
“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”
}

对比UnionID机制,没有用户的 关注信息

代码步骤

  • snsapi_userinfo取code
  • 取到access_token
  • 取用户数据

UnionID VS Oauth2.0

本次博文的重点来了。

UnionID :

  • 全局的access_token的调用次数是有限的,所以就需要我们维护access_token的生存期,比如写入数据库或者缓存,一定时间进行更新。
  • 能返回用户的 关注信息
  • 未关注用户不能得到基本信息
  • 属于静默授权,无需用户点击授权(就是那个绿色的授权页面不会弹出)

Oauth2.0 :

  • 调用次数无限
  • 无论是否关注都能取到基本信息
  • 需要用户点击授权
  • 无法得到关注信息

最后, 献上实例代码 https://github.com/chendongbupt/blog-example/blob/master/cls_oauth.php

下一节讲述 部分授权场景