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

Facebook页面选项卡应用程序会话跨子页面PHP SDK 4,facebook,facebook-graph-api,facebook-php-sdk,Facebook,Facebook Graph Api,Facebook Php Sdk,请进一步查看完整的原始问题 使用最新的Facebook PHP SDK 4.4.0,在我的主应用程序页面中,我可以执行以下操作以获取用户id等。 这在我的应用程序的子页面上不起作用。。。为什么会丢失会话和已签名的请求?如何将它们取回,以及如何从FacebookPageTabHelper获取getUserId等方法以继续处理子页面 原问题全文 我对Facebook应用程序开发相当陌生,我在会话管理方面遇到了问题,我似乎无法集中注意力。当然,官方文件几乎毫无用处也无济于事 我的问题是,当从应用程序

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

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

这在我的应用程序的子页面上不起作用。。。为什么会丢失会话和已签名的请求?如何将它们取回,以及如何从FacebookPageTabHelper获取getUserId等方法以继续处理子页面

原问题全文

我对Facebook应用程序开发相当陌生,我在会话管理方面遇到了问题,我似乎无法集中注意力。当然,官方文件几乎毫无用处也无济于事

我的问题是,当从应用程序主页移动到Facebook页面选项卡应用程序iframe中的子页面时,页面会话丢失

我使用以下PHP代码在主初始应用程序页面上获取会话和用户id,效果非常好:

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

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

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

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


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

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

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

我是这样做的:

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

我建议将FacebookSession实例放到PHP会话中。@CBroe感谢您的建议。我想到了这一点,但我不只是需要这个会议,也许我必须在我的问题中澄清这一点,我还需要保持与Facebook的联系。有没有办法使用保存的会话重新建立与Facebook的连接?你说的“保持连接”是什么意思?如果您有一个有效的用户会话,那么您可以使用它来发出API请求,这就是它的用途。@CBroe很抱歉不清楚!请参阅上面的第二次编辑。通过保持连接,我的意思是我希望facebook会话在应用程序的子页面上保持。同样,我是FB应用程序开发的新手,可能我并不完全理解它背后的概念:只需尝试将FacebookSession放入PHP会话中,然后在下面的页面中检索它…
<?php
FacebookSession::setDefaultApplication(APP_ID, SECRET);
$helper = new FacebookRedirectLoginHelper( PAGE_URL );
$pageHelper = new FacebookPageTabHelper();
$session = $pageHelper->getSession();
?>
// 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>';