0

私は2つのファイルでアプリを開発しています:

  1. index.php (アプリケーションコンテナ)
  2. process.php (ajax で呼び出される)

index.php

<?php
    include 'config.php';
    include 'lib/functions.php';
    require_once 'lib/sdk/facebook.php';

    $facebook = new Facebook(array(
        'appId'  => APP_ID,
        'secret' => SECRET
    ));

    $userID = $facebook->getUser();

    if (!$userID)
    {
         $scope = 'read_stream, publish_stream, user_likes, user_photos, user_status, friends_hometown, friends_location, friends_likes, photo_upload';

         $params = array(
             'scope'        => $scope,
             'redirect_uri' => "https://apps.facebook.com/".APP_NAME."/"
         );

         $loginUrl = $facebook->getLoginUrl($params);
    }
    else 
    {
        $access_token = $facebook->getAccessToken();
    }
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
    <head>
        <title>Facebook App</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <link href="/css/style.css" rel="stylesheet" type="text/css" media="screen" />
        <script type="text/javascript" src="/js/jquery.js"></script>
    </head>

    <body style="margin:0 !important; padding: 0 !important;">

        { SOME HTML }

        <script type="text/javascript">
             function loadData()
             {
                  $.ajax({
                      url: "process.php",
                      type: 'POST',
                      cache: false,
                      data: {
                          id_sessione: function(){return $("#id_sessione").val();}
                      },
                      dataType: "json",
                      success: function(data) {
                          if (data.status == "FAILURE")
                              alert('failure');
                          else
                              console.log(data);
                      }
                  });
             }




             /********* INIT ********/
             $(document).ready(function(){
                 if ($("#userID").val() != "0")
                     loadData();
                 else
                     top.location = '<?php echo $loginUrl; ?>';
             });
         </script>

         <input id="id_sessione" type="hidden" value="<?php echo session_id(); ?>" />
         <input id="userID" type="hidden" value="<?php echo $userID; ?>" />

         <div id="fb-root"></div>
         <script type="text/javascript">
             window.fbAsyncInit = function() {
                 FB.init({
                      appId: '<?php echo APP_ID; ?>',
                      frictionlessRequests: true
                 });

                 FB.Canvas.setAutoResize(7);
             };

             (function() {
                 var e = document.createElement('script');
                 e.async = true;
                 e.src = document.location.protocol +
                     '//connect.facebook.net/it_IT/all.js';
                     document.getElementById('fb-root').appendChild(e);             
             }());
          </script>
      </body>
 </html>

および process.php

<?php
    session_id($_POST['id_sessione']);
    session_start();

    include 'config.php';
    include 'lib/functions.php';
    require_once 'lib/sdk/facebook.php';

    set_time_limit(120);
    $memory_limit = ini_set('memory_limit', '512M');

    try
    {
        $facebook = new Facebook(array(
            'appId'  => APP_ID,
            'secret' => SECRET
        ));

        $userID = $facebook->getUser();

        $user_profile = $facebook->api('/me');

        { SOME FQL QUERIES AND DATA PROCESSING }

        echo json_encode(array(
            'status' => 'SUCCESS',
            .... other info
        ));
     } catch (Exception $e) {

         $handle = fopen(ROOT_PATH.'/log/'.$userID.'_'.uniqid().'.txt', 'a+') or die('Cannot open file');
         fwrite($handle, $e->getMessage()."\n");
         fwrite($handle, $e->getTraceAsString()."\n");
         fclose($handle);

         echo json_encode(array(
             'status'   => 'FAILURE'
         ));
      }

95% の場合、アプリケーションは問題なく動作しますが、時々 $facebook->api('/me'); 「現在のユーザーに関する情報を照会するには、アクティブなアクセス トークンを使用する必要があります。 」という例外が発生し、$userID は 0 に等しくなります。

すべてのファイルで同じセッション ID を使用するには、POST で index.php によって渡された session_id を使用して手動でセッションを開始する必要があります。これは、一部のブラウザー (IE、サファリ) が iframe でサード パーティのページの Cookie を渡さないためです。(http://stackoverflow.com/questions/9930671/safari-3rd-party-cookie-iframe-trick-no-longer-working)

助言がありますか?ありがとうございました

4

1 に答える 1

0

セッション値が正常に渡されているかどうかを確認しますか?

于 2012-07-18T22:46:51.060 に答える