【问题标题】:How can I pass some values to my facebook canvas app in a query string?如何在查询字符串中将一些值传递给我的 facebook 画布应用程序?
【发布时间】:2012-02-23 15:18:36
【问题描述】:

我开发了一个 facebook 画布应用程序,该应用程序向用户新闻源发布信息,我希望能够允许用户单击新闻源中的链接并被带到我的应用程序以及将在应用程序中显示的一些数据(例如通过在查询字符串中传递它)。

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

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

这是可行的,当用户单击此链接时,浏览器会将他们定向到该链接。但是我无法访问 $_GET['datatopass'] 变量(使用 PHP),它似乎是空白的。我尝试使用 javascript 来输出 window.location 变量,但我没有看到我传递的查询字符串,即使我在浏览器地址栏中看到了上面的 url。我看到的是我在 facebook 开发者应用程序中设置的网站 url 以及 facebook 使用的 statecode 参数。它剥夺了我的 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"

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

【问题讨论】:

    标签: php facebook get query-string


    【解决方案1】:

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

    【讨论】:

    • 这很奇怪。它似乎仍然对我有用。您的 app_data 是否在 json_encoded 字符串中?我不知道这些帖子是否会有所帮助:facebook-app-data [此处的另一个帖子] (stackoverflow.com/questions/10801807/…)
    • 从我们的角度来看,当他们在美国东部时间晚上 7 点左右进行每日推送时,他们的分享功能似乎已经下降。我想知道这是否也会影响此功能的任何内容。
    • 我刚刚意识到您发布了这篇关于如何将数据传递到页面而不是应用程序的文章。
    【解决方案2】:

    您可能需要在 URL 中的应用名称后加上 /,即。

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

    【讨论】:

    • 嗨 - 是的,这是我的印刷错误,我应该在我的问题中添加 / - 但如果我不这样做,我的浏览器会为我添加这个,所以无论如何我都会看到相同的行为。当我在 facebook 上配置应用程序时,我有 Site URL = my.domain.com/facebookapp/index.php 和 canvas url = my.domain.com/facebookapp 画布页面是 apps.facebook.com/myappname (没有斜线,但 facebook 会为你填写).. 我更新了我的问题,但感谢您的指点出来了。
    【解决方案3】:

    你在使用重写引擎吗? Facebook 支持它,所以像 apps.facebook.com/myapp/data/anotherdata 这样的链接是有效的。 试试这个方法,然后 print_r($_REQUEST) 检查是否通过。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 好的,但我仍然看不到如何在查询字符串中传递变量 - 我想用一个链接更新用户的状态,当他们点击它时将启动我的应用程序并使用其中的数据预配置它url 的查询字符串部分。那么这是不可能的吗?
      • URL 查询字符串中的变量是 GET 参数。 Facebook 正在自动剔除这些变量。您可能会在地址栏中看到它们,但它们并未包含在真正重要的 IFRAME 标记中。您尝试做的事情当然是可能的,只需要更多的编码。例如,您可以使用带有隐藏字段的 FORM 标签来替换传统的锚链接,以获取您需要的参数。另一种选择是使用 javascript 将传统链接自动转换为 POST,例如:code.google.com/p/postlink
      • 谢谢吉尔,我想我可能不得不做我认为你建议的事情,即链接到将查询字符串参数转换为表单的脚本(托管在我的服务器上)然后将其提交到我的画布应用程序 - 这就是您的意思吗?
      • 我认为您的意思是“链接”尚未托管在您的服务器上。在那种情况下,你的建议对我来说听起来很合理。例如,如果您想在您的 Facebook 新闻提要上发布一个链接,例如 apps.facebook.com/myappname/?datatopass=mydata,那么您应该发布一个指向 myserver.com/myapp/redirector.php?datatopass=mydata 的链接。该 redirector.php 脚本将通过将查询字符串参数重新打包为 POST 请求来重定向到apps.facebook.com/myappname。但是,如果链接实际上托管在您的服务器上,则重定向器是多余的。
      • 是的,链接在新闻提要上,我希望我的应用程序在 facebook 上的用户点击他们新提要中的链接并被定向到应用程序并传递一些数据。我将继续研究重定向帖子解决方案。谢谢。
      【解决方案5】:

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

      【讨论】:

      • 感谢@dtbarne。这个应该被标记为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 2011-03-11
      • 2014-04-07
      相关资源
      最近更新 更多