php - 如何在查询字符串中将一些值传递给我的 facebook canvas 应用程序?

标签 php facebook get query-string

我开发了一个 facebook canvas 应用程序,它可以向用户发布新闻源,我希望能够让用户点击新闻源中的链接,然后被带到我的应用程序以及将在应用程序中显示的一些数据(例如通过在查询字符串中传递它)。

当我创建将发布在用户新闻源上的链接时,我将链接字段设置为 -

http://apps.facebook.com/myappname/?datatopass=mydata

这是可行的,当用户单击此链接时,浏览器会将他们定向到该链接。但是我无法访问 $_GET['datatopass'] 变量(使用 PHP)并且它看起来是空白的。我尝试使用 javascript 输出 window.location 变量,但我没有看到我传递的查询字符串,即使我在浏览器地址栏中看到了上面的 url。我看到的是我在 facebook 开发者应用程序中设置的网站 url 以及 facebook 使用的 statecode 参数。它删除了我希望在我的应用程序启动时能够读取的 datatopass 参数。

那么……我怎样才能传递我想发送的数据呢?我知道如果您使用的是 signed_request,则有一个 app_data 字段,但据我了解,这仅适用于位于页面选项卡中的应用程序。我正在使用 iFrame Canvas 应用程序方法。

当我查看我的 apache 服务器的访问日志时,我可以看到我的站点 url 地址有一个 POST 条目和我附加的查询字符串 -

my.domain.com 123.456.7.890 - - [23/Feb/2012:14:21:19 +0000] "POST /facebookapp/?datatopass=mydata HTTP/1.1" 200 300 "http://apps.facebook.com/myappname/?datatopass=mydata" "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0"

后跟 GET 条目 -

my.domain.com 123.456.7.890 - - [23/Feb/2012:14:21:20 +0000] "GET /facebookapp/directory/?state=99226fiawhoidhaoia09809a085d94832&code=ahfakshdlkfhalksj.... HTTP/1.1" 200 27094 "http://my.domain.com/facebookapp/?play=asd" "Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0"

很抱歉,我不太明白上面的内容在做什么,但希望它能提供有用的额外信息来帮助回答这个问题。

最佳答案

Facebook 允许您通过 app_data 变量传递数据。这个变量是签名请求的一部分,是一个 json 编码的字符串。所以一个例子可能是这样的:

 top.location.href = "http://www.facebook.com/pages/PAGENAME/PAGE_ID?sk=APP_ID&app_data=MYDATA";

此 app_data 变量成为 Facebook 签名请求的一部分。可以在此处找到更多信息:http://developers.facebook.com/docs/authentication/signed_request/
您只需解析签名的请求,然后您就可以通过 app_data 访问数据,如文档所示:

 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, '-_', '+/'));
 }

然后你可以像这样调用函数并访问 app_data:

 <?php 
      $signed_request = parse_signed_request($signed_request, $secret);
      $signed_request['app_data'] = MYDATA;
 ?>

关于php - 如何在查询字符串中将一些值传递给我的 facebook canvas 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9415784/

相关文章:

php - 不应直接访问订单属性 - WooCommerce 3.0

java - ldap中的别名是什么

javascript - 具有自动浏览器刷新 JavaScript 的响应式 FB 页面插件

jquery - 如何从点击的img中获取src值

html - 选择选项时设置 $_GET 值

php - SQLSTATE[42000] 聚合函数错误

php - WordPress 忽略用户描述中的换行符

php - Facebook 注册和登录 Slim Framework PHP API

javascript - FB Graph API : Posting as a page, 到不同页面

javascript - 将 3d 数组格式化为 GET 或 POST 请求