我正在尝试使用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;
不幸的是,我从这个脚本获得的只是app令牌。实际上,将脚本简化为以下内容没有任何区别:
$fb_token_user = $fb->getAccessToken();
echo $fb_token_user;
所以我认为所有关于/oauth/access_token
调用都是出于某种原因无法正常工作或至少没有采取任何行动。它也不会返回任何错误。
我已尝试并测试过多种替代方案,例如Facebook教程中建议的get_file_contents()
方法,以及在上述API调用中添加其他参数(例如type=client_cred
等),但从未成功
有人知道为什么API调用不起作用吗?是脚本还是Facebook上的应用程序设置?
提前致谢!
答案 0 :(得分:2)
解决了!问题中的代码仍然没有工作,尽管有这么多线程和其他社区声明它(奇怪的是它似乎适用于them)
所以我认为我必须回到Facebook所解释的file_get_contents()
方法,结果发现此方法以前无效,因为我的服务器上禁用了allow_url_fopen
。我不想承担启用它的风险,我发现cURL是一种解决方法。
这是工作代码:
// 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为他的script提供了cURL加载函数。
答案 1 :(得分:0)
今天偶然发现了这个问题。似乎我的PHP SDK(v.3.2.2)提供了一个解决问题的函数:setExtendedAccessToken()。 (几乎完全相同的事情:调用图形的“/ oauth / access_token”并将旧标记与“长寿”标记交换。)