2013-03-23 94 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」並將舊的令牌與「長壽命」的令牌進行交換)。