我已经使用PHP和JS SDK构建了一个Facebook应用程序,但感觉好像我构建它的方式完全错误,但我很难找到任何明确的答案(并且在阅读之后)关于这一点的一些帖子和评论,我并不孤单。)
这是使用CodeIgniter和SDK 5.0.0的Canvas应用程序。
我对此应用程序的FB有一些要求:
/me
以获取各种位和bob 我目前在每个页面都有以下JS:
window.fbAsyncInit = function() {
FB.init({
appId : '#####',
xfbml : true,
cookie : true,
version : 'v2.4'
});
loaded();
FB.Canvas.startTimer();
FB.getLoginStatus(function(response) {
// Check login status on load, and if the user is
// already logged in, go directly to the welcome message.
if (response.status == 'connected') {
// Logged in already
} else {
// Otherwise, ask them to log in
window.top.location = '/login.php';
}
});
};
工作正常。 Login.php有一些处理登录的JS,它也很有用。
问题出现在PHP上。我有一个控制器,它扩展到应用程序的每个页面。对于这么简单的事情来说,这似乎非常复杂和过于复杂。这里的PHP产生了很多问题,尽管它最初工作,这使得调试非常困难。所有返回的错误都围绕着被访问的错误 - 有时"不存在',其他时间'无效'以及许多类似的错误。
我真的很难继续前进,所以我们将不胜感激任何帮助,使以下更简单。除主页和登录页面外,每个页面都会调用它:
function handle_facebook()
{
$this->fb = new Facebook\Facebook([
'app_id' => $this->data['app']->fb_app_id,
'app_secret' => $this->data['app']->fb_app_secret,
'default_graph_version' => 'v2.2',
]);
$helper = $this->fb->getCanvasHelper();
$jsHelper = $this->fb->getJavaScriptHelper();
if(!empty($_SESSION['accessToken'])){
$accessToken = $_SESSION['accessToken'];
} else {
try {
$accessToken = $jsHelper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
}
if (! isset($accessToken)) {
echo 'No OAuth data could be obtained from the signed request. User has not authorized your app yet.';
} else {
$_SESSION['accessToken'] = $accessToken;
}
}
try {
// Returns a `Facebook\FacebookResponse` object
$response = $this->fb->get('/me?fields=id,name', $accessToken);
$this->user = $response->getGraphUser();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
}
return true;
}
对我而言,感觉好像我真正需要的是一个独立的JS文件,可以放在需要登录的每个页面上,检查用户仍然登录的日志,如果不是,则提示登录。此外,我觉得从PHP访问SDK应该同样简单,通过从JS Canvas帮助程序获取accessToken并将其存储在会话中,假设一个已经存在。
我哪里错了?我觉得我错过了一个步骤,或者对那些更熟悉Canvas app auth的人显而易见。