【问题标题】:Verify app invite server-side验证应用邀请服务器端
【发布时间】:2014-09-24 18:24:09
【问题描述】:

当我们的移动应用用户向 fb 用户发送 app-invite 并且他接受时,服务器应该给第一个用户奖励。所以我需要一种方法来验证邀请是否已发送。

        var fb = new FacebookClient(APP_ID + "|" + SECRET_ID);
        fb.AppId = APP_ID;
        fb.AppSecret = SECRET_ID;
        dynamic result = fb.Get(???);

我搜索了 GraphAPI 文档,似乎我需要检索用户的请求。如何从服务器端执行此操作以及在哪里执行此类验证?

更新

好的,现在我知道是allowed to reward only for accepted invites。我可以在数据库中记录谁邀请了谁,并且只有在新的受邀用户加入时才给予奖励。但我仍然需要一种方法来验证这些邀请是否确实已发送。

更新2

正如文档所述,来自应用程序的 apprequests 调用会返回从该应用程序发送的所有请求。因此,我认为只需检查该应用程序是否有任何请求就足够了:

        dynamic result = fb.Get("/" + facebookId + "/apprequests");
        IEnumerable data = result.data;
        return data.Cast<object>().Count() != 0;

但我现在无法检查。任何人都可以确认,如果用户向另一个用户发送应用邀请,则该邀请将通过来自应用访问令牌的应用请求可见?

【问题讨论】:

  • 根据developers.facebook.com/policy发送邀请不能打赏
  • 你能给个报价吗?
  • 4.5:“仅激励用户登录您的应用,例如您应用的主页、在应用的主页上输入促销信息或在某个地方签到。不要激励其他行为。(自 2014 年 11 月 5 日起,您可能不再鼓励人们喜欢您应用的主页)。”
  • @WizKid 是否允许奖励用户将他们的游戏帐户连接到 Facebook?
  • 在 4.5 示例屏幕中:可以奖励其他用户接受的邀请。 fbcdn-dragon-a.akamaihd.net/hphotos-ak-xap1/t39.2178-6/…

标签: c# facebook facebook-graph-api facebook-c#-sdk


【解决方案1】:

我的代码:

        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 的具有字段结构的自定义类

【讨论】:

    【解决方案2】:

    完成了:

        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;
        }
    

    【讨论】:

    • 这种方法比 razon 建议的更适合我 - 请求 id 的响应不包含“to”属性(如果您没有指定包含 to-id 的请求,例如 123456_234567)。
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多