如何在查询字符串中将一些值传递到我的facebook画布应用程序


How can I pass some values to my facebook canvas app in a query string?

我开发了一个脸书画布应用程序,可以向用户发布新闻源,我希望能够允许用户点击新闻源中的链接,并将其与应用程序中显示的一些数据一起带到我的应用程序中(例如,在querystring中传递数据)。

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

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

这是有效的,当用户单击此链接时,浏览器会将他们引导到该链接。但是,我无法访问$_GET['datatopass']变量(使用PHP),它似乎是空白的。我曾尝试使用javascript输出window.location变量,但我没有看到我传递的查询字符串,尽管我在浏览器地址栏中看到了上面的url。我看到的是我在facebook开发者应用程序中设置的网站url,以及facebook使用的状态代码参数。它已经剥离了我的datatopass参数,我希望在应用程序启动时能够读取这些参数。

所以。。。如何传递要发送的数据?我知道如果你使用signed_request,会有一个app_data字段,但据我所知,这只适用于位于页面选项卡中的应用程序。我使用的是iFrame画布应用程序方法。

当我查看我的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;
 ?>

您可能需要在URL中的应用程序名称后面加一个/,即.

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

您正在使用重写引擎吗?Facebook支持它,所以像apps.Facebook.com/myapp/data/anotherdata这样的链接是有效的。尝试这种方式并打印_r($_REQUEST)以检查它是否被传递。

Facebook曾允许画布应用程序的GET参数。这些参数是通过IFRAME标签传递的,Facebook用来嵌入你的应用程序。然而,这带来了安全风险,因为页面中包含的所有脚本(css、js…)都可以通过Referrer访问这些参数。因此,所有应用程序都需要迁移到使用POST参数。请参阅此文档了解更多信息:

http://developers.facebook.com/docs/canvas/post/

您传递到apps.facebook.com链接中的任何值也将传递到画布页面中。唯一的例外是signed_request,它被Facebook张贴到你的画布页面上。