Facebook中使用asp.net C#sdk的粉丝专享内容

嗨我正在使用c#sdk在facebook上开发一个应用程序,我希望喜欢我的页面的用户只能使用我的应用程序。 (喜欢woobox )

我在这个链接中找到了一些php的解决方案,但是没有关于.net的任何来源如何在ASP.NET中获得喜欢的信息

我再次在这个链接中找到另一个php的例子,但我找不到c#的答案:\

谢谢

当您的网页加载到Facebookcanvas应用程序中时,您会收到签名请求; 您应该能够解析类似于以下内容的签名请求:

if (Request.Params["signed_request"] != null) { string payload = Request.Params["signed_request"].Split('.')[1]; var encoding = new UTF8Encoding(); var decodedJson = payload.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/'); var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '=')); var json = encoding.GetString(base64JsonArray); var o = JObject.Parse(json); var lPid = Convert.ToString(o.SelectToken("page.id")).Replace("\"", ""); var lLiked = Convert.ToString(o.SelectToken("page.liked")).Replace("\"", ""); var lUserId= Convert.ToString(o.SelectToken("user_id")).Replace("\"", ""); } 

您需要添加对json库的引用,以便在C#中解析签名的请求,从http://json.codeplex.com/下载

另请参阅如何在C#中为Canvas signed_request解码OAuth 2.0? 如果你对签名请求感到厌烦

这仅适用于旧版API或user_likes权限 。 如果您想要一个没有特定权限的解决方案,我将向您展示两种方法。 当用户按下时,将它们与AJAX结合使用来刷新页面。

选项1)REST API

使用遗留API,可以使用Pages.IsFan

 https://api.facebook.com/method/pages.isFan? page_id=...& uid=...& access_token=... 

在C#中执行如下操作。

 var appID = "...."; var appSecret = "...."; var uid = "...."; var pageId = "...."; WebClient client = new WebClient(); var appAuthUri = string.Concat("https://graph.facebook.com/oauth/access_token?", "client_id=", appID, "&client_secret=", appSecret, "&grant_type=", "client_credentials" ); var response = client.DownloadString(appAuthUri); var access_token = response.Split('=')[1]; var isFanUri = string.Concat("https://api.facebook.com/method/pages.isFan?", "format=", "json", "&page_id=", pageId, "&uid=", uid, "&access_token=", access_token ); response = client.DownloadString(isFanUri); bool isFan; bool.TryParse(response, out isFan); 

选项2)客户端

FBXML方法。 这是通过客户端上的Javascript完成的,通过在用户单击“ like按钮时订阅事件。 它在这里记录 。

如何知道用户何时单击“赞”按钮?

如果您使用的是按钮的XFBML版本,则可以通过FB.Event.subscribe订阅“edge.create”事件。

在这里生成一个类似FBXML的按钮。

 

然后使用Javascript SDK订阅edge.create事件。 将此代码放在文档BODY最好在结束之前。

  
 this.canvasAuthorizer = new CanvasAuthorizer { Permissions = new[] { "user_about_me", "publish_stream", "offline_access", "user_likes", "friends_about_me" } }; this.canvasAuthorizer.Authorize(); if (FacebookWebContext.Current.IsAuthorized()) { this.facebookWebClient = new FacebookWebClient(FacebookWebContext.Current); string requested_Data = HttpContext.Current.Request.Form["signed_request"]; dynamic decodedSignedRequest = FacebookSignedRequest.Parse(this.facebookApplication, requested_Data); if (decodedSignedRequest.Data.page != null) { // Funs Page this.IsLike = decodedSignedRequest.Data.page.liked; } else { // Application Page dynamic likes = this.facebookWebClient.Get("/me/likes"); foreach (dynamic like in likes.data) { if (like.id == this.FacebookFanPageID) { this.IsLike = true; } } } } 

如果您的应用是canvas应用,您可以(应该?)使用signed_request参数来检查用户是否喜欢它所在的页面:

 # pseudocode signed_request = decode_signed_request() if signed_request['page']['liked']: # user liked page, do something cool else: # user doesn't like page. redirect somewhere to tell them why they should 

signed_request作为POST变量传递给您的页面; 就好像有一个名为signed_request的表单字段并且表单已经在您之前的页面上提交(实际上这基本上就是facebook“运行”您的应用程序;表单是自动提交的,而不是等待用户提交它)。 所以在ASP.net中你应该能够通过Request对象获取它:

 Request["signed_request"] 

如果您要为页面创建“标签应用”,此方法很有用; 您可以检测用户是否喜欢该页面,而不会授予您额外的权限。

这可以在SQL查询的帮助下在PHP中完成

 `$result = $facebook->api(array( "method" => "fql.query", "query" => "SELECT uid FROM page_fan WHERE uid=$uid AND page_id=$page_id" )); 

这里$ result变量可用于隔离Fan和非Fan内容