我是Facebook SDK for PHP的新手。我在这里有一个非常基本的问题(this answer was not helpful):我目前登录了我的Facebook个人资料,但getUser()
没有返回任何内容。为什么呢?
require_once("vendor/facebook-php-sdk/src/facebook.php");
class Controller_Test extends Controller {
public function action_me()
{
$config = array();
$config['appId'] = 'dfjq454...';
$config['secret'] = 'adfw424...';
$config['fileUpload'] = false;
$facebook = new Facebook($config);
$user = $facebook->getUser();
// Returns '0'
echo "Me: ".$user;
// ...
编辑1:
我尝试在bootstrap.php中取消注释这一行,但它不起作用'auth' => MODPATH.'auth', // Basic authentication
编辑2: 当我运行以下代码时
$user_profile = $facebook->api('/me');
echo "My Profile: ".$user_profile;
我收到此错误
必须使用活动访问令牌来查询有关的信息 当前用户。
编辑3
FacebookApiException [ 0 ]: An active access token must be used to query information about the current user.
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 1272 ]
1267 *
1268 * @param $result array A record storing the error message returned
1269 * by a failed API call.
1270 */
1271 protected function throwAPIException($result) {
1272 $e = new FacebookApiException($result);
1273 switch ($e->getType()) {
1274 // OAuth 2.0 Draft 00 style
1275 case 'OAuthException':
1276 // OAuth 2.0 Draft 10 style
1277 case 'invalid_token':
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 881 ] » BaseFacebook->throwAPIException(arguments)
{PHP internal call} » BaseFacebook->_graph(arguments)
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 654 ] » call_user_func_array(arguments)
APPPATH\classes\Controller\test.php [ 17 ] » BaseFacebook->api(arguments)
SYSPATH\classes\Kohana\Controller.php [ 84 ] » Controller_Test->action_me()
{PHP internal call} » Kohana_Controller->execute()
SYSPATH\classes\Kohana\Request\Client\Internal.php [ 97 ] » ReflectionMethod->invoke(arguments)
SYSPATH\classes\Kohana\Request\Client.php [ 114 ] » Kohana_Request_Client_Internal->execute_request(arguments)
SYSPATH\classes\Kohana\Request.php [ 986 ] » Kohana_Request_Client->execute(arguments)
DOCROOT\index.php [ 118 ] » Kohana_Request->execute()
答案 0 :(得分:2)
来自Facebook Developer documentation:
注意:配置为Native / Desktop应用程序的应用程序将无法进行需要应用程序access_token的API调用。
转到设置→高级,然后将其更改为Web
:
这是导致此问题的最常见原因,将其更改为Web
应解决此问题。
如果情况并非如此,则可能是PHP SDK的一个问题,它依赖于服务器中的$_REQUEST
超全局数组,由于默认情况php.ini
,它已在PHP 5.4.x中发生了变化设置已更改。解决方案 source
是模仿$_REQUEST
中使用base_facebook.php
,$_GET
和$_POST
超级$_COOKIE
的{{1}} - 全球数组。
在base_facebook.php
中找到以下代码:
<?php
protected function getCode() {
if (isset($_REQUEST['code'])) {
if ($this->state !== null &&
isset($_REQUEST['state']) &&
$this->state === $_REQUEST['state']) {
// CSRF state has done its job, so clear it
$this->state = null;
$this->clearPersistentData('state');
return $_REQUEST['code'];
} else {
self::errorLog('CSRF state token does not match one provided.');
return false;
}
}
return false;
}
?>
将其更改为:
<?php
protected function getCode() {
$server_info = array_merge($_GET, $_POST, $_COOKIE);
if (isset($server_info['code'])) {
if ($this->state !== null &&
isset($server_info['state']) &&
$this->state === $server_info['state']) {
// CSRF state has done its job, so clear it
$this->state = null;
$this->clearPersistentData('state');
return $server_info['code'];
} else {
self::errorLog('CSRF state token does not match one provided.');
return false;
}
}
return false;
}
?>
<强> See the difference. 强>
答案 1 :(得分:0)
我遇到了类似的问题,这是可以帮助你的解决方案。
$facebook = new Facebook(array(
'appId' => 'xxxx',
'secret' => 'xxxxx',
"redirect_uri" => "set the uri to point to the same page"
));
$user = $facebook->getUser();
if($user)
{
//your task
} else {
header('location:'. $facebook->getLoginUrl());
}
$user = $facebook->getUser();
if($user)
{
//your task
} else {
header('location:'. $facebook->getLoginUrl());
}