简单说一下微信开发OAuth2.0授权的一个小坑
PHP /
2015-09-16 /
阅读: 122
最近在开发一个微信项目,在网页中要获得微信用户的基本信息,微信给出一个连接,可以通过该连接引导用户授权,连接样式如下:
如果你的代码中在用户访问这个网址之前有逻辑想要写入session中,那么很不幸,用户在访问这段连接后,授权后回调回来时,相当于又开启了新的会话,之前保存的session就没用了。所以,大家有什么需要保存的数据,还是写在state参数中,以get的方式获得吧。
举个例子:
如果,我有一个需要用户从微信中打开的链接,其中,有一个参数id用于判断是通过谁来访问的,id就是邀请人的id,类似于:
http://xxx.com/index.php?id=123
代码:
<?php // 检测邀请人id if (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方式获取。