Domanda

I have a facebook app working at https://apps.facebook.com/inboxcupid/

When trying to log in from a mobile device, the GetUser method always return 0. It actually creates a redirect loop as the page is constantly redirected to login, return to the app page and then back to login.

It's imperative to know that this code works just fine on a desktop but fails on mobile.

Here is my code:

require_once ('facebook.php');

$config = array(
    'appId' => '*****',
    'secret' => '*****'
);

// Create the Facebook object
$facebook = new Facebook($config);

$login_params = array(
    'canvas' => 1,
    'scope' => 'basic_info, user_about_me, user_birthday, user_relationships, user_relationship_details, user_location, user_photos',
    'fbconnect' => 1,
  );

$user = $facebook->getUser();

if($user) {
    try {
        $permissions = $facebook->api("/me/permissions");
        if( !array_key_exists('basic_info', $permissions['data'][0]) || !array_key_exists('user_location', $permissions['data'][0]) || !array_key_exists('user_about_me', $permissions['data'][0]) || !array_key_exists('user_birthday', $permissions['data'][0]) || !array_key_exists('user_relationships', $permissions['data'][0]) || !array_key_exists('user_relationship_details', $permissions['data'][0]) || !array_key_exists('user_photos', $permissions['data'][0]) ) {
            $login_url = $facebook->getLoginUrl($login_params); 
            echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; 
        }

    } catch(FacebookApiException $e) {
        $login_url = $facebook->getLoginUrl($login_params); 
        echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; 
        error_log($e->getType());
        error_log($e->getMessage());
    }   
} else {
    $login_url = $facebook->getLoginUrl($login_params);
    echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; 
}

If anyone can help me figure it out I'll be thankful.

È stato utile?

Soluzione

Finally get it working.

It seems that in mobile the php sdk doesn't get and store the access token automatically and it can be done manually.

Here is my code, per your enjoyment...

require_once ('facebook.php');

// Set authentication variables
$config = array(
    'appId' => '374681629327567',
    'secret' => '463cd6dc258e1225b86ac529a391f4e9',
    'cookie' => true,
);

// Create the Facebook object
    $facebook = new Facebook($config);

$login_params2 = array(
    'canvas' => 0,
    'scope' => 'basic_info, user_about_me, user_birthday, user_relationships, user_relationship_details, user_location, user_photos',
    'display' => 'touch',
    'redirect_uri' => 'https://secure.inboxcupid.co.il/mobile/index.php'
);

$user = $facebook->getUser();
if($user) {
    try {
        $permissions = $facebook->api("/me/permissions");
        if( !array_key_exists('basic_info', $permissions['data'][0]) || !array_key_exists('user_location', $permissions['data'][0]) || !array_key_exists('user_about_me', $permissions['data'][0]) || !array_key_exists('user_birthday', $permissions['data'][0]) || !array_key_exists('user_relationships', $permissions['data'][0]) || !array_key_exists('user_relationship_details', $permissions['data'][0]) || !array_key_exists('user_photos', $permissions['data'][0]) ) {
            $login_url = $facebook->getLoginUrl($login_params);                                 
            echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; 
        }

    } catch(FacebookApiException $e) {
        $login_url = $facebook->getLoginUrl($login_params); 
        echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; 
        error_log($e->getType());
        error_log($e->getMessage());
    }   
} else {
    $login_url = $facebook->getLoginUrl($login_params2);
    if(isset($_GET['code'])) {
        $token_url = 'https://graph.facebook.com/oauth/access_token?client_id=****&redirect_uri=' . urlencode('https://secure.inboxcupid.co.il/mobile/index.php') . '&client_secret=****&code=' .$_GET['code'];
        $response = file_get_contents($token_url);
        $params = null;
        parse_str($response, $params);
        if(!isset($params['access_token'])) { echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; }
        $graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token'];
        $user2 = json_decode(file_get_contents($graph_url));
        $user = $user2->id;
        $facebook->setAccessToken($params['access_token']);
    }
    else {
        echo "<script" . " type='text/javascript'" . ">top.location.href = '$login_url';</script>"; 
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top