2013-03-23 137 views
0

我试图从Facebook获取用户访问令牌与PHP-SDK。服务器端登录过程效果很好,重定向到正确的页面并提供$codeFacebook API:/ oauth/access_token不工作

重定向后(并检查$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调用由于某种原因不能正常工作,或者至少不会采取任何行动。它也不会返回任何错误。

我已经尝试并测试了几个备选方案,例如Facebook教程中建议的get_file_contents()方法,并在上述API调用中添加了其他参数(例如type=client_cred等),但从未成功。

有人明白为什么API调用不起作用吗?它是脚本还是可以在Facebook上设置一些应用程序?

在此先感谢!

+0

你的APP_ID和APP_SECRET是否正确?在你的应用程序配置上是否有正确的URL? – 2013-03-23 14:13:54

+0

@fabio APP_ID和APP_SECRET都是正确的。作为应用程序配置中的网站网址,我已经设置了https://www.domain.com/带有斜线,这应该允许域中的任何文档,对吗? – uLyXes 2013-03-23 14:53:14

+0

尝试将其更改为将接收oauth响应的URL – 2013-03-23 15:15:16

回答

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用于卷曲加载功能。

0

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