简单说一下微信开发OAuth2.0授权的一个小坑

来源:互联网 发布:敢聊软件下载 编辑:程序博客网 时间:2024/06/16 14:09

最近在开发一个微信项目,在网页中要获得微信用户的基本信息,微信给出一个连接,可以通过该连接引导用户授权,连接样式如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
如果你的代码中在用户访问这个网址之前有逻辑想要写入session中,那么很不幸,用户在访问这段连接后,授权后回调回来时,相当于又开启了新的会话,之前保存的session就没用了。所以,大家有什么需要保存的数据,还是写在state参数中,以get的方式获得吧。

举个例子:

如果,我有一个需要用户从微信中打开的链接,其中,有一个参数id用于判断是通过谁来访问的,id就是邀请人的id,类似于:

http://xxx.com/index.php?id=123

代码:


<?php// 检测邀请人idif (isset($_GET['id'])) {// 把id存入session中session_start();$_SESSION['id'] = $_GET['id'];}// 检测是否是微信回调回来的页面elseif (isset($_GET['code']) && isset($_GET['state'])) {// 逻辑代码用户可以在这里授权// ......// ......// 获取到用户信息后,把信息存在session中$_SESSION['openid'] = $data->openid;// 把邀请人ID存到数据库中// ......}elseif (isset($_SESSION['openid'])) {// 如果存在$_SESSION['openid']跳过授权页面,直接进入相关逻辑,不能让用户每次访问都授权// 授权次数是有限的// 逻辑代码}?> 



以上代码是错误的写法,因为在微信回调回来的时候,开启了一个新的会话,之前的邀请人ID并没有被带回来。

所以,如果在回调之前有要保存的数据,最好在state中,微信回调回来的地址中会把你的参数含在地址中,可以用get方式获取。

0 0