Подтвердить что ты не робот

Facebook graph api не работает с 2.2 до 2.3

Поскольку это соответствует графику api 2.2, я пытаюсь исправить мой график api, используя v2.3 Но я обнаруживаю, что большинство ответов api ничего не спрашивают, когда я использую 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 он включает в себя профиль дня рождения.

Я использую facebook SDK 3.2.2, потому что моя версия php - 5.3. Есть ли какие-либо обновления, которые я не знаю? Спасибо.

4b9b3361

Ответ 1

Я сам нашел проблему. Это потому, что SDK 3.2.2. Для обновления facebook (из Changelog для API версии 2.3):

[Oauth Access Token] Format - формат ответа https://www.facebook.com/v2.3/oauth/access_token, возвращенный при обмене кодом для access_token, теперь возвращает действительный JSON вместо кодирования URL. Новый формат этого ответа: { "access_token": {TOKEN}, "token_type": {TYPE}, "expires_in": {TIME}}. Мы сделали это обновление совместимым с разделом 5.1 RFC 6749.

Но 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
    );
  }