当我们的移动应用用户将app-invite发送给fb用户并且他接受了它时,服务器应该对第一个给予奖励。所以我需要一种方法来验证邀请是否已发送。
var fb = new FacebookClient(APP_ID + "|" + SECRET_ID);
fb.AppId = APP_ID;
fb.AppSecret = SECRET_ID;
dynamic result = fb.Get(???);
我搜索了GraphAPI文档,似乎我需要检索用户apprequests。如何从服务器端执行此操作以及在何处查看以执行此类验证?
更新
好的,现在我知道它是allowed to reward only for accepted invites。我可以记录谁邀请谁在数据库中,并仅在新的受邀用户加入时给予奖励。但我仍然需要一种方法来验证这些邀请是否实际发送过。
UPDATE2
正如文档所述apprequests从应用程序调用返回从此应用程序发送的所有请求。所以我认为仅仅检查这个应用程序是否有任何请求就足够了:
dynamic result = fb.Get("/" + facebookId + "/apprequests");
IEnumerable data = result.data;
return data.Cast<object>().Count() != 0;
但我现在无法查看。任何人都可以确认,如果用户向其他用户发送了应用邀请,则会通过应用程序访问令牌中的apprequests看到此邀请吗?
答案 0 :(得分:0)
我的代码:
public static FacebookRequestData GetInviteHash()
{
string requestId = Request["request_ids"];
var accessToken = GetAccessToken(ConfigurationManager.AppSettings["FacebookAppId"], ConfigurationManager.AppSettings["FacebookSecret"]);
string response;
using (var webClient = new WebClient())
{
response = webClient.DownloadString(string.Format("https://graph.facebook.com/{0}?{1}", requestId, accessToken));
}
var javaScriptSerializer = new JavaScriptSerializer();
return javaScriptSerializer.Deserialize<FacebookRequestData>(javaScriptSerializer.Deserialize<FacebookRequestInfo>(response).data);
}
private static string GetAccessToken(string appId, string password)
{
using (var webClient = new WebClient())
{
return webClient.DownloadString(string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=client_credentials", appId, password));
}
}
private class FacebookRequestInfo
{
public string data { get; set; }
}
FacebookRequestData - 我的自定义类,其中包含我之前发布到fb的字段结构
答案 1 :(得分:0)
完成它:
public static bool CheckInvite(string fromId, string toId)
{
var fb = new FacebookClient(APP_ID + "|" + SECRET_ID);
fb.AppId = APP_ID;
fb.AppSecret = SECRET_ID;
dynamic result = fb.Get(string.Format("/{0}/apprequests", toId));
foreach (var el in result.data)
if ((string)el.from.id == fromId)
{
DateTime dateTime = DateTime.Parse((string)el.created_time, CultureInfo.InvariantCulture);
if ((DateTime.Now - dateTime).TotalMinutes < 15)
{
return true;
}
}
return false;
}