Потому что настало время для графика 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. Есть ли какие-либо обновления, которые я не знаю? Благодарю.
Я сам нашел проблему. Это потому, что SDK 3.2.2. Для обновления facebook (из списка изменений для 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 ); }