如何使用新的Facebook PHP SDK 3.0.0登录OFFLINE_ACCESS?

时间:2011-05-25 11:37:52

标签: facebook facebook-graph-api facebook-php-sdk

使用旧的(2.x)SDK我用它来记录某人的offline_access:

$session = array
(
    'uid' => $userdata['fb_uid'],
    'sig' => $userdata['fb_sig'],
    'access_token' => $userdata['fb_access_token']
);

$facebook->setSession($session);

在新的SDK中,此功能不再存在。我想我需要登录:

  

setPersistentData($ key,$ value)

但是这个功能受到保护,我不知道'代码'是什么?我需要这个来登录用户吗? 'sig'发生了什么?我不再需要这个了吗?

希望有人已经明白了这一点,因为文档确实无济于事!

3 个答案:

答案 0 :(得分:21)

使用Facebook PHP SDK v3(see on github),它非常简单。要记录具有offline_access权限的人员,请在生成登录URL时询问。这是你如何做到的。

获取离线访问令牌

首先检查用户是否已登录:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();

if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    // The access token we have is not valid
    $user = null;
  }
}

如果不是,则会生成“使用Facebook登录”网址,要求offline_access权限:

if (!$user) {
    $args['scope'] = 'offline_access';
    $loginUrl = $facebook->getLoginUrl($args);
}

然后在模板中显示链接:

<?php if (!$user): ?>
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a>
<?php endif ?>

然后您可以检索离线访问令牌并存储它。要获得它,请致电:

$facebook->getAccessToken()

使用离线访问令牌

在用户未登录时使用脱机访问令牌:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$facebook->setAccessToken("...");

现在您可以为此用户进行API调用:

$user_profile = $facebook->api('/me');

希望有所帮助!

答案 1 :(得分:0)

使用PHP SDK 2.0(我猜),我只是像

一样使用它
$data = $facebook->api( '/me', 'GET', array( 'access_token' => $userdata['fb_access_token'] ) );

这应该适用于较新的一个,因为它似乎更像是一种干净的方法,而不是自己设置会话。你能试试吗?

答案 2 :(得分:0)

Quentin的回答非常好但不完整,我想。它工作得很好,但我的例子getUser()在那段时间没有工作,因为userId(getUser()返回)被缓存。

我已经创建了一种新方法来清除所有缓存并持久保存它。

public function setPersistentAccessToken($access_token) {
  $this->setAccessToken($access_token);
  $this->user = $this->getUserFromAccessToken();
  $this->setPersistentData('user_id', $this->user);
  $this->setPersistentData('access_token', $access_token);
  return $this;
}