Facebook graph api Facebook PHP/JS Sdk此授权代码已被使用错误

Facebook graph api Facebook PHP/JS Sdk此授权代码已被使用错误,facebook-graph-api,facebook-javascript-sdk,facebook-php-sdk,Facebook Graph Api,Facebook Javascript Sdk,Facebook Php Sdk,我正在使用Facebook php和js sdk 我正在用JSSDK登录facebook。登录工作完美 我有php部分 private $helper, $api_id, $app_secret, $session; .... FacebookSession::setDefaultApplication($this->api_id, $this->app_secret); $this->helper = new FacebookJavaScriptLogin

我正在使用Facebook php和js sdk

我正在用JSSDK登录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;
}
当页面正常加载时,我可以毫无问题地获取用户数据

但例如,如果我多次按f5刷新页面,我会得到一个错误消息“此授权码已被使用。”或“此授权码已过期”。并且用户数据为空

想法是使用js登录,并使用php部件验证用户是否登录到facebook

我正在使用最新的facebook php sdk:


谢谢。

有几种方法可以解决这个问题

1) 每次调用都必须更新cookie中的访问令牌,FB不会自动执行此操作。因此,请确保使用
状态:true
参数调用
FB.init

    FB.init({
        appId      : window.fbId,
        cookie     : true,
        status     : true,
        version    : 'v2.3'
    });
接下来,每次页面刷新都必须调用
FB.getLoginStatus()无论你是否已经连接到Facebook

如果您的应用程序需要执行一些ajax调用,那么这是不起作用的——这仅仅是因为在执行ajax时访问令牌不会更新(除非在每次ajax调用之前调用
FB.getLoginStatus();
,这太过分了)

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;
    }
}
希望我能帮上忙。。。
干杯。

删除您的浏览器历史记录、Cookies这是因为您在之前测试的会话有一些不好的值

这也发生在我身上。:/我也遇到了:(嗯,我尝试了另一个帐户和其他浏览器所有的工作