因此,我使用"粉丝门"为页面选项卡创建了一个Facebook应用程序,但问题是signed_request
无法正常工作,因此我无法接收用户页面状态。我总是收到Not in iframe!
消息,但页面会在iframe中打开...
这是我的主页代码:
<?php
function parsePageSignedRequest() {
if (isset($_REQUEST['signed_request'])) {
$encoded_sig = null; $payload = null;
list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
return $data;
}
return false;
}
if($signed_request = parsePageSignedRequest()) {
if($signed_request->page->liked) {
include 'fan.php';
} else {
include 'no_fan.php';
}
} else {
echo 'Not in iframe!';
}
?>
答案 0 :(得分:0)
signed_request仅适用于页面标签中加载的第一页。
如果在iframe中,在调用脚本之前执行重定向,则signed_request将从$ _REQUEST中消失。
解决方案是在每次可用时将signed_request(至少是您需要的信息)放入会话中,然后直接在此会话中获取您想要的内容,而不是直接获取signed_request。
也许您可以尝试使用Facebook PHP SDK(https://developers.facebook.com/docs/reference/php/4.0.0)。它使用起来非常简单,并且有一个getSignedRequest()方法可以避免在操作时出错。
答案 1 :(得分:0)
您只需要在应用的初始页面加载时检查signed_request - 仅将Facebook帖子的数据加载到它加载到其中的第一页iframe。
我通常使用会话解决这个问题:
if (isset($_REQUEST['signed_request'])) {
$encoded_sig = null;
$payload = null;
list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
if($data->page->liked) {
$_SESSION['liked'] = true;
}
} else {
$_SESSION['liked'] = false;
}
}
请记住这种方法虽然因为Facebook需要SSL,但是某些版本的Safari阻止所有第三方Cookie会出现问题 - 因此iframe中的应用无权创建所需的会话cookie。这将意味着当您的用户离开第一页时,facebook上的signed_request和会话都消失了......
为了解决这个问题,我倾向于去老学校。将session_id附加到应用中的每个网址 - 因此您需要将?PHPSESSID=<?php echo session_id(); ?>
附加到每个网址或表单操作等...
此外,在您的脚本或配置中,您需要告诉PHP使用无cookie会话。 我用:
ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
通常附加会话ID会有点难看 - 但是当你在iframe中时,没有人真正看到了网址。