2017-03-24 7 views
12

グラフapi 2.2の予定日だから、グラフAPIをv2.3で修正しようとしている しかし、私は2.3を使うとほとんどのapiリクエストレスポンスを発見することができます。アップグレードのドキュメントでこれに関するアップデートが見つかりませんでした。たとえば、facebook graph apiが2.2から2.3まで動かない

https://graph.facebook.com/v2.3/{$user_id}?date_format=U&fields=albums.order(reverse_chronological).limit(100).offset(0){id,count,name,created_time} 

は2.3を使用すると何も返しません。 そして私は、私が呼び出したときに、ユーザーの誕生日を取得することはできません。

https://graph.facebook.com/v2.3/{$user_id} 

それが唯一の名前とライブの場所を返します。 しかし、v2.2では、それは誕生日のプロフィールを含んでいます。

私のPHPバージョンが5.3なので、facebook SDK 3.2.2を使用します。 わからない更新はありますか?ありがとう。

+0

v2.3では、まだすべてのフィールドを取得する必要があります。しかし、v2.4から、必要なフィールドを明示的に求めなければなりません。http://stackoverflow.com/a/32585470/1427878 – CBroe

+0

@CBroeありがとう、後で気付くでしょう:) –

+0

私はこの問題のために、「アクティブなアクセストークンを使用して現在のユーザーに関する情報を照会する必要があります」というエラーメッセージが表示されました。 – rinogo

答えて

34

私はこの問題を自分で見つけました。これは、SDK 3.2.2のためです。 (APIバージョン2.3用Changelogから)Facebookの更新の場合:

[のOauthアクセストークン]フォーマット - あなたが今access_tokenはのためのコードを交換する代わりに、URLエンコードされているのに有効なJSONを返すときhttps://www.facebook.com/v2.3/oauth/access_tokenの応答形式が返されます。この応答の新しいフォーマットは{"access_token":{TOKEN}、 "token_type":{TYPE}、 "expires_in":{TIME}}です。私たちは、

6749. RFCのセクション5.1に準拠するように、このアップデートをしたが、SDKには、(getAccessTokenFromCode関数の)配列として応答を認識している:

$response_params = array(); 
parse_str($access_token_response, $response_params); 
if (!isset($response_params['access_token'])) { 
    return false; 
} 
return $response_params['access_token']; 

これは、ユーザーのアクセストークンを取得することはありません正しく、ユーザーのデータを取得することはできません。したがって、この関数を更新してデータをjsonとして解析する必要があります。

$response = json_decode($access_token_response); 
if (!isset($response->access_token)) { 
    return false; 
} 
return $response->access_token; 

すべての関数は通常通り動作します。


さらに、setExtendedAccessToken()に同様の変更を加える必要があります。そうしないと、アプリケーションはアクセストークンを拡張できなくなります。次のコードは、この関数をアップグレードする方法を示しています。

/** 
    * Extend an access token, while removing the short-lived token that might 
    * have been generated via client-side flow. Thanks to http://bit.ly/ b0Pt0H 
    * for the workaround. 
    */ 
    public function setExtendedAccessToken() { 
    try { 
     // need to circumvent json_decode by calling _oauthRequest 
     // directly, since response isn't JSON format. 
     $access_token_response = $this->_oauthRequest(
     $this->getUrl('graph', '/oauth/access_token'), 
     $params = array(
      'client_id' => $this->getAppId(), 
      'client_secret' => $this->getAppSecret(), 
      'grant_type' => 'fb_exchange_token', 
      'fb_exchange_token' => $this->getAccessToken(), 
     ) 
    ); 
    } 
    catch (FacebookApiException $e) { 
     // most likely that user very recently revoked authorization. 
     // In any event, we don't have an access token, so say so. 
     return false; 
    } 

    if (empty($access_token_response)) { 
     return false; 
    } 

    //Version 2.2 and down (Deprecated). For more info, see http://stackoverflow.com/a/43016312/114558 
    // $response_params = array(); 
    // parse_str($access_token_response, $response_params); 
    // 
    // if (!isset($response_params['access_token'])) { 
    // return false; 
    // } 
    // 
    // $this->destroySession(); 
    // 
    // $this->setPersistentData(
    // 'access_token', $response_params['access_token'] 
    //); 

    //Version 2.3 and up. 
    $response = json_decode($access_token_response); 
    if (!isset($response->access_token)) { 
     return false; 
    } 

    $this->destroySession(); 

    $this->setPersistentData(
     'access_token', $response->access_token 
    ); 
    } 
+1

これは動作します!ありがとうございます...それは2.8で動作しないことを認識してください...私は2.3で試しました –

+0

@SerhatAkay - あなたは少し詳細を提供することはできますか? 2.8ではどうなりますか?エラーメッセージが表示されますか? – rinogo

+2

神はあなたにブルースを祝福します。私に多くのトラブルを保存しました:) – Thyrun

関連する問題