我自己发现了问题。这是因为SDK 3.2.2。对于Facebook更新来自API版本2.3的Changelog:
[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'];这将无法正确获取用户访问令牌,也无法获取用户数据。因此,您应该更新此函数以将数据解析为json:
$response = json_depre($access_token_response);if (!isset($response->access_token)) { return false;}return $response->access_token;然后,所有功能将照常工作。
此外,您必须对进行类似的更改
setExtendedAccessToken()。否则,您的应用将无法扩展访问令牌。下面的代码演示了如何升级功能。
public function setExtendedAccessToken() { try { // need to circumvent json_depre 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_depre($access_token_response); if (!isset($response->access_token)) { return false; } $this->destroySession(); $this->setPersistentData( 'access_token', $response->access_token ); }


