9

我正在尝试使用 PHP 开发一个 Facebook 应用程序 (apps.facebook.com/some_app),我需要根据用户的音乐兴趣提供一些信息。我发现它在“user_likes > 游戏”下。

我的问题如下:

  • 为了获得访问权限,我已经按照我的索引页面的 API 中的建议实现了 oauth 对话方法。

$auth_url = "http://www.facebook.com/dialog/oauth?client_id="
            . $app_id . "&redirect_uri=" 
            . urlencode($canvas_page)
            ."&scope=user_likes";
  • 成功授权后,我以“代码”作为参数返回索引页面。

http://MY_CANVAS_PAGE/?code=some base64 encoded letters
  • 首先,我不知道我是否需要 access_token 来读取用户的音乐兴趣,但我已经尝试了所有建议的方法。我无法从这一点继续前进
  • 我有这样的代码(在我的索引页面中),如果未设置代码参数,它将重定向授权。

if(empty($code) && !isset($_REQUEST['error'])) {
  $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
  echo("<script> top.location.href='" . $auth_url . "'</script>");
}
  • 目前我只是想在这里获取用户的公共信息,但没有成功。我已经按照建议尝试了 signed_request 方法,但没有成功

$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
echo ("Welcome User: " . $data["user_id"]);

print_r($decoded_response);

stdClass Object ( [error] => stdClass Object ( [message] => An active 
access token must be used to query information about the current user. 
[type] => OAuthException [code] => 2500 ) ) 

为了获取用户的公共信息,我还尝试了 PHP SDK 中的建议示例


$facebook = new Facebook(array(
'appId'  => MY_APP_ID, //registered facebook APP ID
'secret' => MY_SECRET, //secret key for APP
));

$fb_user = $facebook->getUser();

if($fb_user){
    try {
      $user_profile = $facebook->api('/me');
      echo $user_profile['email'];
    }
    catch(FacebookApiException $e) {
      $fb_user = null;
    }
}

但没有成功。有人可以解释我为什么会收到此错误以及如何正确访问用户的音乐兴趣。可能我误解了 API。

谢谢

迪帕克

4

4 回答 4

9

错误 2500 表示您没有访问令牌或应用程序访问令牌,但正在尝试访问/me/- “我”是“当前用户或页面 ID”的占位符,因此如果没有用户或页面的访问令牌,它将无效。

要访问用户的喜欢列表,您在授权时还需要user_likes 权限

我看到的应用程序无法交换code访问令牌的最可能原因是:

  1. 您使用的redirect_uri是文件夹或服务器根目录,并且缺少尾部斜杠(即它http://www.example.com而不是http://www.example.com/
  2. redirect_uri您在第一次调用 auth 对话框时使用的与redirect_uri您在调用中用于交换 access_token 的代码并不完全相同

如果您的身份验证流程由于某些其他原因而中断,并且您无法从 SDK 示例或身份验证文档中弄清楚,这可能需要一段时间才能有人与您交谈,因为您可能缺少了解他们的一些必要的背景知识答案

于 2012-06-17T21:52:19.687 回答
1

对我来说,我试图用 php 获取身份验证令牌,发现 2500 错误是由于file_get_contents没有返回任何内容的问题。我可以在浏览器中访问 URL,但不能使用file_get_contents. 我通过使用 CURL 来修复它,如下所述:https ://stackoverflow.com/a/6325313 。

结果是我使用了https://developers.facebook.com/docs/authentication/server-side/中的代码并替换了以下行:

$response = file_get_contents($token_url);

$ch = curl_init($token_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

因此变成了:

   $token_url = "https://graph.facebook.com/oauth/access_token?client_id="
        . $app_id . "&redirect_uri=" . urlencode($redirect_url)
        . "&client_secret=" . $app_secret
        . "&code=" . $code;

    /* Facebook say to use this, but file_get_contents isn't working!
    $response = file_get_contents($token_url,null, $val);
    */

    // Use this as an alternative
    $ch = curl_init($token_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);

    // From https://developers.facebook.com/docs/authentication/server-side/
    $params = null;
    parse_str($response, $params);
    $access_token = $params['access_token'];
于 2012-06-20T09:39:25.807 回答
0

试试这段代码

$code = $_REQUEST["code"];
  if(empty($code)) {
    $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . urlencode($my_url) ;
    echo("<script>top.location.href='" . $dialog_url . "'</script>");
  }

  $token_url = "https://graph.facebook.com/oauth/access_token?client_id="
    . $app_id . "&redirect_uri=" . urlencode($my_url) 
    . "&client_secret=" . $app_secret 
    . "&code=" . $code;
    $response = file_get_contents($token_url);
    $params = null;
    parse_str($response, $params);
    $access_token = $params['access_token'];

PS:用户电子邮件地址不是公共信息,您需要 user_email 权限

于 2012-02-20T06:25:49.643 回答
0

感谢https://developers.facebook.com/blog/post/534/ ,我已经解决了我的问题

我只是复制了样本并粘贴到我的脚本中。它完全适合。它是 PHP 和 Javascript 的混合使用。

于 2012-06-18T15:16:05.230 回答