gráfico facebook não funciona de 2.2 a 2.3

Porque é a data de vencimento para o gráfico api 2.2, estou tentando corrigir o meu gráfico api usando a v2.3. Mas eu descubro que a maioria das respostas não responde quando eu uso 2.3, mas não consigo encontrar nenhuma atualização para este no documento de atualização. Por exemplo:

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} 

não retornará nada se eu usar 2.3. E não consigo receber o aniversário do usuário quando eu ligo:

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

É apenas o nome de retorno e a localização ao vivo. Mas na v2.2, inclui o perfil de aniversário.

Eu uso o Facebook SDK 3.2.2 porque minha versão do php é 5.3. Existe alguma atualização que eu não conheço? Obrigado.

Eu também encontrei o problema. É porque o SDK 3.2.2. Para atualização do Facebook (do Changelog para API versão 2.3):

Formato [Oauth Access Token] – O formato de resposta de https://www.facebook.com/v2.3/oauth/access_token retornado quando você troca um código para um access_token agora retorna JSON válido em vez de ser codificado em URL. O novo formato dessa resposta é {“access_token”: {TOKEN}, “token_type”: {TYPE}, “expires_in”: {TIME}}. Fizemos esta atualização ser compatível com a seção 5.1 do RFC 6749.

Mas o SDK reconhece a resposta como uma matriz (na function getAccessTokenFromCode):

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

Isso não receberá o token de access do usuário corretamente e você não pode obter os dados do usuário. Então, você deve atualizar esta function para analisar dados como json:

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

Então, toda a function funcionará como de costume.


Além disso, você deve fazer alterações semelhantes para setExtendedAccessToken() . Caso contrário, seu aplicativo não poderá ampliar os tokens de access. O código abaixo demonstra como atualizar a function.

  /** * 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 ); }