我有一个功能齐全的FQL查询,但是当它第二次被触发时,我得到一个错误代码102:需要用户会话
在我的应用中,我有一个自动完成搜索朋友。 我正在使用jquery ui自动完成和使用AJAX的动态源。
这是我的PHP函数:
function fb_buscarAmigosAutocomplete($term='',$app_user=false){
$facebook = new Facebook(array(
'appId' => APP_ID,
'secret'=> APP_SECRET
));
$term=trim(strtolower($term));
//Buscar usuarios
try{
$fql = " SELECT uid,name,first_name,last_name,pic_square
FROM user
WHERE uid IN (
SELECT uid2
FROM friend
WHERE uid1=me()
)
AND strpos(lower(name),'".$term."') >=0
";
if($app_user)
$fql .= " AND is_app_user";
$fql .= " LIMIT 5";
$param = array(
'method' => 'fql.query',
'query' => $fql,
'callback' => ''
);
$result = $facebook->api($param);
} catch(FacebookApiException $e){
$error=$e->getMessage();
var_dump($e);
}
if(!empty($result)) {
$return['amigos']=$result;
$return['valido']=true;
}else
$return['valido']=false;
return $return;
}
奇怪的是,这在过去的2-3周里工作得很好,突然间它停了下来。即使" weirder",它仍然在第一次触发时工作,但不是第二次。由于这是异步的,我不明白如果是第一次,第二次,第三次,第四次触发它会有什么区别..
有什么想法吗?
修改1 随着进一步的研究,我认为我有一个解决方法。 这可能是因为报告的错误here和讨论here
我的解决方法是捕获我使用Object Facebook获得的第一个access_token,然后将其附加到Class的每个单独实例,类似这样的
第一次连接:
$facebook = new Facebook(array(
'appId' => APP_ID,
'secret'=> APP_SECRET
));
$uid = $facebook->getUser();
if($uid){
$_SESSION['access_token']=$facebook->getAccessToken();
}
api的任何其他用途:
$facebook = new Facebook(array(
'appId' => APP_ID,
'secret'=> APP_SECRET
));
$facebook->setAccessToken($_SESSION['access_token']);
try{
$user_info = $facebook->api('/'.$uid.'?fields=id,name,first_name,last_name,email,picture');
} catch(FacebookApiException $e){
$error = $e->getMessage();
}
到目前为止它已经解决了这个问题
编辑2
它没有...有时候我的访问令牌是一个有效的字母数字+100个字符的字符串,那些时候它可以工作。
有时它只是48个数字字符串,而且它没有...我真的被困在这里
答案 0 :(得分:2)
这可能发生的原因是因为Facebook推出的December 5, 2012“突破性变化”。具体做法是:
OAuth授权码的新安全限制
我们只允许一次授权代码交换访问令牌,并要求在创建后的10分钟内将其交换为访问令牌。这与OAuth 2.0规范一致,从一开始就说“授权代码必须是短暂的并且一次性使用”。有关更多信息,请查看我们的身份验证文档。
这就是你的第一个请求有效,第二个请求无效的原因。在第二次尝试时,SDK会尝试将用户的身份验证代码交换为访问令牌。但由于这些变化,这只能做一次。您的代码看起来应该正常工作,因为您明确保存,然后在第一次收到后设置access_token
。确保是这种情况(确认正在保存/检索$ _SESSION var)。如果由于某种原因不是,那么你会看到102错误。
干杯