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

问题描述:

与我用这个登录有人offline_access老(2.X)SDK:如何使用新的Facebook PHP SDK 3.0.0使用OFFLINE_ACCESS登录?

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

$facebook->setSession($session); 

在新的SDK此功能犯规存在了。我想我需要使用登录:

setPersistentData($键,$值)

不过这个功能受到保护,我不知道什么是“代码”是什么?我是否需要这个来登录用户? 'sig'怎么回事?我不需要这个了吗?

希望有人已经知道这一点,因为文档真的没有帮助!

+0

mhhh ...似乎你只需要使用$ facebook-> setAccessToken()来设置access_token,就是这样... – Martin 2011-05-25 11:46:37

使用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登入” URL请求的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'); 

希望有所帮助!

+0

这很有用,谢谢,但是PHP代码记录在代码以外的地方吗? – Brenden 2011-06-17 22:26:53

+0

[Facebook开发者文档](https://developers.facebook.com/docs/)中没有关于PHP SDK的文档。您可以阅读代码,阅读SDK提供的示例并在Internet上查找其他示例。你需要其他具体的东西吗? – Quentin 2011-06-17 23:20:01

+0

如何在不手动登录的情况下生成'offline_access'令牌? – Andrew 2012-02-19 01:45:00

随着PHP SDK 2.0(我猜),我只是用它像

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

这应与较新的一个工作,因为它似乎是更清洁的方式不是由我们自己而建立的会话。你能试一下吗?

昆汀的答案相当不错,但不完整,我想。它工作的很好,但我例如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; 
}