脸谱图API不工作从2.2到2.3

因为它是图表api 2.2到期日,我试图修复我的graphicsapi使用v2.3但是我发现大多数API请求响应什么都没有,当我使用2.3,但我无法find升级文件中的任何更新。 例如:

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中,它包含了生日configuration文件。

我使用Facebook SDK 3.2.2,因为我的PHP版本是5.3。 有什么更新,我不知道? 谢谢。

我自己也发现了这个问题。 这是因为SDK 3.2.2。 对于更新(来自更新日志 API 2.3版):

[Oauth访问令牌]格式 – 当您交换access_token的代码时返回的https://www.facebook.com/v2.3/oauth/access_token的响应格式现在返回有效的JSON而不是URL编码。; 这个响应的新格式是{“access_token”:{TOKEN},“token_type”:{TYPE},“expires_in”:{TIME}}。 我们做了这个更新,以符合RFC 6749第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']; 

这将无法正确获取用户访问令牌,并且无法获取用户的数据。 所以你应该更新这个函数来parsing数据为json:

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

那么所有的function将照常工作。


另外,您必须对setExtendedAccessToken()进行类似的更改。 否则,您的应用将无法扩展访问令牌。 下面的代码演示了如何升级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 ); }