我正在尝试使用Facebook Graph API从Facebook获取相册,并将它们放在我正在处理的网站上。我使用PHP作为我的语言与Codeigniter框架,并重定向到Facebook URL以获取用户的访问令牌。 Facebook向我返回一个访问令牌,我抓住它并将其插入我的数据库。
话虽这么说,当我尝试通过转到图形URL来获取相册的JSON数据时,它会返回错误。图表URL和错误是:
https://graph.facebook.com/1298926000574/photos?access_token=[MY ACCESS TOKEN]
My access token: AQBxqdB64GHNTGY5Yp_IOuMY7NerwNtXVVrp2HwT1qXj02zqU-63KJDyB2jzqurlJ4M0vd7TAu7upA6T7ZYQzIChr2PgD1dpu-6Iebi0WVILbBSBOu-yj7sgcHSGS-Ew4Yio0I9In-1O5jOxbYLDMbI0Zmwk-F1-u-7a8iVvTJram8PvpmdRt5eg
Returned error:
{
"error": {
"message": "Malformed access token [MY ACCESS TOKEN]",
"type": "OAuthException",
"code": 190
}
}
我真的不确定为什么Facebook会一直向我回复此错误。访问令牌很长,我将它作为“文本”字段存储在我的数据库中。我按照他们的指示,现在他们在脚下射击我。任何帮助将不胜感激。
答案 0 :(得分:63)
我有同样的问题,我发现这篇文章正在寻找解决方案。我注意到'我们'的访问令牌有很多奇数符号,而其他只是一个字母数字字符串。
我相信你(和我)犯的错误是将代码与 access_token 混合
将Facebook用户发送到您的api以确认访问权限后,他们会使用$_GET['code']
返回您的网站。此代码需要通过Facebook进行验证,Facebook将在成功时返回 access_token 。
$app_id = [YOUR_APP_ID];
$app_secret = [YOUR_APP_SECRET];
$my_url = [THE_SAME_AS_THE_POST_BEFORE];
$code = $_GET['code'];
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;
$response = file_get_contents($token_url);
$params = null;
json_decode($response, $params);
$access_token = $params['access_token'];
答案 1 :(得分:3)
一个wp插件返回相同的错误,这是解决方案,它可能与您的问题有关:
Php请求access_token,facebook服务器返回它。
包含access_token USED的返回消息如下:
access_token=.......
但对于新创建的应用程序(2012),Facebook服务器返回:
access_token=.....&expires=.....
如果你的代码错误地解析了这个,就像在
中一样$access_token=str_replace('access_token=','',$message);
然后你的$ access_token错误地包含了额外的& expires等。
它应该被解析为:
parse_str($message,$ar); $access_token=$ar['access_token'];
答案 2 :(得分:2)
我遇到了同样的问题。弄清楚它是如何工作的,而且对于那些陷入同样泥潭的人来说也是如此。
require 'facebook-php-sdk/facebook.php';
$facebook = new Facebook(array(
'appId' => 'APP ID',
'secret' => 'SECRET KEY',
));
// Get User ID
$user = $facebook->getUser();
if ($user) {
$accessToken = $facebook->getAccessToken();
try {
$url = "https://graph.facebook.com/1298926000574/photos?access_token=".$accessToken;
$photos = $facebook->api($url);
var_dump($photos);
} catch (FacebookApiException $e) {
$user = null;
}
}
} else {
//echo "You need to login";
header("Location:".$facebook->getLoginUrl());
}
答案 3 :(得分:1)
访问令牌应包含您的应用ID和访问令牌,其中包含管道(|
)字符:123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ
。
注意:在本教程中,我只使用虚拟凭据。它们将与真实的样式相同,但它们的确切值只是一系列递增的数字或字符。 绝不在线发布您的实际凭据!
要求:
123456789012345
ZYxwVUTSRqpONMLKjiHGfeDCbA
如果您按照access token creation guide进行操作,您将找到可以创建一个网址的网址:
GET /oauth/access_token?client_id={app-id}&client_secret={app-secret}&grant_type=client_credentials
如果我们在虚拟凭证中插入,GET请求的URI应如下所示:
http://graph.facebook.com/oauth/access_token?client_id=123456789012345&client_secret=ZYxwVUTSRqpONMLKjiHGfeDCbA&grant_type=client_credentials
回复将是:
{
"access_token": "123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ",
"token_type": "bearer"
}
访问令牌包含您的应用ID,后跟管道(|
),然后是可以称为实际访问令牌的字符串。
要求:
123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ
1234567890
在此示例中,我将关注official facebook guide on sending notifications。他们展示了这个模板:
POST /{recipient_userid}/notifications?access_token=... &template=...&href=...
这意味着,在您填写凭证后,示例POST请求应如下所示:
http://graph.facebook.com/1234567890/notifications?access_token=123456789012345|AbCDefGHijKLMNOpqRSTUVwxYZ&template=Test&ref=notif_test
答案 4 :(得分:0)
您在请求中发送code
而不是access_token
。
Laravel Socialite 用户的解决方案:
使用:
$response = Socialite::driver($provider)->getAccessTokenResponse($request['code']);
$user = Socialite::driver($provider)->userFromToken($response['access_token']);
而不是:
$user = Socialite::driver($provider)->user();
答案 5 :(得分:-1)
由于错误显示格式错误,因此格式化request
时会出错。
https://graph.facebook.com/me/photos/?access_token=[your_accesstoken]
所以它会像
https://graph.facebook.com/me/photos/?access_token=AQBxqdB64GHNTGY5Yp_IOuMY7NerwNtXVVrp2HwT1qXj02zqU-63KJDyB2jzqurlJ4M0vd7TAu7upA6T7ZYQzIChr2PgD1dpu-6Iebi0WVILbBSBOu-yj7sgcHSGS-Ew4Yio0I9In-1O5jOxbYLDMbI0Zmwk-F1-u-7a8iVvTJram8PvpmdRt5eg