问题描述
|
在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
}