2

我有一个功能齐全的 FQL 查询,但是当它第二次被触发时,我得到一个错误代码 102:需要用户会话

在我的应用程序上,我有一个自动完成搜索朋友的功能。我正在使用带有 AJAX 的动态源的 jquery ui 自动完成功能。

这是我的 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 周内运行良好,但突然停止了。即使“更奇怪”,它在第一次触发时仍然有效,但第二次则无效。由于这是异步的,我不明白如果是第一次,第二次,第三次,第四次触发它有什么区别..

有任何想法吗?

编辑 1 通过进一步的研究,我认为我有一个解决方法。这可能是因为在此处报告并此处讨论的错误

我的解决方法是捕获我使用 Object Facebook 获得的第一个 access_token,然后将其附加到该类的每个实例,就像这样

第一次连接:

$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 个数字的字符串,它没有......我真的被困在这里

4

1 回答 1

2

之所以会发生这种情况,是因为Facebook于 2012 年 12 月 5 日推出了“重大变更”。具体来说:

OAuth 授权码的新安全限制

我们将只允许将授权代码交换为访问令牌一次,并要求在创建后 10 分钟内将它们交换为访问令牌。这符合 OAuth 2.0 规范,该规范从一开始就声明“授权码必须是短暂的且一次性使用”。有关更多信息,请查看我们的身份验证文档。

这就是为什么您的第一个请求有效,而您的第二个请求无效。在第二次尝试时,SDK 会尝试将您的用户身份验证代码交换为访问令牌。但由于这些变化,这只能完成一次。您的代码看起来应该可以正常工作,因为您是access_token在第一次收到它之后明确保存然后设置的。确保是这种情况(确认 $_SESSION 变量正在正确保存/检索)。如果由于某种原因不是,您将看到 102 错误。

干杯

于 2012-12-06T19:21:48.897 回答