use*_*147 6 facebook-graph-api facebook-javascript-sdk facebook-php-sdk
我正在使用Facebook php和js sdk.
我用js sdk登录facebook.登录工作完美.
我有PHP部分.
private $helper, $api_id, $app_secret, $session;
....
FacebookSession::setDefaultApplication($this->api_id, $this->app_secret);
$this->helper = new FacebookJavaScriptLoginHelper();
try {
$this->session = $this->helper->getSession();
} catch (FacebookRequestException $ex) {
log_message('error', 'Facebook e1 :' . $ex->getCode());
log_message('error', 'Facebook e1 :' . $ex->getMessage());
} catch (\Exception $ex) {
log_message('error', 'Facebook e2 :' . $ex->getCode());
log_message('error', 'Facebook e2 :' . $ex->getMessage());
}
if ($this->session) {
$request = (new FacebookRequest($this->session, 'GET', '/me'))->execute();
$user = $request->getGraphObject()->asArray();
return $user;
} else {
return false;
}
Run Code Online (Sandbox Code Playgroud)
当页面正常加载时,我得到的用户数据没有问题.
但是,例如,如果我按f5几次,刷新页面,我得到并且错误"已使用此授权代码".或"此授权码已过期." 用户数据为空.
想法是用js登录,并使用php部分验证用户是否登录到facebook.
我正在使用最新的facebook php sdk:https://github.com/facebook/facebook-php-sdk-v4
谢谢.
有多种方法可以解决此问题。
1)您必须在每次调用时更新 cookie 中的访问令牌,FB 不会自动执行此操作。因此,请务必使用参数FB.init调用status: true。
FB.init({
appId : window.fbId,
cookie : true,
status : true,
version : 'v2.3'
});
Run Code Online (Sandbox Code Playgroud)
FB.getLoginStatus();接下来,无论您是否已经连接到 Facebook,每次页面刷新都必须调用。
如果您的应用程序需要执行一些 ajax 调用,那么这不起作用 - 仅仅是因为当您执行 ajax 时,访问令牌不会更新(除非您FB.getLoginStatus();在每次 ajax 调用之前调用 - 这太过分了)。
2) 更好的方法是在用户通过 FB JS SDK 连接后将访问令牌存储在会话中。PHP 代码可能如下所示:
try {
$fbToken = isset($_SESSION['fbToken']) ? $_SESSION['fbToken'] : NULL;
if ($fbToken !== NULL) {
$session = new \Facebook\FacebookSession($fbToken);
} else {
$helper = new FacebookJavaScriptLoginHelper();
$session = $helper->getSession();
}
} catch(\Facebook\FacebookRequestException $ex) {
log_message('error', 'Facebook e1 :' . $ex->getCode());
log_message('error', 'Facebook e1 :' . $ex->getMessage());
} catch(\Exception $ex) {
log_message('error', 'Facebook e2 :' . $ex->getCode());
log_message('error', 'Facebook e2 :' . $ex->getMessage());
}
if ($session) {
$accessToken = $session->getAccessToken();
$longLivedAccessToken = $accessToken->extend();
$_SESSION['fbToken'] = $longLivedAccessToken;
$request = (new FacebookRequest($session, 'GET', '/me'))->execute();
$user = $request->getGraphObject()->asArray();
return $user;
} else {
return FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
希望我确实有所帮助...干杯。
| 归档时间: |
|
| 查看次数: |
3862 次 |
| 最近记录: |