跨页子PHP SDK 4的Facebook页面选项卡应用程序会话

时间:2014-11-02 02:02:21

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

进一步查看完整的原始问题

使用最新的Facebook PHP SDK 4.4.0,在我的主应用程序页面中,我可以执行以下操作来获取用户ID等。

<?php
FacebookSession::setDefaultApplication(APP_ID, SECRET);
$helper = new FacebookRedirectLoginHelper( PAGE_URL );
$pageHelper = new FacebookPageTabHelper();
$session = $pageHelper->getSession();

echo '<p>You are currently viewing page: '. $pageHelper->getPageId() . '</p>';       
// get user_id
echo '<p>User Id: ' . $pageHelper->getUserId() . '</p>';
// **depcrecated** get like status - use for likegates
echo '<p>You have '. ( $pageHelper->isLiked() ? 'LIKED' : 'NOT liked' ) . ' this page</p>';
// get admin status
echo '<p>You are '. ( $pageHelper->isAdmin() ? 'an ADMIN' : 'NOT an ADMIN' ) . '</p>';
?>

这对我的应用程序的子页面不起作用...为什么会话(以及签名请求)丢失了?我怎样才能找回它们?如何从FacebookPageTabHelper获取getUserId()方法以继续处理子页面?

完整的原始问题

我对Facebook应用程序开发相当新,我遇到会话管理方面的问题,我似乎无法绕过它。当然,官方文档几乎没用也无济于事。

我的问题是,当从应用主页面转移到Facebook页面标签应用iframe中的子页面时,页面会话会丢失。

我使用以下PHP代码获取主(初始)应用页面上的会话和用户ID,它运行良好:

<?php
FacebookSession::setDefaultApplication(APP_ID, SECRET);
$helper = new FacebookRedirectLoginHelper( PAGE_URL );
$pageHelper = new FacebookPageTabHelper();
$session = $pageHelper->getSession();
?>

但它不适用于子页面:(当用户点击菜单项(或app / iframe中的任何其他链接)时,会话再见。这是不理想的,因为我需要用户ID用户跟踪该用户是否已完成某些操作。当然,我可以发送ID以及每个请求,但是必须有一种方法来持续会话,不是吗?

有没有办法在PHP的子页面上检索会话?如果是这样,怎么样?或者我是否必须使用javascript加载其他内容?如果我不能保持请求之间的会话,那么它将如何工作,因此无法确定请求来自哪个用户?别人怎么处理这个?

我想避免的是编写我自己的用户会话管理,这将解决问题,但根本不在预算中,我希望我可以使用Facebook已经提供的东西。特别是因为我的应用程序不需要任何类型的用户信息/权限。

对此主题的任何信息提前多多感谢,非常感谢,在这里圈子。

编辑以澄清:我想过将Facebook会话保存在PHP会话cookie中,但在更改页面后如何使用它来重新连接与Facebook?

1 个答案:

答案 0 :(得分:0)

我终于设法解决了这个问题。我不确定这是否被认为是正确的方式,或者甚至可以推荐这样做,但它有效,因为时间至关重要,我没有多少选择。

如果有人有任何进一步的想法或建议,请发表评论。

以下是我的表现:

// store the signed request 
    if(isset($_REQUEST['signed_request'])) {
        $_SESSION['signed_request'] = $_REQUEST['signed_request'];
    } elseif($_SESSION['signed_request']) {
        $_REQUEST['signed_request'] = $_GET['signed_request'] = $_POST['signed_request'] = $_SESSION['signed_request'];
    } 

// assign the stored signed request to REQUEST, GET and POST vars (the unsavory bit, imo)  
$_REQUEST['signed_request'] = $_GET['signed_request'] = $_POST['signed_request'] = $_SESSION['signedRequest'];

FacebookSession::setDefaultApplication(APP_ID, APP_SECRET);

$accessToken = APP_ID . '|' . APP_SECRET;
$this->session = new FacebookSession($accessToken);

$pageHelper = new FacebookPageTabHelper();

$isAdmin = ($this->pageHelper->getPageData('admin')) ? $this->pageHelper->getPageData('admin') : 0;

// get pade id
echo '<p>You are currently viewing page: '. $pageHelper->getPageId() . '</p>';       
// get user_id
echo '<p>User Id: ' . $pageHelper->getUserId() . '</p>';
// get admin status
echo '<p>You are '. ( $isAdmin ? 'an ADMIN' : 'NOT an ADMIN' ) . '</p>';