我开发了一个 facebook canvas 应用程序,它可以向用户发布新闻源,我希望能够让用户点击新闻源中的链接,然后被带到我的应用程序以及将在应用程序中显示的一些数据(例如通过在查询字符串中传递它)。
当我创建将发布在用户新闻源上的链接时,我将链接字段设置为 -
http://apps.facebook.com/myappname/?datatopass=mydata
这是可行的,当用户单击此链接时,浏览器会将他们定向到该链接。但是我无法访问 $_GET['datatopass'] 变量(使用 PHP)并且它看起来是空白的。我尝试使用 javascript 输出 window.location 变量,但我没有看到我传递的查询字符串,即使我在浏览器地址栏中看到了上面的 url。我看到的是我在 facebook 开发者应用程序中设置的网站 url 以及 facebook 使用的 state 和 code 参数。它删除了我希望在我的应用程序启动时能够读取的 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/