facebook graph api 从 2.2 到 2.3 不起作用 [英] facebook graph api not work from 2.2 to 2.3

查看:21
本文介绍了facebook graph api 从 2.2 到 2.3 不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Because it's due date for graph api 2.2, I'm trying fix my graph api using v2.3 But I discover most api request response nothing when I use 2.3, but I can not found any update for this in the upgrade document. For example:

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 将不返回任何内容.我打电话时无法获得用户的生日:

will return nothing if I use 2.3. And I can't get user's birthday when I call:

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

它只是返回名称和实时位置.但在 v2.2 中,它包含生日资料.

It's only return name and live location. But in v2.2, it include birthday profile.

我使用 facebook SDK 3.2.2,因为我的 php 版本是 5.3.有什么我不知道的更新吗?谢谢.

I use facebook SDK 3.2.2 because my php version is 5.3. Is there any update that I don't know? Thanks.

推荐答案

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

I have found the problem myself. It's because the SDK 3.2.2. For facebook update (from the Changelog for API version 2.3):

[Oauth Access Token] Format - https://www.facebook的响应格式当您为 access_token 交换代码时返回的 .com/v2.3/oauth/access_token 现在返回有效的 JSON 而不是 URL 编码.此响应的新格式为 {"access_token": {TOKEN}, "token_type":{TYPE}, "expires_in":{TIME}}.我们进行了此更新以符合 RFC 6749 的第 5.1 节.

[Oauth Access Token] Format - The response format of https://www.facebook.com/v2.3/oauth/access_token returned when you exchange a code for an access_token now return valid JSON instead of being URL encoded. The new format of this response is {"access_token": {TOKEN}, "token_type":{TYPE}, "expires_in":{TIME}}. We made this update to be compliant with section 5.1 of RFC 6749.

但 SDK 将响应识别为数组(在 getAccessTokenFromCode 函数中):

But SDK is recognize the response as an array(in the getAccessTokenFromCode function):

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

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

This will not get user access token correctly, and you can't get user's data. So you should update this function to parse data as json:

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

然后所有的功能都会照常工作.

Then all of the function will work as usual.

此外,您必须对 setExtendedAccessToken() 进行类似的更改.否则,您的应用程序将无法扩展访问令牌.下面的代码演示了如何升级功能.

Additionally, you must make similar changes to setExtendedAccessToken(). Otherwise, your app won't be able to extend access tokens. The code below demonstrates how to upgrade the 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
    );
  }

这篇关于facebook graph api 从 2.2 到 2.3 不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆