我想在我的 asp.net 页面上访问 signed_request 参数。FB 将请求成功重定向到正确的页面。但是,它是一个 GET 请求,因此没有传递 signed_request 参数。
请帮帮我。
尝试使用 Request.Form["signed_request"] 读取值,但它是空白的。
请让我知道这是由于错误的配置还是由于 FB 端的某些更改。我如何让这个工作。
谢谢赛阿迪尔乌迈尔
我想在我的 asp.net 页面上访问 signed_request 参数。FB 将请求成功重定向到正确的页面。但是,它是一个 GET 请求,因此没有传递 signed_request 参数。
请帮帮我。
尝试使用 Request.Form["signed_request"] 读取值,但它是空白的。
请让我知道这是由于错误的配置还是由于 FB 端的某些更改。我如何让这个工作。
谢谢赛阿迪尔乌迈尔
您可能已经知道,当您的页面标签应用程序首次加载时,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 请求访问的所有页面。