Php 验证facebook画布应用程序返回?代码=
我的facebook画布应用程序有问题,目前正在开发中 我的画布url是Php 验证facebook画布应用程序返回?代码=,php,facebook,canvas,Php,Facebook,Canvas,我的facebook画布应用程序有问题,目前正在开发中 我的画布url是http://localhost:8080/fbcanvas/ 在facebook上,url设置为http://apps.facebook.com/app_name/ 问题是,在用户批准我的应用程序后,我将代码作为$\u GET['code']变量获取。 在facebook文档中,它没有说任何关于获取$\u GET['code']的内容,只是说获取签名请求 这是我在facebook示例中使用的代码 require_o
http://localhost:8080/fbcanvas/
在facebook上,url设置为http://apps.facebook.com/app_name/
问题是,在用户批准我的应用程序后,我将代码作为$\u GET['code']
变量获取。
在facebook文档中,它没有说任何关于获取$\u GET['code']
的内容,只是说获取签名请求
这是我在facebook示例中使用的代码
require_once($_SERVER['DOCUMENT_ROOT'] . '/classes/Page.php');
require($_SERVER['DOCUMENT_ROOT'] . '/core/config.fb.php');
$canvas_page = 'http://apps.facebook.com/khawamusic/';
$auth_url = 'https://www.facebook.com/dialog/oauth?client_id=' . $app_id . '&redirect_uri=' . urlencode($canvas_page);
$signed_request = $_REQUEST['signed_request'];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
if(empty($data['user_id'])) {
echo('<script> top.location.href="' . $auth_url .'";</script>');
} else {
$page = new Page;
$styles = array('reset.css', 'fbcanvas.css');
$scripts = array(
'https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js',
'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js',
'http://connect.facebook.net/en_US/all.js#xfbml=1',
'/sources/js/fbcanvas.js'
);
$page->set_title('Khawa');
$page->set_styles($styles);
$page->set_scripts($scripts);
$page->start_page();
require($_SERVER['DOCUMENT_ROOT'] . '/fbcanvas/fb.tpl');
$page->end_page();
}
require_once($_SERVER['DOCUMENT_ROOT'.]./classes/Page.php');
需要($_SERVER['DOCUMENT_ROOT'.]./core/config.fb.php');
$canvas\u page='1http://apps.facebook.com/khawamusic/';
$auth\u url='1https://www.facebook.com/dialog/oauth?client_id=' . $应用程序id。”&重定向_uri='。urlencode($canvas_page);
$signed_request=$_request['signed_request'];
列表($encoded_sig,$payload)=分解('.',$signed_请求,2);
$data=json_解码(base64_解码(strtr($payload,'-'','+/')),true);
if(空($data['user\u id'])){
echo('top.location.href=“...auth_url.”“;”);
$data = $canvas->parse_signed_request($signed_request);
$auth_url = 'http://www.facebook.com/dialog/oauth?client_id=' . $app_id . '&redirect_uri=' . urlencode($canvas_page);
if(empty($data['user_id'])) {
echo '<script>top.location.href="' . $auth_url . '"</script>';
}
}否则{
$page=新页面;
$styles=array('reset.css','fbcanvas.css');
$scripts=数组(
'https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js',
'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js',
'http://connect.facebook.net/en_US/all.js#xfbml=1',
“/sources/js/fbcanvas.js”
);
$page->set_title('Khawa');
$page->set_样式($style);
$page->set_脚本($scripts);
$page->start_page();
需要($_SERVER['DOCUMENT_ROOT'.../-fbcanvas/fb.tpl');
$page->end_page();
}
因此,如果用户批准了我的应用程序,他就会被重定向到http://apps.facebook.com/khawamusic/?code=blabla
我之所以感到困惑,是因为在文档中没有说我应该得到一个
$\u get['code']
如果用户按Allow,你的应用程序就被授权了。OAuth对话框将(通过HTTP 302)将用户浏览器重定向到您在redirect_uri参数中传递的URL,并带有授权代码:
http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER
有了这段代码,您可以继续下一步,即应用程序身份验证,以获得进行API调用所需的访问令牌
参考:
编辑:
这是一个身份验证示例,它不会显示?code=Blabla。。
首先从此处下载最新的Facebook PHP SDK:
确保保存所有3个文件:facebook.php、base_facebook.php和fb_ca_chain_bundle.crt
现在替换文本“YOUR\u APP\u ID”和“YOUR\u APP\u API\u SECRET”“使用facebook上的应用程序ID和应用程序机密,我使用graph api添加了示例墙张贴,如果您不想,您可以删除它,如果您查看我的代码和评论,您将了解它的功能,并且不想做任何事来获取访问令牌,只需使用$access\u token变量,它将为您提供当前用户的访问令牌,如果您需要用户的ID,则使用$user变量;如果您需要用户的基本信息,则使用$userInfo变量,它将使用graph api获取用户的数据,并返回数组中的所有信息,您将获得当前用户的信息,如ID、名称、名字、,姓氏、链接、家乡、地点、个人简历、工作、教育、性别、时区等
使用登录页URL或画布页URL更改$RedirectUrl
<?php
require 'facebook.php';
define('FACEBOOK_APP_ID', "YOUR_APP_ID"); // Your App ID
define('FACEBOOK_SECRET', "YOUR_APP_API_SECRET"); // Your App API Secret
$RedirectUrl = "http://apps.facebook.com/myapp/"; // Your Landing Page URL, User's will be redirect to this URL after they allow your app.
function d($d){
echo "<pre>";
print_r($d);
echo "</pre>";
}
$user = null;
$facebook = new Facebook(array(
'appId' => FACEBOOK_APP_ID,
'secret' => FACEBOOK_SECRET,
'cookie' => true,
));
$user = $facebook->getUser(); // Get the UID of the connected user, or 0 if the Facebook user is not connected.
if(isset($_GET['code'])){
header("Location: $RedirectUrl");
}
if($user == 0) {
// If User is not connected to your app, then redirect User to Authentication Page.
/**
* Get a Login URL for use with redirects. By default, full page redirect is
* assumed. If you are using the generated URL with a window.open() call in
* JavaScript, you can pass in display=popup as part of the $params.
*
* The parameters:
* - redirect_uri: the url to go to after a successful login
* - scope: comma separated list of requested extended perms
*/
$login_url = $facebook->getLoginUrl($params = array('scope' => "publish_stream", 'redirect_uri' => $RedirectUrl));
echo("<script> top.location.href='" . $login_url . "'</script>");
} else {
// If User is connected to your app, then do something.
$signed_request = $facebook->getSignedRequest(); // Get the data from a signed_request token.
$access_token = $facebook->getAccessToken(); // Determines the access token that should be used for API calls.
$userInfo = $facebook->api("/me"); // Get's User Info
try {
// Posts to user's wall after the user allows your app.
$wallpost = array(
'message' => "I like this",
'link' => 'http://google.com',
'picture' => 'http://i.imgur.com/8iz6L.png',
'name' => 'This is cool',
'description'=> 'Checkout this cool app'
);
$publishStream = $facebook->api("/$user/feed", "post", $wallpost); // WallPost to User's Wall using Graph API
echo "Your post was successfully posted to UID: $user";
}
catch (FacebookApiException $e) {
d($e);
}
}
?>
我还不确定,但我想我已经知道了授权/认证facebook应用程序的过程
步骤1:用户第一次访问你的应用程序时,facebook向你发送一个签名请求,你需要对其进行解析、验证并检查是否设置了$data['user\u id']
守则:
if(isset($_REQUEST['code'])) {
$access_token = $canvas->get_access_token($_REQUEST['code']);
$user = $canvas->getUser($access_token);
$user_info = array(
'user_id' => $user->id,
'user_username' => $user->username,
'user_name' => $user->name
);
// install the application for the new user.
$user_obj = new User($user_info);
// registered or allready exists.
if($user_obj) {
echo '<script>top.location.href="' . $canvas->canvas_page . '";</script>';
}
exit();
}
因此,据我所知,facebook只向您发送一次请求['code']
:当用户批准您的canvas应用程序时
就是这样,用户已安装,因此,现在每次用户重新进入您的应用程序时,您都会收到一个已签名的请求
但是这一次,因为用户已经批准了应用程序,所以签名的请求将包括一个用户id和oauth令牌,您可以从graph api中获取内容
如果签名的请求有用户ID,这就是你要做的
同样,我不确定,但我认为这是FACEBOOK画布应用程序的身份验证过程。你的应用程序是在iframe中还是使用fbml?如果你是说“”处的页面在iframe中,那么它不是。。。我想facebook会自动把它放在一个iframe中。哦,谢谢你解释,因为他们没有,他们只是说我收到了一个签名请求,他们没有说任何关于获取代码的事情。那么我是否需要更改
$canvas\u url
?并参考验证并获取access\u令牌的页面
?该死的facebook必须改善他们的docs@Pinokyo:没问题,而且我没有完全明白你的意思?但是你可以试试,我也建议你阅读这篇文章:还有一件事,如果你能告诉我你想做什么,然后我可以为你编写一段代码…我认为你错了,我不是专家,我只是认为你错了,因为在用户授权我的应用程序后,他们立即向我发送oauth_令牌,那么为什么我要执行发送代码的漫长过程,然后等待access_令牌,如果他们在签名的_请求中发送给我?抱歉,有额外的评论但我想做的是构建一个facebook画布应用程序。奇怪的是,他们发送的是,在用户第一次批准你的应用程序后,facebook向你发送了一个签名请求,你有一个oauth令牌,但facebook也发送了一个代码来获取你已经拥有的访问令牌
if(isset($data['user_id'])) {
$user = false;
if(!$user) {
$user = $canvas->getUser($data['oauth_token']);
}
if(!ob_start('ob_gzhandler')) ob_start();
$styles = array(
'reset.css', 'jplayer.fbcanvas.css', 'fbcanvas.css'
);
$scripts = array(
'http://connect.facebook.net/en_US/all.js#xfbml=1',
'http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js',
'/sources/js/jplayer/jquery.transform.js',
'/sources/js/jplayer/jquery.grab.js',
'/sources/js/jplayer/jquery.jplayer.js',
'/sources/js/jplayer/mod.csstransforms.min.js',
'/sources/js/jplayer/circle.player.js',
'/sources/js/fbcanvas.js'
);
$results = $canvas->getLatestSongs();
// the canvas.
$page->set_title('Khawa');
$page->set_styles($styles);
$page->set_scripts($scripts);
$page->start_page();
require($_SERVER['DOCUMENT_ROOT'] . '/fbcanvas/fb.tpl');
$page->end_page();
ob_end_flush();
}