首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》7.1.3 详细步骤

关灯直达底部

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认证就完成了。