6.3.2 网页授权流程

通过OAuth2.0实现网页授权的流程分为3步。

1)引导用户进入授权页面,用户同意授权后,开发者能够获取到code。

2)通过code换取网页授权access_token,access_token的有效时长为7200秒。

如果需要,开发者可以刷新网页授权access_token,避免过期。

3)通过网页授权access_token和OpenID获取用户基本信息。


注意 code是一个32位的随机字符串,作为换取网页授权access_token的票据。每次用户授权后接收到的code都不一样,code只能使用一次,如果5分钟后仍未使用则自动过期。


1.获取code

首先,引导用户访问下面的网页链接进入授权页面。

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

链接中的参数说明如表6-1所示。

表6-1 引导用户进入授权页面的网页链接参数

6.3.2 网页授权流程 - 图1

在表6-1中,比较重要的两个参数是redirect_uri和scope。

●redirect_uri是授权后的回调地址,必须在图6-3中所设置的回调域名下。当用户同意授权给公众账号后,微信服务器会将授权数据(主要是code)传到redirect_uri所表示的链接地址。

●scope是应用授权作用域,它的值有两个:snsapi_base和snsapi_userinfo。如果只需要获取用户的OpenID,则将scope设置为snsapi_base;如果除OpenID之外还需要获取用户的其他信息(用户昵称、性别、所在城市等),则需要将scope设置为snsapi_userinfo。当scope等于snsapi_base时,不会弹出授权页面;当scope等于snsapi_userinfo时,会弹出授权页面,授权界面如图6-4所示。

6.3.2 网页授权流程 - 图2

图6-4 授权页面

当用户同意授权后,页面将跳转至redirect_uricode=CODE&state=STATE。如果用户拒绝授权,页面将跳转至redirect_uricode=authdeny&state=STATE。也就是说,不管用户是否同意授权,页面都将跳转到回调地址redirect_uri,在redirect_uri指向的请求处理程序中,可以获取参数code和state,如果code的值为authdeny,就表示用户拒绝授权。


说明 如果引导链接中的网页授权作用域scope等于snsapi_base时,用户点击后会直接跳转至redirect_uricode=CODE&state=STATE,一样能够获取到code。


2.获取access_token

(1)根据code获取access_token

接下来,通过调用接口获取网页授权access_token,这里的access_token与调用自定义菜单接口、客服消息接口需要的access_token不同。获取网页授权access_token的接口地址如下:

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

上述接口地址中的参数说明如表6-2所示。

表6-2 获取网页授权access_token接口的参数说明

6.3.2 网页授权流程 - 图3

获取网页授权access_token接口调用成功时返回的JSON数据包如下:

  1. {
  2. "access_token": "ACCESS_TOKEN",
  3. "expires_in": 7200,
  4. "refresh_token": "REFRESH_TOKEN",
  5. "openid": "OPENID",
  6. "scope": "SCOPE"
  7. }

上述JSON数据包的参数说明如表6-3所示。

表6-3 获取网页授权access_token接口返回参数说明

6.3.2 网页授权流程 - 图4

OAuth2.0网页授权不仅针对关注用户,对于未关注公众账号的用户也同样有效。未关注公众账号的用户在访问公众账号的网页时,也会产生一个OpenID,该OpenID对于同一个公众账号也是唯一不变的。

获取网页授权access_token接口调用失败时返回的JSON数据包如下:

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

说明 如果网页授权作用域scope等于snsapi_base,在这一步获取网页授权access_token的同时,也获取到了用户的OpenID,scope等于snsapi_base的网页授权流程到此结束。


(2)刷新access_token

access_token的有效时间为7200秒,如果超时,则可以使用上一步返回的refresh_token刷新access_token。refresh_token的有效期比较长,至少一星期,当refresh_token失效后,就需要用户重新授权。

刷新access_token的请求地址如下:

  1. https:// api.weixin.qq.com/sns/oauth2/refresh_token?appid=
  2. APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

上述请求地址中的参数说明如表6-4所示。

表6-4 刷新access_token接口参数说明

6.3.2 网页授权流程 - 图5

刷新access_token接口的返回结果与获取网页授权access_token接口的完全一样,不再赘述。

3.获取用户信息

如果网页授权作用域为snsapi_userinfo,开发者还可以通过access_token和OpenID获取用户的基本信息,即使用户未关注公众账号也能获取。

获取用户信息的请求地址如下:

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

用户信息获取成功时返回的JSON数据包如下:

  1. {
  2. "openid": "OPENID",
  3. "nickname": NICKNAME,
  4. "sex": "1",
  5. "province": "PROVINCE",
  6. "city": "CITY",
  7. "country": "COUNTRY",
  8. "headimgurl": "http:// wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxL
  9. SUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuT OgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
  10. "privilege": [
  11. "PRIVILEGE1",
  12. "PRIVILEGE2"
  13. ]
  14. }

以上JSON数据包中的参数说明如表6-5所示。

表6-5 获取用户信息接口返回参数说明

6.3.2 网页授权流程 - 图6

用户信息获取失败时返回的JSON数据包示例如下:

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