几天来,我一直在尝试从客户的网站成功发布到他们的Facebook页面墙上。我需要能够在没有用户登录的情况下做到这一点,这是我通过访问文档中提供的URL生成的扩展访问令牌实现的。
我想做的是使用PHP SDK获取一个扩展令牌,就像在这个问题中一样——Facebook PHP SDK:geting"长寿命";现在访问令牌;offline_access"已弃用,但我收到以下错误:(#200) The user hasn't authorized the application to perform this action
Graph API资源管理器生成的auth令牌的调试将我显示为用户,并包括所需的manage_pages
和status_update
作用域。但是,如果我运行me/accounts
,perms
数组不会在相关页面的数据下列出这些内容——不确定这是否相关。
以下是我尝试使用的代码:
$facebook = new Facebook(array('appId' => 'xxxxxxx', 'secret' => 'xxxxxx'));
$pageID = 'xxxxxxxx';
$facebook->setExtendedAccessToken();
$accessToken = $facebook->getAccessToken();
try {
$page_info = $facebook->api("/$pageID?fields=access_token");
print_r ($page_info);
} catch (FacebookApiException $e) {
echo $e->getMessage();
}
if( !empty($accessToken) ) {
$args = array(
'access_token' => $accessToken,
'message' => "Catch phrase!"
);
$facebook->api("/$pageID/feed","post",$args);
} else {
// Handle error
}
更新我发现,如果我响应getAccessToken()
的输出,结果是应用程序ID和秘密由|
分隔——这是我应该接收的吗?我觉得很奇怪,因为我看到的所有其他代币都是随机的,而且时间更长。
任何帮助都将不胜感激,到目前为止,我已经在这方面浪费了太多时间。这似乎对其他人都有效。
更新2嗨,沃伦!看起来你对这些地方还很陌生,欢迎!感谢您对此的研究,我是否需要将这些代币保存到DB表中,并在每次尝试发布时检查它们是否过期?我只是作为页面发布到页面,显然这需要页面access_token
,而不是我假设的用户access_token
。我相信我在某个地方也读到Page访问令牌从未过期,尽管如果刷新Graph API Explorer页面或请求新的用户令牌,它会更改。非常令人费解。。不知道我是否需要在这个应用程序中获取新代币,或者只使用一个看起来有效的页面access_token
?
也只是查看base_facebook.php文件和以下函数:
/**
* Returns the access token that should be used for logged out
* users when no authorization code is available.
*
* @return string The application access token, useful for gathering
* public information about users and applications.
*/
protected function getApplicationAccessToken() {
return $this->appId.'|'.$this->appSecret;
}
显示函数setExtendedAccessToken()调用getAccessToken()时您正在经历的情况,该函数调用上面的函数在setExtendedAAccessToken内执行以下操作:
$access_token_response = $this->_oauthRequest(
$this->getUrl('graph', '/oauth/access_token'),
$params = array(
'client_id' => $this->getAppId(),
'client_secret' => $this->getAppSecret(),
'grant_type' => 'fb_exchange_token',
'fb_exchange_token' => $this->getAccessToken(),
)
);
该函数的返回是{"error":{"message":"No user access token specified","type":"OAuthException","code":1}},但由于没有access_token,该函数只返回false
fb_exchange_token不能是应用程序id和应用程序机密的组合。
我已经做了一些测试,我发现如果你让用户登录,你就可以获得访问令牌。如果将此令牌传递到setAccessToken中,则运行setExtendedToken。如果通过运行getAccessToken保存令牌,则可以在用户注销后使用此令牌。
$facebook->setAccessToken($facebook->getAccessToken());
$facebook->setExtendedAccessToken();
$access_token = $facebook->getAccessToken(); // save this for later use
你需要让用户登录,请求他们允许访问该帐户。如果你需要访问facebook页面,请确保他们是管理员,并要求获得manage_page权限。
希望这能帮助
根据我目前所发现的,用户登录时返回的扩展令牌不会过期,因为您无法返回unix时间戳,因此无法知道它何时过期。
这就是我在申请中所做的。
请求用户登录到facebook,但访问权限除外。使用getAccessToken获取当前访问令牌。有了这个,我传入getExtendedAccessToken,然后再次运行getAccessToken,最终获得扩展访问令牌,并将其存储在数据库中以备将来使用。
$facebook = new Facebook(array(
'appId' => 'YOURAPPID',
'secret' => 'YOURSECRET',
));
$params = array(
'scope'=>'publish_stream,manage_pages'
);
$loginUrl = $facebook->getLoginUrl($params); // Use this to request them to login in then when they are do the following you will need them to return to your app
$facebook = new Facebook(array(
'appId' => 'YOURAPPID',
'secret' => 'YOURSECRET',
));
$facebook->setAccessToken($facebook->getAccessToken());
$facebook->setExtendedAccessToken();
$access_token = $facebook->getAccessToken(); // store $access_token for later use