2

完全に機能する FQL クエリがありますが、2 回目のトリガー時にエラー コード 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 週間は問題なく機能していましたが、突然停止しました。「奇妙」でも、最初にトリガーされたときは機能しますが、2回目は機能しません. これは非同期であるため、トリガーされた1回目、2回目、3回目、4回目の場合にどのような違いがあるのか​​ わかりません..

何か案は?

編集1 さらに調査した結果、回避策が得られたと思います。これは、ここで報告されたバグとここで議論されたバグが原因である可能性があります

私の回避策は、オブジェクト 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日の「BreakingChanges」のためです。具体的には:

OAuth認証コードの新しいセキュリティ制限

認証コードをアクセストークンと交換できるのは1回のみで、作成後10分以内にアクセストークンと交換する必要があります。これは、最初から「認証コードは短命で使い捨てでなければならない」と述べているOAuth2.0仕様に沿ったものです。詳細については、認証に関するドキュメントをご覧ください。

これが、最初のリクエストが機能し、2番目のリクエストが機能しない理由です。2回目の試行で、SDKはユーザーの認証コードをアクセストークンと交換しようとします。ただし、これらの変更により、これは1回しか実行できません。コードは、access_token最初に受け取った後に明示的に保存してから設定しているため、正しく機能しているように見えます。それが事実であることを確認してください($ _ SESSION変数が適切に保存/取得されていることを確認してください)。何らかの理由でそうでない場合は、102エラーが表示されます。

乾杯

于 2012-12-06T19:21:48.897 に答える