Skip to content

微信授权利用了 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 的票据,具有以下特点:

  1. 每次用户授权带上的 code 将不一样;
  2. code 只能使用一次;
  3. 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)

如果 scopesnsapi_base,那么该模式在上述第二步已经结束。

scopesnsapi_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_tokenrefresh_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}`