需要有关OAuthException Code 2500的帮助

Lar*_*eep 9 php facebook facebook-graph-api facebook-apps facebook-access-token

我正在尝试使用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";
Run Code Online (Sandbox Code Playgroud)
  • 成功授权后,我回到索引页面,以"代码"作为参数.

http://MY_CANVAS_PAGE/?code=some base64 encoded letters
Run Code Online (Sandbox Code Playgroud)
  • 首先,我不知道我是否需要access_token只是为了阅读用户的音乐兴趣,但我已经尝试了所有建议的方法.我无法从这一点前进
  • 我有一个像这样的代码(在我的索引页面中),如果没有设置代码参数,它会重定向授权.

if(empty($code) && !isset($_REQUEST['error'])) {
  $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
  echo("<script> top.location.href='" . $auth_url . "'</script>");
}
Run Code Online (Sandbox Code Playgroud)
  • 目前我只是想在这里获取用户的公开信息,但没有成功.我按照建议尝试了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"]);
Run Code Online (Sandbox Code Playgroud)
print_r($decoded_response);
Run Code Online (Sandbox Code Playgroud)
stdClass Object ( [error] => stdClass Object ( [message] => An active 
access token must be used to query information about the current user. 
[type] => OAuthException [code] => 2500 ) ) 
Run Code Online (Sandbox Code Playgroud)

为了获得用户的公开信息,我还尝试了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

迪帕克

Igy*_*Igy 9

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

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

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

  1. redirect_uri你使用的是一个文件夹或服务器的根和缺少结尾的斜线(即它http://www.example.com代替http://www.example.com/)
  2. redirect_uri为您在第一次调用的身份验证对话框中使用不完全一样redirect_uri,你在调用中使用exchagne代码为的access_token

如果由于某些其他原因导致您的身份验证流程中断,并且您无法从SDK示例或身份验证文档中找到它,那么可能需要一段时间让某人与您交谈,因为您可能缺少了解他们所需的一些背景知识答案


Poo*_*hri 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'];
Run Code Online (Sandbox Code Playgroud)

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