我有一个小Facebook应用程序,它开头有一个“喜欢门”。用户必须喜欢该页面才能使用该应用。应用程序本身有一些子页面,所以如果我想让子页面工作,我必须将签名的请求存储到$ _SESSION变量中。我的问题是签名的请求只在app load上发送,此时用户还没有喜欢该页面。因此,如果此时保存已签名的请求,$ signed_request [“page”] [“likes”]将一直返回FALSE ...如何重新加载已签名的请求?
FQL和$ like_data = $ facebook-> api('/ me / likes / PAGE-ID /');不好,因为我希望页面之后的权限对话框就像。
这是现在的代码:
$page_id = $signed_request["page"]["id"];
$like_status = $signed_request["page"]["liked"];
if(!$like_status){
header("Location: notfan.php");
exit;
}else{
if (!isset($_SESSION["SR"]))
{
$_SESSION["SR"] = $_REQUEST["signed_request"];
}else{
$encoded_sig = null;
$payload = null;
list($encoded_sig, $payload) = explode('.', $_SESSION["SR"], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$signed_request = $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
$signed_request = objectToArray($signed_request);
}
}
非常感谢!
答案 0 :(得分:0)
每次在请求中遇到签名请求时都会保存:当用户喜欢该页面时,Facebook会重新加载页面并重新发送已签名的请求
编辑: 你设置$ like_status并在你知道你是否有签名请求之前和你设置$ like_status的值之前检查它。
我先检查请求参数,然后再查询会话,然后填写$ like_status变量,然后检查$ like_status。
这样的事情:
if( isset($_POST['signed_request']) )
{
$_SESSION["SR"] = $_REQUEST["signed_request"];
}
if (!isset($_SESSION["SR"]))
{
//shouldn't even happen now when page is opened through facebook,
//so you might want some error handling here
}
$encoded_sig = null;
$payload = null;
list($encoded_sig, $payload) = explode('.', $_SESSION["SR"], 2);
$sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
$signed_request = $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
$signed_request = objectToArray($signed_request);
$page_id = $signed_request["page"]["id"];
$like_status = $signed_request["page"]["liked"];
if(!$like_status){
header("Location: notfan.php");
exit;
}