Facebook粉丝门不工作

时间:2014-06-13 08:38:24

标签: php facebook

因此,我使用"粉丝门"为页面选项卡创建了一个Facebook应用程序,但问题是signed_request无法正常工作,因此我无法接收用户页面状态。我总是收到Not in iframe!消息,但页面会在iframe中打开...

这是我的主页代码:

<?php

function parsePageSignedRequest() {
  if (isset($_REQUEST['signed_request'])) {
    $encoded_sig = null; $payload = null;
    list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
    $sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
    $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));
    return $data;
  }
  return false;
}


if($signed_request = parsePageSignedRequest()) {
  if($signed_request->page->liked) {
    include 'fan.php';
  } else {
     include 'no_fan.php';
  }
} else {
  echo 'Not in iframe!';
}


?>

2 个答案:

答案 0 :(得分:0)

signed_request仅适用于页面标签中加载的第一页。

如果在iframe中,在调用脚本之前执行重定向,则signed_request将从$ _REQUEST中消失。

解决方案是在每次可用时将signed_request(至少是您需要的信息)放入会话中,然后直接在此会话中获取您想要的内容,而不是直接获取signed_request。

也许您可以尝试使用Facebook PHP SDK(https://developers.facebook.com/docs/reference/php/4.0.0)。它使用起来非常简单,并且有一个getSignedRequest()方法可以避免在操作时出错。

答案 1 :(得分:0)

您只需要在应用的初始页面加载时检查signed_request - 仅将Facebook帖子的数据加载到它加载到其中的第一页iframe。

我通常使用会话解决这个问题:

if (isset($_REQUEST['signed_request'])) {

    $encoded_sig = null;
    $payload = null;
    list($encoded_sig, $payload) = explode('.', $_REQUEST['signed_request'], 2);
    $sig = base64_decode(strtr($encoded_sig, '-_', '+/'));
    $data = json_decode(base64_decode(strtr($payload, '-_', '+/'), true));

    if($data->page->liked) {            
        $_SESSION['liked'] = true;          
    }           

    } else {
        $_SESSION['liked'] = false;
    }

}

请记住这种方法虽然因为Facebook需要SSL,但是某些版本的Safari阻止所有第三方Cookie会出现问题 - 因此iframe中的应用无权创建所需的会话cookie。这将意味着当您的用户离开第一页时,facebook上的signed_request和会话都消失了......

为了解决这个问题,我倾向于去老学校。将session_id附加到应用中的每个网址 - 因此您需要将?PHPSESSID=<?php echo session_id(); ?>附加到每个网址或表单操作等...

此外,在您的脚本或配置中,您需要告诉PHP使用无cookie会话。 我用:

ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);

通常附加会话ID会有点难看 - 但是当你在iframe中时,没有人真正看到了网址。

相关问题