Facebook PHP应用程序,如何检测它';是画布模式还是页面模式?

Facebook PHP应用程序,如何检测它';是画布模式还是页面模式?,php,facebook,Php,Facebook,在iframe.php应用程序中,如何检测自身处于页面模式或画布模式?谢谢 阅读: Facebook将始终发送一个签名请求(用于画布和页面URL) 如果是一个页面,Facebook将添加一个名为page 因此,基于此,您可以执行以下操作: <?php if( isset($_REQUEST['signed_request']) ) { // We are in Canvas or Page now // Let's extract the data from the si

在iframe
.php
应用程序中,如何检测自身处于页面模式或画布模式?谢谢

阅读:

  • Facebook将始终发送一个签名请求(用于画布和页面URL)
  • 如果是一个页面,Facebook将添加一个名为
    page
  • 因此,基于此,您可以执行以下操作:

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

    我还必须在标准中添加网站。这是我的代码

        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';  
    

    感谢我们的解决方案; 我不得不修改它以使其工作

    这就是对我有用的东西; 我注意到,只有在画布下加载站点时,才会发送已签名的请求;但当直接访问时,则不发送已签名的请求

    因此,我结束了使用以下代码:

    if( !isset($_SESSION['signed_request']) && empty($_SESSION['signed_request']) ) {
        exit("direct access not allowed.");
    
    } 
    else
    {
        // echo 'Canvas';
        // continue script
    }
    

    还是这样吗?当我进行实验时,只有当用户到达画布url时,才会发布已签名的_请求。后续页面无法获得它。@FuzzyUnlop,请参考此链接。您可能需要更改url以修改顶级url(使用
    target=“\u top”
    ),而不是在iframe内重定向,在测试时,您将丢失
    已签名的\u请求
    ;我正在收到签名请求
    ;但无法检测
    页面
    参数;请您考虑一下更新日期好吗?