由于我无法使signed_request成为null以外的任何东西,我以为我会在客户端对用户进行身份验证,然后将访问令牌与AJAX一起发送到服务器端(ASP.NET MVC)呼叫。不幸的是,我也无法让它工作!这是我的Javascript代码(我从文档中获得):
function postOnFacebook(msg, itemLink, pic, itemTitle, signedReq) {
var siteUrl = 'http://www.localhost:2732';
var appID = 193005690721590;
if (window.location.hash.length == 0) {
var path = 'https://www.facebook.com/dialog/oauth?';
var queryParams = ['client_id=' + appID,
'redirect_uri=' + window.location,
'response_type=token',
'scope=offline_access'];
var query = queryParams.join('&');
var url = path + query;
window.open(url);
} else {
var accessToken = window.location.hash.substring(1);
var path = "https://graph.facebook.com/me?";
var queryParams = [accessToken];
var query = queryParams.join('&');
var url = path + query;
// use jsonp to call the graph
var script = document.createElement('script');
script.src = url;
document.body.appendChild(script);
}
$.ajax({
url: '/Facebook/Share',
data: {
'message': msg,
'link': siteUrl + itemLink,
'picture': siteUrl + pic,
'name' : itemTitle,
'accessToken': accessToken
},
type: 'get',
success: function(data) {
if(data.result == "success") {
alert("item was posted on facebook");
}
}
});
}
这是我的服务器端代码:
public ActionResult Share(string message, string link, string picture, string name, string accessToken)
{
if (FacebookWebContext.Current.Session == null)
return RedirectToAction("Login");
var fb = new FacebookWebClient(accessToken);
var postArgs = new Dictionary<string, string>();
postArgs["message"] = message;
postArgs["link"] = link;
postArgs["picture"] = picture;
postArgs["name"] = name;
fb.Post("/me/feed", postArgs);
return Json(new {result = "success"}, JsonRequestBehavior.AllowGet);
}
}
更新
我试过this,但它对我不起作用。当我第一次点击按钮时,它会将我重定向到FB登录页面,然后将我返回到我网站的主页。之后,它所做的只是重定向,然后立即返回主页。什么都没发布。
有什么建议吗?
答案 0 :(得分:20)
Facebook Javascript SDK文档位于:https://developers.facebook.com/docs/reference/javascript/
有几种使用Javascript SDK获取访问令牌的方法。有些是同步的,有些是异步的,有些是让你订阅事件,比如登录状态的变化,有些是获取会话对象(包含访问令牌)以响应提示权限等事情。
这是一个简单的例子:
<input id="AccessToken" type="text" value="" />
<div id="fb-root"></div>
<script src="https://connect.facebook.net/en_US/all.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
FB.init({
appId: 'insert your appID value here',
cookie: true,
xfbml: true,
status: true });
FB.getLoginStatus(function (response) {
if (response.authResponse) {
$('#AccessToken').val(response.authResponse.accessToken);
} else {
// do something...maybe show a login prompt
}
});
});
</script>
一旦您获得了访问令牌捕获客户端,您可以将其发布到服务器的表单或ajax调用中。
要检查的另一件事是您的环境。 Facebook会查看这些api调用的域名是否与您的应用设置匹配。在端口80上尝试它,并使用指向服务器(而不是localhost)的DNS的真实域。使用DynDns或其他一些此类服务来设置指向开发框的域名和DNS条目。使用端口80上的应用程序和防火墙/路由器端口转发设置在您的开发盒上运行IIS,这样您就可以在与您的Facebook应用程序设置匹配的真实域上的端口80上提供页面。