2011-05-18 39 views
3

所以我對Facebook開發和PHP開發相當新,所以請裸露。關於使用PHP的Facebook會話的基本問題

我創建了一個iframe Facebook應用程序。我毫不費力地抓取已簽名的請求並使用該信息在我的頁面上執行基本任務。

真正的問題發生在我開始在Facebook內導航我的應用程序時。我似乎失去了我的簽名請求信息。

我有我的PHP代碼包含在每個頁面上,我仍然不能保留我的簽名請求或會話....無論它被稱爲。

我粘貼了下面的基本PHP代碼。

<?php 

include_once "../lib/facebook.php"; 

$facebook = new Facebook(array(
"appId" => FACEBOOK_APP_ID, 
"secret" => FACEBOOK_SECRET_KEY, 
"cookie" => true, 
"domain" => SERVER_DOMAIN 
)); 

function parse_signed_request($signed_request, $secret) { 
    list($encoded_sig, $payload) = explode(".", $signed_request, 2); 

    // decode the data 
    $sig = base64_url_decode($encoded_sig); 
    $data = json_decode(base64_url_decode($payload), true); 

    if (strtoupper($data["algorithm"]) !== "HMAC-SHA256") { 
    error_log("Unknown algorithm. Expected HMAC-SHA256"); 
    return null; 
    } 

    // check sig 
    $expected_sig = hash_hmac("sha256", $payload, $secret, $raw = true); 
    if ($sig !== $expected_sig) { 
    error_log("Bad Signed JSON signature!"); 
    return null; 
    } 

    return $data; 
} 

function base64_url_decode($input) { 
    return base64_decode(strtr($input, "-_", "+/")); 
} 


session_start(); 

if (isset($_SESSION['fb_data'])) { 
    $data = $_SESSION['fb_data']; 
} else { 
    $data = parse_signed_request($_REQUEST["signed_request"], FACEBOOK_SECRET_KEY); 
    $_SESSION['fb_data'] = $data; 
} 

session_write_close(); 

$page_id = $data["page"]["id"]; 
$like_status = $data["page"]["liked"]; 

?> 
+0

我對Facebook API沒有經驗,但在腳本中沒有看到任何會話保存的內容。除非將數據保存到$ _SESSION數組,否則它將在另一個請求中丟失。 – 2011-05-18 14:07:50

+0

所以也許如果我做這樣的事情: <?php session_start(); $ _SESSION ['fb_data'] = $ data; ?> 然後,我將能夠訪問$ fb_data以獲取頁面ID和類似狀態? – Smccullough 2011-05-18 14:10:45

+0

我想是的。如果你做$ _SESSION ['fb_data'] = $ data;那麼你可以做$ data = $ _SESSION ['fb_data'];在另一個PHP腳本中。但是,我不知道Facebook API的一些事情,因此可能會有所不同。 – 2011-05-18 14:14:08

回答

6

signed_request僅在第一次加載爲Facebook Canvas頁面時纔會傳遞到您的頁面。 signed_request作爲POST變量傳入。如果您在iframe級別而不是頂級級別導航到不同頁面,則會丟失signed_request參數。

例如,當用戶負載當前頁:

http://apps.facebook.com/test_app/ 

Facebook將加載此其iframe內:

http://yourserver.com/test_app/ 
  • 而在signed_request傳遞作爲POST變量。

如果然後導航到使用下面的標籤不同的網頁:

<a href="http://yourserver.com/test_app/page2"> Page 2 </a> 

signed_request參數都將丟失。

相反,您可以通過signed_request參數傳遞的GET變量:

<a href="http://yourserver.com/test_app/page2?signed_request=xxxxx"> Page 2 </a> 

或者在頂層重新加載頁面:

<a target="_top" href="http://apps.facebook.com/test_app/page2"> Page 2 </a> 
+0

A +創建這些示例!感謝您更詳細地解釋它,這太棒了!我結束了與我構建的這個小傢伙.... [編輯原始帖子] – Smccullough 2011-05-20 06:00:13