更新2:
好的,通过改变来实现“有点”工作:
$loginUrl = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'publish_stream',
'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php',
'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php'
));
到此:
$loginUrl = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'publish_stream',
'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php',
'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php'
));
header('Location: '.$loginUrl);
即。我添加了header('Location: '.$loginUrl);
。
但页面表现得很奇怪。我必须导航到页面,登录,然后刷新页面,再次登录,然后它会要求我允许发布到页面,并最终发布到页面。
为什么我必须登录两次?
更新1:
我现在有以下脚本似乎不起作用。在这种状态下,我只是想张贴到自己的墙上,但最终也想发布到朋友的墙上:
<?php
/**
*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
require 'facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => '<appId removed for security reasons>',
'secret' => '<secret removed for security reasons>',
'cookie' => true,
));
// We may or may not have this data based on a $_GET or $_COOKIE based session.
//
// If we get a session here, it means we found a correctly signed session using
// the Application Secret only Facebook and the Application know. We dont know
// if it is still valid until we make an API call using the session. A session
// can become invalid if it has already expired (should not be getting the
// session back in this case) or if the user logged out of Facebook.
$session = $facebook->getSession();
$me = null;
// Session based API call.
if ($session) {
try {
$uid = $facebook->getUser();
$me = $facebook->api('/me');
$post = $facebook->api("/me/feed", "POST", array('message' => 'Hello! I\'m using the FB Graph API!'));
} catch (FacebookApiException $e) {
error_log($e);
}
}
// login or logout url will be needed depending on current user state.
if ($me) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'publish_stream',
'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php',
'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php'
));
}
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>php-sdk</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<!--
We use the JS SDK to provide a richer user experience. For more info,
look here: http://github.com/facebook/connect-js
-->
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $facebook->getAppId(); ?>',
session : <?php echo json_encode($session); ?>, // don't refetch the session when PHP already has it
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
// whenever the user logs in, we refresh the page
FB.Event.subscribe('auth.login', function() {
window.location.reload();
});
};
(function() {
var e = document.createElement('script');
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
<h1><a href="example.php">php-sdk</a></h1>
<?php if ($me): ?>
<a href="<?php echo $logoutUrl; ?>">
<img src="http://static.ak.fbcdn.net/rsrc.php/z2Y31/hash/cxrz4k7j.gif">
</a>
<?php else: ?>
<div>
Using JavaScript & XFBML: <fb:login-button></fb:login-button>
</div>
<?php endif ?>
<h3>Session</h3>
<?php if ($me): ?>
<pre><?php print_r($session); ?></pre>
<h3>You</h3>
<img src="https://graph.facebook.com/<?php echo $uid; ?>/picture">
<?php echo $me['name']; ?>
<h3>Your User Object</h3>
<pre><?php print_r($me); ?></pre>
<?php else: ?>
<strong><em>You are not Connected.</em></strong>
<?php endif ?>
</body>
</html>
我收到以下错误:
[Wed Apr 27 22:28:16 2011] [error] [client <ip address removed for security reasons>] OAuthException: (#200) The user hasn't authorized the application to perform this action, referer: http://<ip address removed for security reasons>/index.php
原始问题:
我有以下工作脚本,允许某人使用他们的Facebook详细信息登录我的页面,然后我可以捕获他们的access_token,这样我就可以将它与图表api一起使用:
<?php
/**
*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
require 'facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => 'app id goes here',
'secret' => 'secret id goes here',
'cookie' => true,
));
// We may or may not have this data based on a $_GET or $_COOKIE based session.
//
// If we get a session here, it means we found a correctly signed session using
// the Application Secret only Facebook and the Application know. We dont know
// if it is still valid until we make an API call using the session. A session
// can become invalid if it has already expired (should not be getting the
// session back in this case) or if the user logged out of Facebook.
$session = $facebook->getSession();
$me = null;
// Session based API call.
if ($session) {
try {
$uid = $facebook->getUser();
$me = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
}
}
// login or logout url will be needed depending on current user state.
if ($me) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>php-sdk</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<!--
We use the JS SDK to provide a richer user experience. For more info,
look here: http://github.com/facebook/connect-js
-->
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $facebook->getAppId(); ?>',
session : <?php echo json_encode($session); ?>, // don't refetch the session when PHP already has it
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
// whenever the user logs in, we refresh the page
FB.Event.subscribe('auth.login', function() {
window.location.reload();
});
};
(function() {
var e = document.createElement('script');
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
<h1><a href="example.php">php-sdk</a></h1>
<?php if ($me): ?>
<a href="<?php echo $logoutUrl; ?>">
<img src="http://static.ak.fbcdn.net/rsrc.php/z2Y31/hash/cxrz4k7j.gif">
</a>
<?php else: ?>
<div>
Using JavaScript & XFBML: <fb:login-button></fb:login-button>
</div>
<?php endif ?>
<h3>Session</h3>
<?php if ($me): ?>
<pre><?php print_r($session); ?></pre>
<h3>You</h3>
<img src="https://graph.facebook.com/<?php echo $uid; ?>/picture">
<?php echo $me['name']; ?>
<h3>Your User Object</h3>
<pre><?php print_r($me); ?></pre>
<?php else: ?>
<strong><em>You are not Connected.</em></strong>
<?php endif ?>
</body>
</html>
用户登录后,我了解到我可以通过以下方式获取他们的朋友列表:
https://graph.facebook.com/me/friends?access_token=...
我无法弄清楚如何使用扩展权限,因此我的应用可以发布给用户朋友的facebook墙。
显然我应该使用扩展的权限加上以下内容:
curl -F 'access_token=...' \
-F 'message=Hello, Arjun. I like this new API.' \
https://graph.facebook.com/arjun/feed
我不明白我应该如何从PHP中做到这一点。
答案 0 :(得分:4)
<强>更新强>:
我自己无法真正测试它,所以只需要一些建议就可以尝试。将$loginUrl
更改为此:
$loginUrl = $facebook->getLoginUrl(array(
'req_perms' => 'publish_stream',
'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php',
'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php'
));
在整个上下文中,文件的顶部应如下所示:
require 'facebook.php';
$facebook = new Facebook(array(
'appId' => '<appId removed for security reasons>',
'secret' => '<secret removed for security reasons>',
'cookie' => true,
));
$session = $facebook->getSession();
$me = null;
if ($session)
{
try
{
$uid = $facebook->getUser();
$me = $facebook->api('/me');
$post = $facebook->api("/me/feed", "POST", array('message' => 'Hello! I\'m using the FB Graph API!'));
}
catch (FacebookApiException $e)
{
error_log($e);
}
}
else
{
$loginUrl = $facebook->getLoginUrl(array(
'req_perms' => 'publish_stream',
'next' => 'http://' . $_SERVER['SERVER_NAME'] . '/success.php',
'cancel_url' => 'http://' . $_SERVER['SERVER_NAME'] . '/cancel.php'
));
header('Location: ' . $loginUrl);
}
好吧,首先检查一下您是否有会话,因此您需要像示例中那样配置Facebook SDK:
$facebook = new Facebook(array(
'appId' => 'app id goes here',
'secret' => 'secret id goes here',
'cookie' => true,
));
然后,您可以检查用户是否已登录且您的应用已获得授权:
if ($facebook->getSession() == null) {
// not logged in or not authorized
}
在if
- 子句中,您必须重定向到正确的login-url才能获得所需的所有权限:
$loginUrl = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'publish_stream',
'next' => // url where to go when you were authorized
'cancel_url' => // url to go to when user cancelled
));
header('Location: '.$loginUrl);
获得权限后,您可以使用
按照文档中的说明进行发布$facebook->api(/* url */, array(/* additional parameters go here */));
答案 1 :(得分:1)
Facebook的文档显示了完成此操作的原始实现,即您粘贴的curl调用。这基本上只是演示功能,并没有真正解释如何用您选择的语言完成任务。
正如迈克尔·罗斯在下面指出的那样,首先,您需要申请延长的权限才能在用户的墙上发布。为此,您的$ loginUrl调用应类似于:
$loginUrl = $facebook->getLoginUrl(array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'publish_stream',
'next' => // url where to go when you were authorized
'cancel_url' => // url to go to when user cancelled
));
这将提示用户安装您的应用程序,并允许您访问publish_stream扩展权限,该权限需要发布到他们的墙和他们的朋友的墙上。
为了实际发布墙贴,您的代码将类似于此:
$facebook->api("/{$friends_fb_uid}/feed", "POST",
array('message' => 'Hello! I\'m using the FB Graph API!'));
在获得用户的许可后,您应该在POST请求或对页面的某些请求(如果您愿意,甚至是ajax请求)上使用它。 FB PHP SDK应该自动获取用户的访问令牌,验证它并为您发出请求。
答案 2 :(得分:0)
尝试从
更改header('Location: '.$loginUrl);
到
echo '<script>top.location="'.$loginUrl.'";</script>';
die();
我不记得在哪里,但我在某处读到你必须使用javascript进行重定向。很久以前我读过它,所以它可能已经改变了。