1.配置授权回调页面域名
在高级接口权限列表中,找到“OAuth2.0网页授权”,点击右侧的“修改”,如图7-2所示。
图7-2 微信OAuth2.0授权
授权回调页面域名配置规范为全域名并且不带http。例如,若需要网页授权的域名为www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html、http://www.qq.com/login.html都可以进行OAuth2.0鉴权。但http://pay.qq.com、http://music.qq.com、http://qq.com无法进行OAuth2.0鉴权。
这里填写mascot.duapp.com,它是方倍工作室的一个百度应用二级域名,如图7-3所示。
图7-3 配置授权回调页面域名
正常情况下,顶部会提示“通过安全监测”,表示提交通过。
2.用户授权并获取code
在域名根目录下新建一个文件,命名为oauth2.php,其内容如下。
<?phpif (isset($_GET['code'])){ echo$_GET['code'];}else{ echo "NO CODE";}?>
先了解请求授权页面的构造方式,接口请求如下。
https:// open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
请求授权的参数说明如表7-1所示。
表7-1 授权请求的参数说明
构造请求接口如下。
1)scope为snsapi_userinfo(本节基于这个实现)时。
https:// open.weixin.qq.com/connect/oauth2/authorize?appid=wx9a000b615d89c3f1&redirect_uri=http:// mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
2)scope为snsapi_base时。
https:// open.weixin.qq.com/connect/oauth2/authorize?appid=wx9a000b615d89c3f1&redirect_uri=http:// mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_base&state=2#wechat_redirect
把这个链接发送或者回复到用户微信中,以便在微信浏览器中打开,这里使用a标签封装如下。
OAuth2.0网页授权演示<a href="https:// open.weixin.qq.com/connect/oauth2/authorize?appid=wx9a000b615d89c3f1&redirect_uri=http:// mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">点击这里体验</a>技术支持 方倍工作室
在微信中显示的效果如图7-4所示。
点击“点击这里体验”链接后,弹出应用授权界面,如图7-5所示。
点击“确认登录”按钮,将跳转到oauth2.php页面,程序将获取到code,界面显示效果如图7-6所示。
图7-4 体验OAuth2.0授权
图7-5 应用登录
图7-6 获取code
这时可以通过右上角按钮下的复制链接,得到的链接如下。
http:// mascot.duapp.com/oauth2.php?code=00364c54e24d0029f8db4274dcaff638&state=1
成功得到了code。
3.使用code换取access_token
如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了OpenID,snsapi_base式的网页授权流程即到此为止。
换取网页授权access_token页面的接口如下。
https:// api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
相关参数如表7-2所示。
表7-2 换取access_token请求的参数说明
构造请求如下。
https:// api.weixin.qq.com/sns/oauth2/access_token?appid=wx9a000b615d89c3f1&secret=0ca77dd808ee1ea69830d7eecd770c06&code=00364c54e24d0029f8db4274dcaff638&grant_type=authorization_code
可以在浏览器中直接执行这条语句,得到如下JSON数据。
{ "access_token": "OezXcEiiBSKSxW0eoylIeBxt9UjhFtdKikeq2gavEwzx1JhikLTyOhNThJV4l- qYxDZzhc7tEq4_4aNdgf12gPPO6-byBWFPPW0hS-_ElI7J3Pg7-gr4RqmBrY3fU1OOaJfd3tD7iU 6qnGXX5f9UGA", "expires_in": 7200, "refresh_token": "OezXcEiiBSKSxW0eoylIeBxt9UjhFtdKikeq2gavEwzx1JhikLTyOhNThJV4l- qYxDZzhc7tEq4_4aNdgf12gNrlgJdOP1s3jqw49fpv-KQjni32A-DwXprScuG8_J2gJLqcT6WXH- fSFDr_Uk3NtA", "openid": "o7Lp5t6n59DeX3U0C7Kric9qEx-Q", "scope": "snsapi_userinfo,"}
数据格式解读如表7-3所示。
表7-3 换取access_token结果的参数说明
于是,成功通过code换取到了access_token及refresh_token。
4.刷新access_token(如果需要)
官方文档中提到了刷新access_token的功能,但这不是必须要做的,初次学习可以先忽略。
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token刷新。refresh_token拥有较长的有效期(7天、30天、60天、90天),当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
该接口的参数说明如表7-4所示。
表7-4 刷新access_token请求的参数说明
这里构造如下URL。
https:// api.weixin.qq.com/sns/oauth2/refresh_token?appid=wx9a000b615d89c3f1&grant_type=refresh_token&refresh_token=OezXcEiiBSKSxW0eoylIeBxt9UjhFtdKikeq2gavEwzx1JhikLTyOhNThJV4l-qYxDZzhc7tEq4_4aNdgf12gNrlgJdOP1s3jqw49fpv-KQjni32A-DwXprScuG8_J2gJLqcT6WXH-fSFDr_Uk3NtA
在浏览器中执行,可以得到与前面同样格式的JSON数据。
5.使用access_token获取用户信息(scope为snsapi_userinfo时)
请求接口如下。
https:// api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
该接口的参数说明如表7-5所示。
表7-5 获取用户信息请求的参数说明
构造请求如下。
https:// api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeBxt9UjhFtdKikeq2gavEwzx1JhikLTyOhNThJV4l-qYxDZzhc7tEq4_4aNdgf12gPPO6-byBWFPPW0hS-_ElI7J3Pg7-gr4RqmBrY3fU1OOaJfd3tD7iU6qnGXX5f9UGA&openid=o7Lp5t6n59DeX3U0C7Kric9qEx-Q
执行上述接口后,得到如下数据。
{ "openid":"o7Lp5t6n59DeX3U0C7Kric9qEx-Q", "nickname":"FangBei", "sex":1, "language":"zh_CN", "city":"深圳", "province":"广东", "country":"中国", "headimgurl":"http:// wx.qlogo.cn/mmopen/Kkv3HV30gbEZmoo1rTrP4UjRRqzsibUjT9JClP Jy3gzo0NkEqzQ9yTSJzErnsRqoLIct5NdLJgcDMicTEBiaibzLn34JLwficVvl6/0", "privilege":}
上述参数解读如表7-6所示。
表7-6 获取用户信息结果的参数说明
这与作者的个人微信是一致的,如图7-7所示。
图7-7 个人信息
至此,在不输入账号及密码的情况下,微信公众号获得了用户的个人信息,包括昵称、性别、国家、省份、城市、个人头像及特权列表。
一个完整的OAuth2.0认证就完成了。