我正在尝试获取用户页面:
<?php
try {
$pages = $facebook->api('/me/accounts?fields=id,name');
if (isset($pages['data'])) {
$this->assign('pages', $pages['data']);
$this->pages = $pages['data'];
}
} catch (\FacebookApiException $e) {
$loginUrl = $facebook->getLoginUrl(
array(
'redirect_uri' => $this->container->getParameter('home_url'),
'scope' => 'email,manage_pages'
)
);
echo '<script type="text/javascript">top.location.href = "'.$loginUrl.'";</script>';
exit;
}
但是我跳进了无休止的重定向循环。经过一些研究后,我发现PHP SDK在getAccessTokenFromCode
方法中来自API的错误。 $access_token_response
变量是:
{"error":{"message":"This authorization code has expired.","type":"OAuthException","code":100}}
PHP SDK从COOKIE获取code
值。问题是fbsr_{app_id}
没有刷新,它仍然包含相同的代码。这就是无限循环的原因。
我该怎么做才能克服这个问题。我正在考虑删除fbsr_{app_id}
cookie但它看起来很奇怪。为什么SDK不能为我处理这个?
答案 0 :(得分:0)
如果您使用的是PHP 5.4,我也遇到了这个问题。我写了一篇关于如何解决这个问题的tutorial。原因是PHP SDK没有正确地获取代码。
如果收到异常,您也可以尝试销毁会话(session_destroy()
或等效的Framework)或手动清除cookie(setcookie ("cookie_name", "", time() - 3600);
)。
修改强>:
确保应用中的App ID和App Secret也是正确的。不正确的应用程序密钥有时会出现问题,因为它用于解码signed_request
。
此外,如果问题是针对IE的,请尝试在代码中添加以下标题:
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT');
IE的安全设置有时会阻止在iframe中设置Cookie。上面的标题应该有所帮助。
答案 1 :(得分:0)
好的,我想我找到了解决方法。我同时使用PHP SDK和JS SDK。我使用以下代码进行重定向:
echo '<script type="text/javascript">top.location.href = "'.$loginUrl.'";</script>';
exit;
但是我添加了JS SDK并且问题不再发生了:
echo "
<div id=\"fb-root\"></div>
<script type=\"text/javascript\">
window.fbAsyncInit = function() {
FB.init({appId: ".$app_id.", status: true, cookie: true, xfbml: true, oauth: true});
FB.getLoginStatus(function(response) {
top.location.href = '".$loginUrl."';
});
};
(function() {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
";
exit;
我不确定它是不是JS SDK / PHP SDK的错误。