【问题标题】:Facebook page tab app session across subpages PHP SDK 4跨子页面 PHP SDK 4 的 Facebook 页面选项卡应用程序会话
【发布时间】:2014-11-02 02:02:21
【问题描述】:

在下方查看完整的原始问题

使用最新的 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();
?>

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

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

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

非常感谢您提供有关此主题的任何信息,非常感谢,在这里转圈。

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

【问题讨论】:

  • 我建议将 FacebookSession 实例放入 PHP 会话中。
  • @CBroe 感谢您的建议。我想到了这一点,但我不仅需要会话(也许我必须在我的问题中澄清这一点),我还需要与 Facebook 保持连接。有没有办法使用保存的会话重新建立与 Facebook 的连接?
  • “保持连接”是什么意思?如果您有一个有效的(用户)会话,那么您可以使用它来发出 API 请求,这就是它的用途。
  • @CBroe 很抱歉不清楚!请参阅上面的第二个编辑。通过“保持连接”,我的意思是我希望 facebook 会话在应用程序的子页面中持续存在。同样,我是 FB 应用程序开发的新手,也许我并不完全理解它背后的概念 :)
  • 只需尝试将 FacebookSession 放入您的 PHP 会话中,然后在以下页面中从那里检索它……

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


【解决方案1】:

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

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

我是这样做的:

// 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>';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多