Facebook 自定义选项卡:我无法在子页面下获取 FacebookSession

Facebook Custom Tab: i can't get FacebookSession under subpages

我想在 facebook 选项卡下整合我的网站(不仅仅是一个特定的部分)并检索用户信息,我成功地完成了它。但问题是我在浏览网站页面时无法获取用户信息。

例如,如果我使用: mysite.org/foo 作为主页面,在这里我可以毫无问题地获取所需的用户信息。 但是当我导航到 mysite.org/foo/bar 然后会话 return null.

   \Facebook\FacebookSession::setDefaultApplication(APP_KEY, APP_SECRET);
    $helper = new \Facebook\FacebookCanvasLoginHelper();

    try {
        $session = $helper->getSession();
    } catch (\Facebook\FacebookRequestException $e) {
        echo "Exception occured, code: ".$e->getCode();
        echo " with message: ".$e->getMessage();
    } catch (Exception $e) {
        echo "Exception occured, code: ".$e->getCode();
        echo " with message: ".$e->getMessage();
    }

我正在使用 javascript sdk 进行日志记录

window.fbAsyncInit = function() {
    FB.init({
      appId      : APP_KEY,
      xfbml      : true,
      version    : 'v2.1'
    });
    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
          console.log('Logged in.');
        }
        else {
          console.log('Logging.');
          FB.login(function(response) {},{scope: 'email'});
        }
    });
  };

提前致谢。

问题已解决:)

我必须用 post 请求替换站点中的所有链接,并在其中发送 'signed_request'。

这是可能需要改进的解决方案

<script type="text/javascript">
$(document).ready(function(){
    var $form = $('<form name="temp" method="POST"/>');
    $form.append('<input type="hidden" name="signed_request" value="<?=$_REQUEST['signed_request']; ?>" />');
    $form.appendTo($('body'));

    $('a').click(function(e){
        var href = $(this).attr('href');
        if(!isExternal(href)){
            e.preventDefault();
            $form.attr('action',href);
            $form.submit();
        }
    });

    function isExternal(url) {
       var match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
       if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) return true;
       if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"), "") !== location.host) return true;
      return false;
    }
});</script>