Facebook PHP应用程序,如何检测它处于“画布”或“页面”模式?

问题描述

| 在iframe@H_404_0@
.PHP
应用中,如何检测自己处于页面模式还是画布模式?谢谢!     

解决方法

阅读文档: Facebook始终会发送“ѭ1”(用于画布和页面网址) 如果是页面,Facebook将添加一个附加参数parameter2ѭ 因此,基于此,您可以执行以下操作:
<?php
if( isset($_REQUEST[\'signed_request\']) ) {
    // We are in Canvas or Page now

    // Let\'s extract the data from the signed_request 
    // to check if we are inside a Facebook Page
    $app_secret = \"APP_SECRET\";
    $data = parse_signed_request($_REQUEST[\"signed_request\"],$app_secret);

    if( isset($data[\"page\"]) ) {
        echo \"Page\";
    } else {
        echo \"Canvas\";
    }
} else {
    echo \"None,or something went wrong!\";
}

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

?>
    ,我还必须在标准中添加网站。这是我的Yii代码
    if(empty($_POST[\'signed_request\']) === false)
        $signedRequest  =   Yii::app()->fb->getSignedRequest(); 

    if(isset($signedRequest[\'page\']))
            $this->layout   =   \'tab\';          

    else if(isset($signedRequest[\'user\']) && ! isset($signedRequest[\'page\']))
        $this->layout   =   \'canvas\';
    else
        $this->layout   =   \'website\';  
    ,感谢@ifaour解决方案; 我必须对其进行修改才能使其正常运行。 这对我有用; 我注意到签名的请求仅在将站点加载到画布下时才发送;但是当直接访问时,则不会发送任何签名的请求。 所以我结束了这段代码:
if( !isset($_SESSION[\'signed_request\']) && empty($_SESSION[\'signed_request\']) ) {
    exit(\"direct access not allowed.\");

} 
else
{
    // echo \'Canvas\';
    // continue script
}