0

我正在尝试使用 PHP-SDK 从 Facebook 获取用户访问令牌。服务器端登录过程效果很好,重定向到正确的页面并提供$code

重定向后(并检查是否$code存在),然后我调用以下 API 方法来交换$code用户令牌(API 参数在此处被抑制):

$fb->api('/oauth/access_token',array(
    'client_id'     => APP_ID,
    'client_secret' => APP_SECRET,
    'redirect_uri'  => REDIRECT_URI,
    'code'          => $code
));

$fb_token = $fb->getAccessToken();
echo $fb_token;

不幸的是,我从这个脚本中得到的仍然是应用程序令牌。事实上,将脚本简化为以下内容并没有任何区别:

$fb_token_user = $fb->getAccessToken();
echo $fb_token_user;

所以我认为这完全是关于由于/oauth/access_token某种原因没有工作或至少没有采取行动的电话。它也不返回任何错误。

我已经尝试并测试了几种替代方法,例如get_file_contents()Facebook 教程中建议的方法以及向上述 API 调用添加其他参数(例如type=client_cred,以及更多),但从未成功。

有人知道为什么 API 调用不起作用吗?是脚本还是 Facebook 上的某个应用设置?

提前致谢!

4

2 回答 2

2

解决了!问题中的代码仍然无法正常工作,尽管这个社区和其他社区有这么多线程表明它确实有效(奇怪的是,它似乎对他们有效)。

所以我想我必须回到Facebookfile_get_contents()解释的方法,结果发现这种方法以前不起作用,因为在我的服务器上被禁用。不想承担启用它的风险,我发现cURL是一种解决方法。allow_url_fopen

这是工作代码:

// cURL Load Function
function cURLget ($ch_url) {
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,$ch_url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
  curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
  $ch_send = curl_exec($ch);
  curl_close($ch);
  return $ch_send;
};

// Obtain User Token
$fb_token_get = cURLget("https://graph.facebook.com/oauth/access_token"
  . "?client_id=" . APP_ID
  . "&client_secret=". APP_SECRET
  . "&redirect_uri=" . urlencode(REDIRECT_URI)
  . "&code=" . $CODE
);
$fb_token_params = null;
parse_str($fb_token_get,$fb_token_params);

// Print Token Data
echo "Token: " . $fb_token_params['access_token']
  . "<br />Expires: " . $fb_token_params['expires'];

感谢@FabioAntunes 尝试帮助我编写原始代码,感谢@ShawnECarter 提供他的 cURL 加载函数脚本

于 2013-03-24T10:11:58.583 回答
0

今天也偶然发现了这个问题。似乎我的 PHP SDK (v.3.2.2) 提供了一个解决问题的函数:setExtendedAccessToken()。(做几乎相同的事情:调用图形的“/oauth/access_token”并将旧令牌与“长期”令牌交换)。

于 2013-11-13T12:47:18.027 回答