2012-02-23 35 views
3

我开发了一个Facebook画布应用程序,向用户发送新闻传递,我希望能够允许用户点击新闻传递中的链接,并将其与应用程序中呈现的一些数据一起带到我的应用程序中例如通过将它传递给查询字符串)。如何在查询字符串中将某些值传递给我的Facebook画布应用程序?

当我创建将用户的动态消息发布的链接我设置链接场 -

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

这工作,当用户点击这个链接的浏览器引导他们该链接。但是我无法访问$ _GET ['datatopass']变量(使用PHP),它看起来是空白的。我已经尝试使用JavaScript来输出window.location变量,并且我没有看到我传递的查询字符串,尽管我在浏览器地址栏中看到上面的url。我所看到的是我在facebook开发人员应用程序中设置的网站网址,以及facebook使用的状态代码 params。它剥离了我的datatopass param,我希望能够在我的应用程序启动时阅读。

所以...我怎么传递我想发送的数据?如果您使用的是signed_request,我知道有一个app_data字段,但据我所知,这仅适用于坐在页面的Tab中的应用程序。我正在使用iFrame canvas应用程序方法。

当我看着我的Apache服务器的访问日志,我可以看到,有我的网站的URL地址的POST进入我的附加查询字符串 - 随之而来的是GET项

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" 

-

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" 

我的歉意我真的不明白上述是做什么,但希望这将是有用的额外信息,在帮助回答这个问题。

回答

1

您可能需要/在URL即应用程序名后..

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

+0

嗨 - 是的,这是我的错误打印我应该添加/在我的问题 - 但我的浏览器会为我添加这个,如果我不这样,我看到相同的行为,无论。当我在Facebook上配置应用时,我有Site URL = http://my.domain.com/facebookapp/index.php和canvas url = http://my.domain.com/facebookapp/ Canvas页面是http:// apps.facebook.com/myappname(没有斜线,但随后Facebook会为你填充)..我更新了我的问题,但是感谢您指出了这一点。 – undefined 2012-02-23 15:40:51

1

是否使用重写引擎? Facebook支持它,所以像apps.facebook.com/myapp/data/anotherdata这样的链接是有效的。 试试这个方法,如果print_r($ _ REQUEST)通过,就试试它。

1

Facebook用于允许画布应用的GET参数。这些参数通过Facebook用来嵌入您的应用的IFRAME标签传递。但是,这带来了安全风险,因为该页面包含的所有脚本(css,js ...)都可以通过引用来访问这些参数。因此,所有应用程序都需要迁移到使用POST参数。请参阅本文档的附加信息:

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

+0

好吧,但我仍然看不到我如何在查询字符串中传递变量 - 我想用链接更新用户的状态,当他们点击它时会启动我的应用程序并使用url的查询字符串部分中的数据进行预配置。那么这是不是可以做到这一点? – undefined 2012-02-24 14:05:20

+0

URL的查询字符串中的变量是GET参数。 Facebook正在自动剥离这些变量。您可能会在地址栏中看到它们,但它们并未包含在IFRAME标记中,这是真正重要的。你试图做的事情当然是可能的,它只需要多一点编码。例如,您可以使用带有隐藏字段的FORM标签来替换传统的锚链接,以获取所需的参数。另一种选择是使用JavaScript自动将传统链接转换为POST,请参阅此处的示例: http://code.google.com/p/postlink/ – 2012-02-24 15:21:01

+0

感谢吉尔,我一直在想,我可能不得不做我想你是在暗示链接到一个脚本(托管在我的服务器上),该脚本将查询字符串参数转换为表单,然后将其提交给我的画布应用 - 这就是你的意思吗? – undefined 2012-02-24 16:48:17

4

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; 
?> 
+0

尝试过,但不起作用。 – dtbarne 2012-11-14 16:14:51

+0

这很奇怪。它似乎仍然在为我工作。你的app_data是在json_encoded字符串中吗?我不知道这些帖子是否有帮助:[facebook-app-data](http://stackoverflow.com/questions/8646589/facebook-app-data)[另一篇文章](http://stackoverflow.com/questions/10801807/facebook-fan-page-app-pass-string-to-app-data-and-retrieve) – fldsofglry 2012-11-15 15:42:27

+0

从我们的结尾看,他们的分享功能在美国东部时间晚上7点。我想知道这是否也会影响到这个功能。 – fldsofglry 2012-11-15 15:49:05

1

你传递到apps.facebook.com链接的任何值也会传递到你的画布页面。一个例外是signed_request,Facebook将其POST到您的画布页面。

+0

谢谢@dtbarne。这个应该被标记为答案。 – brainondev 2014-08-05 10:07:19

相关问题