在页面之后存储正确的签名请求

时间:2013-12-22 11:00:46

标签: php facebook facebook-graph-api facebook-php-sdk

我有一个小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);
            }
    }

非常感谢!

1 个答案:

答案 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;
}