Facebook应用程序不能在IE中工作(重定向到主机Canvas回调URL)


Facebook application doesn't work in IE(Redirecting to the host Canvas Callback URL)

我有一个名为fbmain.php的文件,它做所有facebook身份验证部分。在index。php文件中有一个按钮它将数据传递给。php文件
这只是一个例子

//fbmain.php : do all facebook authentication parts
//index.php
      <?php
           include_once "fbmain.php";
       ?>
<form enctype="multipart/form-data" action="http://myserver/a/a.php" method="POST">
     //Some codes 
     <input type="submit" value="Upload"/>
</form>

在.php文件中,我必须再次包含fbmain.php,因为这里我做了一些api调用。

  //a.php
<?php    
    include_once "fbmain.php";
        //some codes            
            try{            
                $me = $facebook->api('/me?access_token='. $token); 
                print_r($me);               
            } catch(FacebookApiException $e){
                echo "Error:" .$e;
            }
?>

这个应用程序在firefox浏览器中工作良好,但不工作在IE(当用户点击'上传按钮它重定向用户到主机画布回调URL')。

我试着在每个文件(fbmain.php, index.php, a.p p)的顶部放置下面的代码。但它仍然不起作用?

首先我试了这个

header('P3P: CP=HONK');
ob_start();

然后我试了这个

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');    
ob_start();

但是在IE中什么都不起作用。
有人能帮帮我吗?

//fbmain.php文件
<?php
    //header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
    header('P3P: CP="CAO PSA OUR"');
    ob_start();
    //facebook application
    //set facebook application id, secret key and api key here
    $fbconfig['appid' ] = "MY_APP_ID";      
    $fbconfig['api'   ] = "MY_API_KEY";
    $fbconfig['secret'] = "MY_APP_SECRET";
    //set application urls here
    $fbconfig['baseUrl']    =   "http://MYSERVER/uploader/index.php"; //http://thinkdiff.net/demo/newfbconnect1/iframe;
    $fbconfig['appBaseUrl'] =   "http://apps.facebook.com/approne"; //http://apps.facebook.com/thinkdiffdemo;
    $uid            =   null; //facebook user id
    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,
    ));
    //Facebook Authentication part
    $session = $facebook->getSession();
    $loginUrl = $facebook->getLoginUrl(
            array(
            'canvas'    => 1,
            'fbconnect' => 0,
            'req_perms' => 'email,publish_stream,status_update,user_photos'
            )
    );
    if (!$session) {
        echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
        exit;
    } 
    if ($session) {
        try {
            $uid      =   $facebook->getUser();
                //Has a loading problem
        } catch (FacebookApiException $e) {
            echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
            exit;
        }       
    }
    $signed_request = $_REQUEST['signed_request'];
    $secret = $fbconfig['secret'];
    $data = parse_signed_request($signed_request, $secret);
    $fan_page_id = $data['page']['id'];
    $admin_check = $data['page']['admin'];
        //Get fan page id
    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, '-_', '+/'));
    }   
?>

我在IE之前遇到过一个类似的问题,用户会话不是持久的服务器端。为了解决这个问题,我在包含signed_request .

的IE表单中添加了一个隐藏字段。
<input type='hidden' name='signed_request' value='VALID_SIGNED_REQUEST' />

但是这个解决方案应该与code参数一起工作,或者通过传递授权令牌,然后使用它来恢复用户会话服务器端。您也可以尝试维护自己的会话cookie。


我看到你正在使用PHP SDK的pre v3。因此,您应该尝试添加隐藏字段:

<input type='hidden' name='session' value='<?php echo json_encode($session); ?>' />