微信授权利用了 OAuth2.0
机制的授权码模式。
整体流程如下:
1.获取授权码code
为了获取到授权码 code
,首先跳转到微信官方提供的 URL
:
js
`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_uri | 是 | 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 |
response_type | 是 | 返回类型,固定值 code ,表示授权码模式。 |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid ),snsapi_userinfo (弹出授权页面,可通过openid 拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) |
state | 否 | 重定向后会带上 state 参数,开发者可以填写 a-zA-Z0-9 的参数值,最多 128 字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面 302 重定向时候,必须带此参数 |
当上述链接授权通过之后,系统将会重定向至:
js
`redirect_uri/?code=${CODE}&state=${STATE}`
TIP
code
作为换取 access_token
的票据,具有以下特点:
- 每次用户授权带上的
code
将不一样; code
只能使用一次;5
分钟未被使用自动过期。
2.根据code获取access_token
在获取到 code
之后,我们可以用 code
向以下链接交换 access_token
(这一步在服务端进行)。
js
`https://api.weixin.qq.com/sns/oauth2/access_token
?appid=${APPID}
&secret=${SECRET}
&code=${CODE}
&grant_type=authorization_code`
其中参数含义如下:
参数 | 必填 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的 appsecret |
code | 是 | 填写第一步获取的 code 参数 |
grant_type | 是 | 固定值 authorization_code ,表示授权码模式。 |
当接口正确响应时,大致有以下数据结构:
json
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"is_snapshotuser": 1,
"unionid": "UNIONID"
}
3.拉取用户信息(需scope为 snsapi_userinfo)
如果 scope
为 snsapi_base
,那么该模式在上述第二步已经结束。
当 scope
为 snsapi_userinfo
,则可以参考此节拉取用户信息。
js
`https://api.weixin.qq.com/sns/userinfo
?access_token=${ACCESS_TOKEN}
&openid=${OPENID}
&lang=zh_CN`
参数含义如下:
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证 |
openid | 用户的唯一标识 |
lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
4.刷新access_token(如果需要)
在第二步中,我们能同时获取到 access_token
和 refresh_token
。
由于 access_token
存在一定的有效期,因此当它过期时(一般为 7200s
),我们可以借助 refresh_token
调用以下链接从而刷新 access_token
:
js
`https://api.weixin.qq.com/sns/oauth2/refresh_token
?appid=${APPID}
&grant_type=refresh_token
&refresh_token=${REFRESH_TOKEN}`