在Facebook iframe-app中没有收到signed_request

时间:2012-02-08 08:22:12

标签: facebook facebook-php-sdk

我创建了一个页面标签Facebook应用程序,我希望根据用户是否为粉丝显示不同的内容。 (也称为扇形门,登陆页面或显示页面)

为此,我使用PHP SDK,具体如下代码:

<?php
require 'src/facebook.php';

$facebook = new Facebook(array(
'appId' => 'APP_ID',
'secret' => 'APP_SECRET',
'cookie' => true,
));
?>

在内容中:

<?php   
$signed_request = $_REQUEST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);

if (empty($data["page"]["liked"])) {?>
Thank you for liking our Page!
    <?php } else { ?>
You haven't liked our page yet..
<?php }; 

    // Debugging Code

echo "REQUEST:<br>";
print_r($_REQUEST);

echo "<br>GET:<br>";
print_r($_GET);

echo "<br>POST:<br>";
print_r($_POST);
?>

当我使用我的Facebook用户登录以及在我自己的页面上使用它时,此功能正常。 这意味着signed_request存在于$ _POST和$ _REQUEST中。

但是,当我用其他用户测试时,这些变量中没有signed_request值。

注意: - 我已经看了我的应用程序配置中的URL设置(300重定向和东西),但这看起来很好,就像我说我的用户它正在工作.. - signed_request不只是空的,甚至不存在。

有没有人有类似的问题?

我不介意使用Javascript SDK而不是PHP,如果它可以工作,但我在Javascript方面不是很有经验。

编辑:

我发现你总是需要一个非安全(http)和一个安全(https)的URL。 即使您输入安全URL作为标准URL,Facebook也会使用http与其联系,然后将重定向(取决于服务器配置)到https,这会使您丢失signed_request。

2 个答案:

答案 0 :(得分:5)

我遇到了类似的问题。在我的情况下,问题是在app配置中我没有在引用URL的末尾添加斜杠,该URL引用了一个目录(其中包含index.php)。所以我在最后用斜杠重定向到相同的URL并以这种方式丢失了$ _POST。

答案 1 :(得分:2)

signed_request永远不会通过GET传递POST$_REQUEST根据php.inirequest_ordervariables_order

中的配置包含数据

由于您使用的是PHP-SDK,因此最好将其用于signed_request检索:

$signed_request = $facebook->getSignedRequest();
$liked = $signed_request['page']['liked'];

对于在页面选项卡中运行的应用程序signed_request总是被传递,所以如果你没有得到它,请确保没有重定向会忽略传递POST数据。