Facebook JS和PHP SDK集成

时间:2016-12-12 05:46:31

标签: javascript php facebook facebook-graph-api

我有一个网站,我正在尝试实施Facebook登录。用户将使用Facebook凭据登录,并将能够发布到他们的Facebook时间表。登录过程将通过Javascript SDK进行,但是发布/发布到他们的时间线将通过PHP SDK进行,因为在服务器端也会发生一些额外的数据库事件。

Javascript登录工作正常,但是当我对服务器进行多次Ajax调用时,单次使用访问令牌会导致问题。我在服务器端收到“此授权代码已被使用。”错误。我按照说明使用Facebook开发人员页面https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension创建了一个长期存在的令牌,并确认每个客户都收到了自己的令牌等。

我在服务器上使用getJavaScriptHelper()来确定用户是否已登录(仍然登录),然后再执行任何进一步的处理,但无法确定 如何更新短期访问令牌具有长期存在的客户 。我可以使用服务器端长期令牌将其放入我见过建议的会话中,但除非我遗漏了某些内容,否则我仍然需要弄清楚用户是否仍然登录,管理会话变量,存储和更新该令牌,并在用户注销时删除会话,我认为Facebook SDK会为我做。

其他信息或问题说明。

我可以使用JS SDK,但它可能会使我的代码更复杂,无论如何我只是想按照我认为有意义但现在似乎不完整的Facebook文档,或者我错过了一些东西。

以下是我认为是代码的关键部分,现在忘记了长期存在的令牌: -

Javascript登录代码几乎直接来自Facebook文档。

window.fbAsyncInit = function() {
    FB.init({
        appId      : app_id,
        cookie     : true,
        xfbml      : true,
        version    : 'v2.8'
});

    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            console.log('Logged in.');
        } else {
            FB.login();
        }
    });
};

(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

PHP部分以及我为什么要尝试获取长期访问令牌的原因。登录后,第一个Ajax调用可以正常通过下面的代码,并允许我将一些文本发布到Facebook用户的时间轴。除非我手动重新加载浏览器页面,否则第二次Ajax调用在getAccessToken()失败时使用“此授权代码已被使用”。 如何解决这个问题或我做错了什么?

$fb = new Facebook\Facebook([
    'app_id' => $app_id,
    'app_secret' => $app_secret,
    'default_graph_version' => 'v2.8',
]);

$helper = $fb->getJavaScriptHelper();

try {
    $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    error_log ( 'getAccessToken() - Graph returned an error: ' . $e->getMessage() );
    exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    error_log ( 'getAccessToken() - Facebook SDK returned an error: ' . $e->getMessage() );
    exit;
}

// Further code to publish to users timeline…

0 个答案:

没有答案