2014-06-13 61 views
0

因此,我創建了一個帶有「粉絲大門」的頁面選項卡的Facebook應用程序,但問題是signed_request不工作,所以我無法接收用戶頁面狀態。我總是得到Not in iframe!消息,但頁面中的iframe中打開...Facebook粉絲大門不工作

這是我的主網頁代碼:

<?php 

function parsePageSignedRequest() { 
    if (isset($_REQUEST['signed_request'])) { 
    $encoded_sig = null; $payload = null; 
    list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2); 
    $sig = base64_decode(strtr($encoded_sig, '-_', '+/')); 
    $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true)); 
    return $data; 
    } 
    return false; 
} 


if($signed_request = parsePageSignedRequest()) { 
    if($signed_request->page->liked) { 
    include 'fan.php'; 
    } else { 
    include 'no_fan.php'; 
    } 
} else { 
    echo 'Not in iframe!'; 
} 


?> 
+0

我想你的條件'如果($ signed_request = parsePageSignedRequest())'是錯誤的。你想用這個代碼實現什麼? – Tobi

回答

0

的signed_request僅適用於在頁面加載選項卡的第一頁。

如果在您的iframe中,在調用腳本之前執行重定向,那麼signed_request將從$ _REQUEST消失。

解決的辦法是在每次可用時將signed_request(至少需要的信息)放入會話中,然後在此會話中獲取所需內容而不是直接從signed_request中獲取。

也許你可以嘗試使用Facebook PHP SDK(https://developers.facebook.com/docs/reference/php/4.0.0)。使用起來非常簡單,並且有一個getSignedRequest()方法,可以避免在操作時犯錯誤。

0

您只需在應用程序的初始頁面加載時檢查signed_request - 僅發佈到其加載到其iframe中的第一頁的facebook發佈數據。

我通常解決此使用會話:

if (isset($_REQUEST['signed_request'])) { 

    $encoded_sig = null; 
    $payload = null; 
    list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2); 
    $sig = base64_decode(strtr($encoded_sig, '-_', '+/')); 
    $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true)); 

    if($data->page->liked) {    
     $_SESSION['liked'] = true;   
    }   

    } else { 
     $_SESSION['liked'] = false; 
    } 

} 

請記住這種方法雖然是因爲Facebook需要SSL你將與Safari的某些版本阻止所有第三方Cookie的問題 - 讓你的應用程序中iframe不會有權限創建所需的會話cookie。這意味着你的用戶很快就會從第一頁離開facebook的第一頁sign_request並且會話都消失...

爲了解決這個問題,我傾向於去老派&將session_id附加到應用中的每個URL - so您需要將?PHPSESSID=<?php echo session_id(); ?>附加到每個URL或表單動作等...

此外,在您的腳本或配置中,您需要告訴PHP使用無cookie會話。 我使用:

ini_set('session.use_cookies', 0); 
ini_set('session.use_only_cookies', 0); 
ini_set('session.use_trans_sid', 1); 

通常附加會話ID將是一個有點難看 - 但是當你在一個iframe沒有人真的看到URL反正。