【问题标题】:facebook graph api not work from 2.2 to 2.3facebook graph api 从 2.2 到 2.3 不工作
【发布时间】:2017-10-24 16:29:43
【问题描述】:

由于图形 api 2.2 的到期日期,我正在尝试使用 v2.3 修复我的图形 api 但是当我使用 2.3 时,我发现大多数 api 请求响应都没有,但我在升级文档中找不到任何更新。例如:

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。 有什么我不知道的更新吗?谢谢。

【问题讨论】:

  • 使用 v2.3,您仍然应该获得所有字段。但是,从 v2.4 开始,您必须明确要求提供所需的字段,请参阅 stackoverflow.com/a/32585470/1427878
  • @CBroe 谢谢,我稍后会注意到的 :)
  • 为了使这个答案更易于搜索,由于这个问题,我收到的错误消息是“必须使用活动访问令牌来查询有关当前用户的信息。”

标签: php facebook facebook-graph-api


【解决方案1】:

我自己发现了问题。这是因为 SDK 3.2.2。对于 facebook 更新(来自 API 版本 2.3 的 Changelog):

[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'];

这将无法正确获取用户访问令牌,并且您无法获取用户数据。所以你应该更新这个函数来将数据解析为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
    );
  }

【讨论】:

  • @SerhatAkay - 你能提供更多信息吗? 2.8会发生什么?您是否收到错误消息?
  • 上帝保佑你,布鲁斯。省了我很多麻烦:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多