2

我添加了一个 PHP/JavaScript 应用程序作为 Facebook 页面选项卡,并将其托管在 Heroku 上。但是它没有收到signed_request。当我在自己的服务器上托管选项卡时,它就可以正常运行,而不是在 Heroku 上。

这是代码:

require_once('sdk/src/facebook.php');

$facebook = new Facebook(array(
  'appId'  => AppInfo::appID(),
  'secret' => AppInfo::appSecret(),
  'sharedSession' => true,
  'trustForwarded' => true,
  'cookie' => true
));

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

if( $liked ) {
    echo('fan');
}
else {
    echo('not a fan ') ;
}

可能是什么问题?

4

1 回答 1

3

我有同样的问题。如果您使用的是 heroku 的基本 php 模板,请摆脱此代码,这会在生产环境中强制使用 https:

// Enforce https on production
if (substr(AppInfo::getUrl(), 0, 8) != 'https://' && $_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
    header('Location: https://'. $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    exit();
}

当用户不使用安全连接时,此行将重定向到另一个页面丢失 POST 请求。

如果您想保留它,您可以尝试使用 GET 方法发送 signed_request。它可能看起来像这样:

// Enforce https on production
    if (substr(AppInfo::getUrl(), 0, 8) != 'https://' && $_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
        $signed_request = "";
        if (isset($_REQUEST['signed_request'])){
            $signed_request = "&signed_request=" . $_REQUEST['signed_request'];
        }
        header('Location: https://'. $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "?" . $signed_request );
        exit();
    }

这就是我的解决方案。

于 2013-03-06T15:31:47.433 回答