签名请求没有app_data

时间:2013-12-20 10:52:02

标签: javascript php html facebook facebook-php-sdk

我在开发过程中有一个小Facebook应用程序。目标是跟踪用户邀请并计算有多少用户在“用户”下注册。如果达到了目标数量,他们将得到一些礼物。

我的问题是,我无法存储请求ID。

该应用程序的工作方式如下:

首先,使用已安装的应用程序通过JavaScript重定向到Facebook页面。请求网址是apps.facebook.com/XY这对我不好,因为我们想要增加Facebook页面的数字,所以如果应用程序加载它检查网址,如果它是apps.facebook.com它重定向到Facebook页面。因为它是一个javascript重定向,所以我只能在app_data部分保存请求ID。

这是获取请求ID的PHP部分:

    $request_ids = "";

if(isset($_REQUEST['request_ids'])){

    if (!isset($_SESSION["RI"]))
    {
        $_SESSION["RI"] = $_REQUEST['request_ids'];
    }else{
        $request_ids = $_SESSION["RI"];
    }
}

这是BODY中的JavaScript部分:

        <script type="text/javascript">
    function NotInFacebookFrame() {
         return top === self;
    }
    function ReferrerIsFacebookApp() {
         if(document.referrer) {
        return document.referrer.indexOf("apps.facebook.com") != -1;
        }
        return false;
        }
         if (NotInFacebookFrame() || ReferrerIsFacebookApp()) {
        top.location.replace("<?= $fbPageAppURL.'&app_data='.$request_ids ?>");
        }
        function sendRequestViaMultiFriendSelector() {
            FB.ui({
            method: 'apprequests',
            message: "<?= $friendInviteMessage ?>"
            });
        } 
    </script>

重定向后,app_data IS设置我可以在URL中看到它,但signed_request没有设置app_data。我将已签名的请求存储在会话变量中,因为我在应用程序中有子页面,这样就可以设置已签名的请求:

    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);

所以在此之后var_dump($ signed_request);从来没有app_data :(

有人可以帮帮我吗?非常感谢你!

更新:好的,现在我看到,$ signed_request不对...如果我在没有请求链接的情况下加载应用程序,它总是将我重定向到“请喜欢页面”部分:

    $page_id = $signed_request["page"]["id"];
$like_status = $signed_request["page"]["liked"];

    if(!$like_status){
        header("Location: notfan.php");
        exit;
    }

因此签名的请求没有app_data,也没有页面和类似的信息...... :(

编辑:这是签名请求和请求ID处理的完整代码:

    $signed_request = $facebook->getSignedRequest();
$request_ids = "";

if(isset($_REQUEST['request_ids'])){

    if (!isset($_SESSION["RI"]))
    {
        $_SESSION["RI"] = $_REQUEST['request_ids'];
    }else{
        $request_ids = $_SESSION["RI"];
    }
}

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 :(得分:1)

这是我处理app_data的方式:

signed_request:

$fbsr = $facebook->getSignedRequest();
if ($fbsr['app_data'])
{
    parse_str(base64_decode($fbsr['app_data']), $app_data);
    $_GET = array_merge($_GET, $app_data);
}

和链接

$app_data = base64_encode(http_build_query(array('key' => 'value')));
$url = 'https://www.facebook.com/pages/' . $page_name . '/' . $page_id . '?sk=app_' . $appId . '&app_data=' . $app_data;

也许它可以帮到你。

修改

在您的代码中看到:

top.location.replace("<?= $fbPageAppURL.'&app_data='.$request_ids ?>");

$request_ids必须是base64_encoded查询字符串,如下所示:

top.location.replace("<?= $fbPageAppURL.'&app_data='.base64_encode(http_build_query($request_ids)) ?>");

$request_ids是字符串:

top.location.replace("<?= $fbPageAppURL.'&app_data='.base64_encode(http_build_query(array('request_ids' => $request_ids))) ?>");