0

index.php に次のコードがあります。

 $config = array(
'appId' => AppInfo::appID(),
'secret' => AppInfo::appSecret(),
'cookie' => true
);
$facebook = new Facebook($config);

$app_name = "AppName";
$fbPermissions = 'email';  
$validUser = 1;
$fbuser = $facebook->getUser(); // get user
$fbname = "";
$fbmail = "";
$fbid = 0;
$user_profile = null;

if(!$fbuser) 
{
$validUser = 0;
}
else
{
 try {
    $user_profile = $facebook->api('/me'); //user profile
    $user_permissions = $facebook->api("/me/permissions"); //list of user permissions
  } catch (FacebookApiException $e) {
     $fbuser = null;
     $user_permissions = null;
  }

  $permissions_needed = explode(',',$fbPermissions); // permission required to proceed
  foreach($permissions_needed as $per) //loop thrugh each permission
  {
    if ($user_permissions != null) { 
        if(!array_key_exists($per, $user_permissions['data'][0])){
            $validUser = 0;
        }
    }
  }
}
if($validUser == 1){
$fbname = $user_profile["last_name"]." ".$user_profile["first_name"];
$fbmail = $user_profile["email"];
$fbid = $user_profile["id"];
}

if(isset($_POST['submit'])) {
header( 'Location: writetocsv.php?id='.$_POST['fbid'].'&name='.$_POST['fbname'].'&email='.$_POST['email'] ) ;
}

    if($signed_request = parsePageSignedRequest()){
        if($signed_request->page->liked) {
            if(!userIsInDatabase($fbid)){
                include("pages/fanpage.php");
                echo "fanpage";
            }
            else{
                include("pages/thankyou.php");
                echo "thankyoupage";
            }
        } else {
            include("pages/notfanpage.php");
            echo "notafanpage";
        }
    }

?>

 <script>
      // Additional JS functions here
      function login() {
        FB.login(function(response) {
            if (response.authResponse) {
                // connected        

            } else {
                // cancelled
            }
        },{scope:"email"});
        }
      window.fbAsyncInit = function() {
        FB.init({
          appId      : <?php echo AppInfo::appID(); ?> , // App ID
          channelUrl : 'channel.html', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });

        // Additional init code here
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                // connected
            } else if (response.status === 'not_authorized') {
                // not_authorized

                login();
            } else {
                // not_logged_in

                login();
            }
        });
      };

      // Load the SDK Asynchronously
      (function(d){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         ref.parentNode.insertBefore(js, ref);
       }(document));
      </script>

わかりましたので、少し説明させてください。新しいユーザーが私のタブ アプリ ページに接続すると、notafanpage.php が表示されます。彼が私のページを気に入ると、タブが自動的に更新され、fanpage.php が表示されます。この fanpage.php には、収集する必要がある名前とメールを含むフォームがあります。彼が送信を押した後、入力を検証する index.php にリダイレクトされ (まだ行われていません)、次に writetocsv.php?id=..&name=..&mail=.. に戻ります。その後、index.php にリダイレクトされます。これは、バグが発生する場所です。OAuthException: 現在のユーザーに関する情報を照会するには、アクティブなアクセス トークンを使用する必要があります。助言がありますか ?

編集:

まあ、私は自分でそれを理解しました。この問題を抱えている人にとって、ここに解決策があります:

Facebook は、アプリに初めてアクセスしたときにのみ、署名された要求を送信します。したがって、signedrequest をセッションに保存する必要があります。アクセス トークンについては、最初のアクセス トークンを覚えておき、ページが再読み込みされるたびに $facebook->setAccesToken($accestoken) メソッドを使用して設定する必要があります。幸運を !

4

1 に答える 1

0

まあ、私は自分でそれを理解しました。この問題を抱えている人にとって、ここに解決策があります:

Facebookは、アプリに初めてアクセスしたときにのみ、署名された要求を送信します。したがって、signedrequest をセッションに保存する必要があります。$facebook->setAccesToken($accestoken)アクセス トークンに関しては、最初のアクセス トークンを覚えておき、メソッドを介してページをリロードするたびに設定する必要があります。幸運を !

于 2013-03-18T11:39:12.870 に答える