2011-08-16 32 views
3

我試過用curl來通過curl得到facebook codeaccess_token。所以我可以在牆上張貼消息。我知道sdk,但是如果我只用簡易curl的方法?如何通過curl獲取Facebook令牌代碼?

一些故障回報:

Method Not Implemented

Invalid method in request

這裏是我的代碼。順便說一句:如何記住一個access_token如果它在1小時內仍然有效?謝謝。

$code_url = "https://graph.facebook.com/oauth/authorize?client_id=".$app_id."&redirect_uri=".urlencode($canvas_page_url)."&type=client_cred&display=page&scope=user_photos,publish_stream,read_stream,user_likes"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$code_url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1); 
curl_setopt($ch, CURLOPT_HEADER  ,0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1); 
$fb_code = curl_exec($ch); // get code 
curl_close($ch); 

$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&client_secret=".$app_secret."&redirect_uri=".urlencode($canvas_page_url)."&code=".$fb_code.""; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL,$token_url); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION ,1); 
curl_setopt($curl, CURLOPT_HEADER  ,0); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER ,1); 
$result = curl_exec($curl); 
curl_close($curl); 
echo $result; //get token for post to wall 

編輯:

$app_id = "14XXXXXXXX"; 
    $app_secret = "77XXXXXXXXXXXXXXXXXXXXXXX"; 
    function get_app_access_token($app_id, $secret) { 
    $url = 'https://graph.facebook.com/oauth/access_token'; 
    $token_params = array(
     "type" => "client_cred", 
     "client_id" => $app_id, 
     "client_secret" => $app_secret 
     ); 
    return str_replace('access_token=', '', post_url($url, $token_params)); 
    } 
    $token = get_app_access_token($app_id,$app_secret); 
    echo $token; 
+0

在您的編輯中,您不會顯示post_url方法 - 您是否也將其複製/粘貼到您的示例中? – DSchultz

+0

@DSchultz,是的,我做了,粘貼所有給定的代碼。返回'400錯誤的請求'。 –

回答

5

嘗試這些輔助方法,這將使捲曲調用圖形API和應用程序返回的access_token。

該函數接受一個URL和一個參數數組,並通過捲曲使得POST:

function post_url($url, $params) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params, null, '&')); 
    $ret = curl_exec($ch); 
    curl_close($ch); 
    return $ret; 
    } 

這個函數在developer app提供應用ID和祕密,並返回的活性的access_token爲應用程式:

function get_app_access_token($app_id, $secret) { 
    $url = 'https://graph.facebook.com/oauth/access_token'; 
    $token_params = array(
     "type" => "client_cred", 
     "client_id" => $app_id, 
     "client_secret" => $secret 
     ); 
    return str_replace('access_token=', '', post_url($url, $token_params)); 
    } 

可以調用像這樣$token = get_app_access_token('APP_ID','SEKRET');

+0

我已經把我的'app_id'和'app_secrect'放在裏面,我嘗試了'$ token = get_app_access_token('APP_ID','SEKRET');''echo $ token'','400 bad request'我編輯代碼我的問題 –

+0

你可以發佈到底如何調用它,而不提供你的整個祕密?我只是用兩個獨立的應用程序嘗試過,它按預期工作。 – DSchultz

+0

哪個令牌是這個?這是oAuth嗎? –

2

的方法,他們真的應該理解得更爲清晰的FB指導,但他重新爲我工作。與許多人在網上所說的不同,您不會執行GET curl調用,但仍會執行POST調用。

因此,您發佈的URL將是「https://graph.facebook.com/oauth/access_token?」

然後,你會養活你CURLOPT_POSTFIELDS POST變量將是這樣的:

"client_id=YOUR_CLIENT_ID&redirect_uri=" . urlencode("YOUR_URL") . "&client_secret=YOUR_CLIENT_SECRET&code=YOUR_RECEIVED_CODE" 

我是從字面上試圖爲至少1.5小時試圖得到這個工作。每次我在瀏覽器中訪問URL時都沒有問題,每當我嘗試運行GET curl命令或POST命令(其中所有變量仍在url中)時(並未在POSTFIELDS中指定)都失敗。這真的很煩人。

+0

中得到一個空字符串,acebook access_token會每2小時更改一次。這真的很煩人。很久以前,我搜索了網頁,看到有人說,他每小時都會運行自己帳戶的登錄腳本,將'access_token'保存到數據庫,然後將'access_token'分享給他所有的用戶。做搜索,發佈和其他任何事情。這不是一種完整性方法,但它確實有一些效果。我很高興與所有人討論這個話題。感謝和快樂x'mas –

相關問題