2011-03-16 57 views
11

因此,我正在使用我的選項卡上的iFrame,我正在做一個「像路障」,其中用戶需要喜歡頁面以查看祕密內容。有沒有更好,更無縫的方式來做到這一點,然後必須要求許可?無縫的方式來檢查用戶是否喜歡頁面

我知道使用FBML構建的標籤,他們不要求權限,但我猜這是因爲它不是一個iframe。

謝謝!

回答

20

當然你可以!正如documentation提到,Facebook將送你一些額外的細節在signed_request

當用戶導航到Facebook的 頁,他們會看到你的頁面標籤 下一個可用的選項卡 位置添加。大體上,頁面標籤頁 的加載方式與「畫布頁面」的 完全相同。當用戶選擇您的頁面選項卡時,您將收到 signed_request參數,其中一個 附加參數頁面。此 參數包含一個ID爲 的ID(當前爲 頁面的頁面ID),管理員(如果用戶是頁面的管理員 )和喜歡(如果用戶 喜歡該頁面)的JSON對象。與Canvas 頁面一樣,在用戶授權您的應用之前,您將不會收到在signed_request中 應用可訪問的所有 用戶信息,直到 用戶授權您的應用。

從我tutorial應該像拍攝代碼:

<?php 
if(empty($_REQUEST["signed_request"])) { 
    // no signed request where found which means 
    // 1- this page was not accessed through a Facebook page tab 
    // 2- a redirection was made, so the request is lost 
    echo "signed_request was not found!"; 
} else { 
    $app_secret = "APP_SECRET"; 
    $data = parse_signed_request($_REQUEST["signed_request"], $app_secret); 
    if (empty($data["page"]["liked"])) { 
     echo "You are not a fan!"; 
    } else { 
     echo "Welcome back fan!"; 
    } 
} 

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, '-_', '+/')); 
} 
?> 

更新的代碼:雖然前面的代碼會工作。我不是檢查請求的有效性。這意味着有人可能會篡改請求並向您發送虛假信息(,如將admin設置爲true)。代碼已根據signed_request documentation方法更新。

+1

謝謝!我明白了這一點,但我很感激你發佈了答案,以防其他人需要知道。 – John

+0

很棒的答案和教程。 –

相關問題