Leo Code

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

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

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

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  
// 检测邀请人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方式获取。