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
首先,引导用户访问下面的网页链接进入授权页面。
- https:// open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=
- REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
链接中的参数说明如表6-1所示。
表6-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-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的接口地址如下:
- https:// api.weixin.qq.com/sns/oauth2/access_token?appid=
- APPID&secret=SECRET&code=CODE&grant_type=authorization_code
上述接口地址中的参数说明如表6-2所示。
表6-2 获取网页授权access_token接口的参数说明
获取网页授权access_token接口调用成功时返回的JSON数据包如下:
- {
- "access_token": "ACCESS_TOKEN",
- "expires_in": 7200,
- "refresh_token": "REFRESH_TOKEN",
- "openid": "OPENID",
- "scope": "SCOPE"
- }
上述JSON数据包的参数说明如表6-3所示。
表6-3 获取网页授权access_token接口返回参数说明
OAuth2.0网页授权不仅针对关注用户,对于未关注公众账号的用户也同样有效。未关注公众账号的用户在访问公众账号的网页时,也会产生一个OpenID,该OpenID对于同一个公众账号也是唯一不变的。
获取网页授权access_token接口调用失败时返回的JSON数据包如下:
- {"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的请求地址如下:
- https:// api.weixin.qq.com/sns/oauth2/refresh_token?appid=
- APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
上述请求地址中的参数说明如表6-4所示。
表6-4 刷新access_token接口参数说明
刷新access_token接口的返回结果与获取网页授权access_token接口的完全一样,不再赘述。
3.获取用户信息
如果网页授权作用域为snsapi_userinfo,开发者还可以通过access_token和OpenID获取用户的基本信息,即使用户未关注公众账号也能获取。
获取用户信息的请求地址如下:
- https:// api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
用户信息获取成功时返回的JSON数据包如下:
- {
- "openid": "OPENID",
- "nickname": NICKNAME,
- "sex": "1",
- "province": "PROVINCE",
- "city": "CITY",
- "country": "COUNTRY",
- "headimgurl": "http:// wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxL
- SUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuT OgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
- "privilege": [
- "PRIVILEGE1",
- "PRIVILEGE2"
- ]
- }
以上JSON数据包中的参数说明如表6-5所示。
表6-5 获取用户信息接口返回参数说明
用户信息获取失败时返回的JSON数据包示例如下:
- {"errcode":40003,"errmsg":" invalid openid "}