0

我想在我的 asp.net 页面上访问 signed_request 参数。FB 将请求成功重定向到正确的页面。但是,它是一个 GET 请求,因此没有传递 signed_request 参数。

请帮帮我。

尝试使用 Request.Form["signed_request"] 读取值,但它是空白的。

请让我知道这是由于错误的配置还是由于 FB 端的某些更改。我如何让这个工作。

谢谢赛阿迪尔乌迈尔

4

1 回答 1

1

您可能已经知道,当您的页面标签应用程序首次加载时,Facebook 会向您在应用程序的页面标签 URL(或安全页面标签 URL)中指定的 URL 以及 signed_request 字符串发出 POST 请求。这就是为什么它的值在您的目标网页上不为空的原因。但是,当您单击链接以导航到标签应用程序中的另一个页面时,它突然变为空。这是应该的,因为您正在发出没有签名请求的 GET 请求。为了使您的其他页面能够访问 signed_request,您需要存储它。我想出了以下对我有用的代码,但如果有人提出更好的解决方案,我会很高兴听到它:

public static string StoredSignedRequest
{
    get
    {
        string signedRequest = HttpContext.Current.Request["signed_request"];

        // If signed_request is provided, store it
        if (!String.IsNullOrEmpty(signedRequest))
        {
            WriteCookie("fb-app-signed-request", signedRequest);
            return signedRequest;
        }
        else
        {
            return ReadCookie("fb-app-signed-request");
        }
    }
}

public static void WriteCookie(string strCookieName, string strCookieValue)
{
    var hcCookie = new HttpCookie(strCookieName, strCookieValue);
    HttpContext.Current.Response.Cookies.Set(hcCookie);
}

public static string ReadCookie(string strCookieName)
{
    foreach (string strCookie in HttpContext.Current.Response.Cookies.AllKeys)
    {
        if (strCookie == strCookieName)
        {
            return HttpContext.Current.Response.Cookies[strCookie].Value;
        }
    }

    foreach (string strCookie in HttpContext.Current.Request.Cookies.AllKeys)
    {
        if (strCookie == strCookieName)
        {
            return HttpContext.Current.Request.Cookies[strCookie].Value;
        }
    }

    return null;
}

然后您可以使用 JSON 解析器来解析 StoredSignedRequest 的值。就我而言,我使用 Newtonsoft:

public static JObject GetSignedRequestJsonObject()
{
    string signed_request = StoredSignedRequest;

    if (String.IsNullOrEmpty(signed_request))
    {
        // If signed_request is null on all pages except the landing page, add the following code to all pages so that it is stored:
        // <input type="hidden" name="signed_request" value="<%= FacebookAppHelper.StoredSignedRequest %>" />
        return null;
    }

    string payload = signed_request.Split('.')[1];
    UTF8Encoding encoding = new UTF8Encoding();
    string decodedJson = payload.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/');
    byte[] base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '='));
    string json = encoding.GetString(base64JsonArray);

    return JObject.Parse(json);
}

关键部分是不要忘记将隐藏字段(参见上面的注释行)添加到您计划在页面选项卡应用程序中使用 GET 请求访问的所有页面。

于 2013-05-30T08:38:53.120 回答