2011-03-16 13 views
11

Bu yüzden, sekmemde bir iFrame kullanıyorum ve kullanıcının gizli içeriği görüntülemek için sayfanın beğenilmesini istediği "yol barikatları" gibi birini yapıyorum. Bunu yapmanın daha iyi ve daha sorunsuz bir yolu var mı?Kullanıcının sayfayı beğenip beğenmediğini kontrol etmenin kusursuz yolu

FBML ile oluşturulmuş sekmeleri biliyorum, izin istemiyorlar, ancak bunun bir iframe OLMADIĞINI tahmin ediyorum.

Teşekkürler!

cevap

20

Elbette yapabilirsin! documentation belirtildiği gibi, Facebook signed_request size bazı ekstra ayrıntıları gönderecektir:

kullanıcı Facebook Sayfa gider, bunlar Sayfa Sekme sonraki kullanılabilir sekme pozisyonunda ilave göreceksiniz. Genel olarak, bir Sayfa Sekmesi, Tuval Sayfası ile tam olarak aynı şekilde yüklenen . Bir kullanıcı Sayfa Sekmesini seçtiğinde, bir ek parametresi, sayfa ile signed_request parametresini alırsınız. Bu parametresi, parametresine sahip bir JSON nesnesini (geçerli sayfasının sayfa kimliği), yöneticiyi (kullanıcı yönetici ise) beğenir ve beğendi (kullanıcı sayfayı beğenmişse). Bir Tuval Sayfasında olduğu gibi, kullanıcısı uygulamanızı yetkilendirene kadar, uygulamanız için erişilebilen tüm uygulamasına erişemezsiniz.

gibi benim tutorial olması gereken bir şey alınan kod:

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

GÜNCELLEME KODU: önceki kod çalışacak iken. İsteğin geçerliliğini kontrol ederek değildi. Bu, birisinin isteği değiştirip yanlış bilgi gönderebileceği anlamına gelir ('un true!'a ayarlanması gibi) (). Kod, signed_request documentation yaklaşımını izleyerek güncellendi.

+1

Teşekkürler! Bunu anladım, ama başka birinin bilmesi gereken durumlarda cevabını yazdığın için minnettarım. – John

+0

Harika cevap ve öğretici. –

İlgili konular