通过Graph API检查用户是否喜欢页面

时间:2012-03-05 12:23:36

标签: facebook wordpress facebook-graph-api facebook-like

我见过几个类似的问题,但我认为这是新的......

我正在尝试在博客上添加一个popover,其中包含Facebook页面的Facebook按钮,只会显示用户是否还不喜欢Facebook页面。

阅读文档,这应该可以通过Graph API pages.isFan方法实现,但这是否需要用户授予权限?如果是这样,可能没有应用程序请求权限,而是优雅地失败?

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

您可以判断用户是否喜欢来自facebook的请求中发送的signed_request中的页面。您不必查询图形API。

我们使用c#并得到它:

protected void Page_Load(object sender, EventArgs e)
    {
        Result = DecodePayload(Request["signed_request"]);
    }

    public JObject DecodePayload(string payload)
    {
        var encoding = new UTF8Encoding();
        var decodedJson = payload.Split('.')[1].Replace("=", string.Empty).Replace('-', '+').Replace('_', '/');
        var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '='));
        Json = encoding.GetString(base64JsonArray);
        var result = JObject.Parse(Json);
        return result;
    }

然后在页面

<% if (Result["page"] == null || Result["page"]["liked"] == null || !(bool) Result["page"]["liked"])
     {%> 
 Content if liked
<%}%>

一个更重要的事情截至3月30日,页面布局正在更改为时间轴,您应该知道当前不喜欢刷新页面的错误,请看:

Does anyone know a fix for the lack of page refresh on facebook timeline pages when liking?

更新

解码签名请求的php是:

   function parse_signed_request($signed_request, $secret) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  // decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
    error_log('Unknown algorithm. Expected HMAC-SHA256');
    return null;
  }

  // check sig
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}

function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}