【问题标题】:Facebook iFrame app - how to fetch Preload FQL result using PHP SDK?Facebook iFrame 应用程序 - 如何使用 PHP SDK 获取 Preload FQL 结果?
【发布时间】:2011-05-05 08:51:33
【问题描述】:

几年以来,我有一个 FBML 应用程序(一个小的 Flash game),我现在正试图将其转换为 iFrame 应用程序。不幸的是,目前还没有很多关于 Facebook iFrame 应用程序的文档。

对于我的游戏,我需要用户的名字、照片、性别和城市。

在我的旧版本中,我有这个预加载 FQL(由 PHP 脚本创建一次):

$fql = array('info' => array('pattern' => 'facebook',
    'query' => 'SELECT first_name, sex, pic_big, current_location 
    FROM user WHERE uid={*user*}'));

$fb->api_client->admin_setAppProperties(
    array('preload_fql' => json_encode($fql)));

然后我的 FBML 应用脚本很简单:

<?php

require_once('facebook.php');

define('FB_API_ID', 'XXX');
define('FB_AUTH_SECRET', 'YYY');

$fb         = new Facebook(FB_API_ID, FB_AUTH_SECRET);
$viewer_id  = $fb->require_login();
$data       = json_decode($fb->fb_params['info'], true);

$first_name = $data[0][0];
$last_name  = $data[0][2];
$female     = ($data[0][3] != 'male');
$avatar     = $data[0][3];
$city       = $data[0][4]['city'];

# and then I'd just construct flashvars attribute
# for the <fb:swf ...> tag and print it

?>

是否有人请提供有关如何为 iFrame 版本重新创建相同脚本的提示 - 即如何通过我的 iFrame 应用获取 Preload FQL 的结果

根据较早的 Facebook 博客条目Preload FQL should be accessible by the iFrame apps

谢谢! 亚历克斯

【问题讨论】:

    标签: facebook iframe facebook-fql facebook-iframe


    【解决方案1】:

    经过长时间的搜索,我自己的答案是 Preload FQL 结果不会发送到 iframe Facebook 应用程序。

    这就是为什么Facebook performance doc 说:

    "预加载 FQL 查询和多查询。

    本节适用于 FBML 画布页面,但不适用于网站或 IFrame 画布页面。”

    【讨论】:

      【解决方案2】:

      正如 Facebook 所说的 Preload FQL

      "Facebook 会将这些 FQL 查询的结果作为 JSON 编码的 POST 参数发送到您的 Canvas URL"

      print_r 你的 $_POST 并查看哪个变量是“json 编码的结果”。您使用 json_decode 将 json 转换为 php 对象

      JSON 看起来像这样:{"var":"val","var":"val"}

      此外,Facebook 已经有很棒的 iframe 文档。那么您可能错过了这些优秀的文档:

      Facebook 文档主页

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

      身份验证

      http://developers.facebook.com/docs/authentication/

      签名请求

      http://developers.facebook.com/docs/authentication/signed_request/

      iFrame 画布应用

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

      PHP SDK

      https://github.com/facebook/php-sdk

      图形 API

      http://developers.facebook.com/docs/reference/api/

      【讨论】:

      • 不幸的是,您上面列出的知名链接列表根本无法回答我的问题:如何通过 iFrame 应用获取 Preload FQL 结果。而 print_r($_POST) 只输出一个字符串: [signed_request] => xR38Gp9fj...
      • 嗯,也许它在签名请求中!解码并打印所有内容。
      • 您是否在应用的高级设置中填写了预加载 FQL?
      • 是的,我有 {"info":{"pattern":"facebook","query":"SELECT first_name, sex, pic_big, current_location FROM user WHERE uid=me()"}}在“高级”->“高级画布功能”->“预加载 FQL”字段中
      【解决方案3】:

      您无需调用任何 FQL 即可获取您获得的信息。对于 iFrame,您只需要执行以下步骤

      1. 下载graph apihttps://github.com/facebook/php-sdk/的PHP SDK

      2. 创建对象并从用户授权应用程序

         $fbconfig['appid' ]  = "your application id";
        
        $fbconfig['api'   ]  = "your application api key";
        
        $fbconfig['secret']  = "your application secret key";
        
        
        
        
        try{
            include_once "facebook.php";
        }
        catch(Exception $o){
            echo '<pre>';
            print_r($o);
            echo '</pre>';
        }
        // Create our Application instance.
        $facebook = new Facebook(array(
          'appId'  => $fbconfig['appid'],
          'secret' => $fbconfig['secret'],
          'cookie' => true,
        ));
        // User location extended permission allow you to get user's current location
        $loginparams = array('canvas' => 1,'fbconnect' => 0,'req_perms' => 'user_location');
        
        $loginUrl = $facebook->getLoginUrl($loginparams);
        
        
        // We may or may not have this data based on a $_GET or $_COOKIE based session.
        // If we get a session here, it means we found a correctly signed session using
        // the Application Secret only Facebook and the Application know. We dont know
        // if it is still valid until we make an API call using the session. A session
        // can become invalid if it has already expired (should not be getting the
        // session back in this case) or if the user logged out of Facebook.
        $session = $facebook->getSession();
        
        $fbme = null;
        // Session based graph API call.
        if ($session) {
          try {
            $uid = $facebook->getUser();
            $fbme = $facebook->api('/me');
          } catch (FacebookApiException $e) {
              d($e);
          }
        }
        
        function d($d){
            echo '<pre>';
            print_r($d);
            echo '</pre>';
        }
        

        // 你可以找到这个数组中的所有数据。 print_r($fbme);

      更多详情可以关注本教程http://thinkdiff.net/facebook/php-sdk-graph-api-base-facebook-connect-tutorial/

      希望对你有用

      【讨论】:

      • 感谢您的详细回答,但我对如何获取 Preload FQL 结果感兴趣。你建议的方法已经在我的网站上工作了,但它至少需要一个 CURL 调用(当 $facebook->api('/me') 被调用时)——我想避免这种情况。
      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多