2013-01-19 97 views
0

這個問題真的令人沮喪,因爲我可以看到是什麼導致它,但無法找到解決方案。正在檢索Facebook訪問令牌不適用於curl或file_get_contents

當試圖實現一個Facebook訪問令牌首先我的網址:

$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&client_secret=".$app_secret."&code=".$code; 

接下來我曾嘗試都使用url_decode和捲曲,像這樣:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $token_url); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  
$response = curl_exec($ch); 
curl_close($ch); 

,捲曲,響應空(即使將returntransfer設置爲true)。

所以下次我嘗試的file_get_contents像這樣:

$response = file_get_contents($token_url); 
echo $response; 

這就產生,這表明它不正確解析URL錯誤。

警告: 的file_get_contents(https://graph.facebook.com/oauth/access_token?client_id=XXXXXXXX & REDIRECT_URI = HTTP%3A%2F%2Flocalhost%3A8000%2F & client_secret = XXXXXXXXXXXXXXXXXX &代碼= AQAw8Y3fehv2IWxhmQs9M28IsP4hAzwL5pnvSJkb2v_9H61Gpt659IgMHLgvgRH46tXl8BAL0SRyilKqVay4b4Su68nzT2OmbVK88eNHdGQqIaR_N7X8noIkQTeq_HuEImLlxQwbFcg_PJ5EGh9l392KL2OFqi8qplgOE5m21qlKOvVvUE3cZrcfk_mmr9FUm5eQXIvEp8sUYHxHAXvvyNmV [function.file-GET-內容]:未能打開流:HTTP請求失敗HTTP/1.0 400錯誤的請求 在C:!\用戶\馬克\工作空間\決不\水砂-5942 \的index.php上線

通過消除"amp;"鏈接的作品,你可以看到直接在瀏覽器中打開URL正確的響應。

如何防止"amp;"成爲url的一部分?我無法在任何地方看到任何額外的空間,並且我編碼了我的網址(http:// localhost:8000 /)

我在做什麼錯?

UPDATE:

較大的代碼示例:

require 'sdk/src/facebook.php'; 

    $app_id = "123456778"; 
    $app_secret = "XXXXXXXXXXXXX"; 
    $my_url = "http://localhost:8000/"; 

    session_start(); 

    @$code = $_REQUEST["code"]; 

    if (!isset($_REQUEST["code"])) { 

    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection 
    $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=". $app_id . "&redirect_uri=" . $my_url . "&state=" . $_SESSION['state'] . "&scope=email"; 

    echo("<script>top.location.href='" . $dialog_url . "'</script>"); 
    } 

if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) { 

    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&redirect_uri=".urlencode($my_url)."&client_secret=".$app_secret."&code=".$code; 
    echo "value of token:"; 
    echo $token_url; 

    /* curl section (commenting out) */ /* 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_URL, $token_url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);  
    $response = curl_exec($ch); 
    curl_close($ch); */ 

    echo "command:"; 
    echo $token_url; 
    echo "value:"; 
    $response = file_get_contents($token_url); 
    echo $response; 
    $params = null; 
    parse_str($response, $params); 
+0

如果您在預計只有'&'的地方看到'&',那麼很有可能您的URL編碼中包含'&'的值最初是一次性的或錯誤的。你可能會這樣做,無法在當前的代碼片段中找到。 – CBroe

+0

嗨@CBroe,我已經更新並附加了一個更大的代碼片段。我曾嘗試在$ dialog_url上使用urlencode,但沒有幫助。 – Mark

+1

你爲什麼試圖自己實現所有這些東西 - 你爲什麼不使用PHP SDK來處理所有這些問題? – CBroe

回答

1

我有同樣的問題,並制定

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 

工作。

從cURL 7.10默認設置爲TRUE。