Facebook PHP应用程序,如何检测它';是画布模式还是页面模式?
在iframeFacebook 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
.php
应用程序中,如何检测自身处于页面模式或画布模式?谢谢 阅读:
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请求
;我正在收到签名请求
;但无法检测页面
参数;请您考虑一下更新日期好吗?