2

我有一个使用 JS SDK 的功能性 facebook 应用程序。我可以使用 JS SDK 来获取我的用户 facebook ID 和访问令牌,它似乎工作正常。但是,我的 JS 脚本需要通过 JQuery AJAX 调用一些服务器端 PHP 代码,以便进行一些服务器端相关操作......但我仍然需要访问我的用户在 PHP 代码上的访问令牌。在 PHP SDK 的官方 facebook 文档中,我看到以下内容:

Facebook SDK for PHP 可以与 Facebook SDK for Javascript 结合使用,在应用程序的客户端和服务器端提供无缝会话管理。

要启用此功能,请确保在嵌入和初始化 JS SDK 时,将传递给 FB.init() 的对象的状态和 cookie 参数都设置为 true。

我按照上面写的确切说明进行操作,但在我初始化我的 facebook PHP 对象后,我的 PHP 代码似乎无法获取用户的 facebook ID 和访问令牌。

我想念什么?我不明白,因为根据文档所说,我的用户的访问令牌应该使用 cookie 自动传递给 PHP SDK。

是否应该以其他方式完成?

谢谢!

4

3 回答 3

0

如果access_token是使用 Javascript SDK 检索的,那么您知道您只会在第一个页面加载后(在页面重新加载或 ajax 调用时)获得它。

虽然,请务必检查您的 SDK 是否设置正确(以及通道文件),因为这可能会导致跨域通信出现问题 - 并且因为 cookie 大部分时间都在 iframe 中被阻止,而没有某种黑客攻击(主要在 IE 和 Safari 中)。

此外,JS SDK 将设置的 cookie 将通过 PHP SDK 函数使用,对您来说,这似乎getAccessToken就是您想要的。https://developers.facebook.com/docs/reference/php/facebook-getAccessToken/

于 2012-12-19T01:12:30.820 回答
0

我知道已经很晚了,但是以防万一其他人需要将访问令牌从 JS SDK 传递到 PHP SDK,您可以通过调用来实现它

$jsHelper = $fb->getJavaScriptHelper();
$signedRequest = $jsHelper->getSignedRequest();
$accessToken = $jsHelper->getAccessToken();

有关getJavaScriptHelper()访问者Facebook\Helpers\FacebookJavaScriptHelper的更多详细信息

注意:不要忘记cookie:true在配置中设置FB.init({/*..*/})

于 2021-12-12T19:33:58.497 回答
0

您仍然可以将从 js-SDK 获得的访问令牌与您的 ajax 请求一起传递给 PHP,并将其与 PHP 一起使用。

<script>
  // This is called with the results from from FB.getLoginStatus().
  function statusChangeCallback(response) {
    console.log(response);

    if (response.status === 'connected') {
      // Logged into your app and Facebook.
     // testAPI();  
      var accessToken = response.authResponse.accessToken;
        console.log(accessToken);

       //ajax call to PHP **************************************************************
       //*******************************************************************************
       $.get("/ajaxpage.php?token="+accessToken+"&uid="+response.authResponse.userID,"",function(data){
           // on reply from the server
       });


    } else if (response.status === 'not_authorized') {
      // The person is logged into Facebook, but not your app.

    } else {
      // The person is not logged into Facebook.
    }
  }

  // This function is called when someone finishes with the Login
  // Button.  See the onlogin handler attached to it in the sample
  // code below.
  function checkLoginState() {
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });
  }

  window.fbAsyncInit = function() {
    FB.init({
      appId: '..................',
      cookie: true, // enable cookies to allow the server to access the session
      xfbml: true, // parse social plugins on this page
      version: 'v2.2' // use version 2.2 
    });

  
    FB.getLoginStatus(function(response) {
      statusChangeCallback(response);
    });

  };

  // Load the SDK asynchronously
  (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'));


 <fb:login-button scope="public_profile,email" onlogin="checkLoginState();">
 </fb:login-button>
于 2022-02-13T17:46:11.140 回答