我在自己的网络应用程序中使用Facebook应用程序与用户的帐户和页面进行交互。
现在,我正在为用户的页面添加标签,并且我正在使用单独的FB应用程序(因为我希望在同一页面上有多个标签,FB只允许每个应用程序一个) 。我可以添加一个标签,我在测试页面上看到它的链接,这样就可以了。
当我访问选项卡时,问题就开始了。标签页中的iframe向我的应用程序发出POST请求到正确的URL,但是当我尝试获取有关该页面的信息时,我得到一个例外:
exception 'Facebook\FacebookSDKException' with message 'Invalid signed request, missing OAuth data.' in /myprojectpath/vendor/facebook/php-sdk-v4/src/Facebook/FacebookSession.php:343
我在撰写本文时使用了最新版本的PHP PHP SDK(4.0.6),而且令人困惑的代码是:
FacebookSession::setDefaultApplication($my_app_id, $my_app_secret);
$session = FacebookSession::newSessionFromSignedRequest($_POST['signed_request']);
我知道这个问题:https://github.com/facebook/facebook-php-sdk-v4/issues/14 我已经在使用4.0.6版了,所以这不应该是问题所在。此外,我的观点正是我不想或不需要将用户重定向到登录页面,因为我不希望用户只需登录才能看到页面标签。
我错过了什么?
答案 0 :(得分:0)
newSessionFromSignedRequest
功能仅在用户已登录选项卡应用程序时才起作用。如果会话不存在,您将需要要求用户登录。
尝试这样的事情:
// redirect.php should redirect the user back to the Facebook Page
$helper = new FacebookRedirectLoginHelper( 'http://yourwebsite.com/redirect.php' );
try {
// try to get the page session
$session = FacebookSession::newSessionFromSignedRequest( $_POST['signed_request'] );
} catch( FacebookRequestException $ex ) {
// When Facebook returns an error
} catch( Exception $ex ) {
// When validation fails or other local issues
}
// see if we have a session
if ( isset( $session ) ) {
// print logged-in user's ID
print_r( $session->getSessionInfo()->asArray()['user_id'] );
// print logout url using session
echo '<a href="' . $helper->getLogoutUrl( $session, 'http://yourwebsite.com/logout.php' ) . '">Logout</a>';
} else {
// show login url
echo '<a href="' . $helper->getLoginUrl( array( 'email', 'user_friends' ) ) . '" target="_top">Login</a>';
}