SDk Facebooka nigdy nie grzeszyły ani stabilnością, ani rozbudowaną dokumentacją. Zespół developerów FB próbuje jednak tą dziurę łatać w kolejnych wersjach. Ostatnia, czwarta wersja SDK ma już znamiona używalnego. Wprowadza kilka zmian, które ułatwiają wiele elementów, jednak w pierwszym momencie można pogubić się co, jak i dlaczego. Spróbujemy przybliżyć zmiany na podstawie przypadku, kiedy użytkownik loguje się za pomocą SDK Javascriptowego, a następnie nasz program ma za zadanie wykorzystać ciastko otworzone w ten sposób do wykonywania zapytań z pomocą PHP.
//These need to be updated, obviously
$fb_app_id = "xxxxxxxxxxxxxxxxxxx";
$fb_app_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
require_once( 'Facebook/FacebookSession.php' );
require_once( 'Facebook/FacebookRedirectLoginHelper.php' );
require_once( 'Facebook/FacebookRequest.php' );
require_once( 'Facebook/FacebookResponse.php' );
require_once( 'Facebook/FacebookSDKException.php' );
require_once( 'Facebook/FacebookRequestException.php' );
require_once( 'Facebook/FacebookOtherException.php' );
require_once( 'Facebook/FacebookAuthorizationException.php' );
require_once( 'Facebook/GraphObject.php' );
require_once( 'Facebook/GraphSessionInfo.php' );
require_once( 'Facebook/FacebookSignedRequestFromInputHelper.php' );
require_once( 'Facebook/FacebookJavaScriptLoginHelper.php' );
require_once( 'Facebook\HttpClients\FacebookHttpable.php' );
require_once( 'Facebook\HttpClients\FacebookCurlHttpClient.php' );
require_once( 'Facebook\HttpClients\FacebookCurl.php' );
require_once( 'Facebook\Entities\SignedRequest.php' );
require_once( 'Facebook\GraphUser.php' );
use Facebook\GraphUser;
use Facebook\FacebookRequest;
use Facebook\FacebookRequestException;
use Facebook\FacebookSession;
use Facebook\FacebookSignedRequestFromInputHelper;
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\Entities\SignedRequest;
use Facebook\HttpClients\FacebookCurlHttpClient;
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookCurl;
FacebookSession::setDefaultApplication($fb_app_id, $fb_app_secret);
$session = null;
//Starting new session to remember the token
session_start();
/* checking if facebook session token is available */
if ( !empty( $_SESSION["fb_token"] ) ) {
try {
$session = new FacebookSession( $_SESSION["fb_token"] );
$session->validate();
} catch (FacebookAuthorizationException $ex) {
$session = null;
$_SESSION["fb_token"] = NULL;
}
} else {
// getting token from js api/sdk
$helper = new FacebookJavaScriptLoginHelper();
try {
$session = $helper->getSession();
// creating new, long lived session. Js returns shortly living token
$session = $session->getLongLivedSession();
// remembering token for further usage
$_SESSION["fb_token"] = $session->getToken();
} catch (FacebookRequestException $ex) {
// When Facebook returns an error
$_SESSION["fb_token"] = NULL;
echo $ex->getMessage();
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
if ($session) {
try {
//getting user data
$user_profile = (new FacebookRequest(
$session, 'GET', '/me'
))->execute()->getGraphObject(GraphUser::className());
//printing user data
print_r( $user_profile );
} catch (FacebookRequestException $e) {
print_r($e->getMessage());
return null;
}
}
Sam kod powinien być zrozumiały, jedna trzeba zwrócić uwagę na kilka rzeczy. Token zwracany przez getLongLivedSession() nie jest zapisywany przez SDK, należy go zapamiętać własnoręcznie, i wykorzystać do utworzenia kolejne sesji. Inaczej przy kolejnym requescie tracimy możliwość wykonania zapytania do API facebooka.
Kod służący do zainicjowania SDK po stronie js wygląda następująco:
window.fbAsyncInit = function() {
FB.init({
appId : '<?php echo $fb_app_id; ?>',
xfbml : true,
version : 'v2.0',
cookie:true
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
Zwracamy uwage na cookie:true, co tworzy ciastko po stronie serwera i daje nam dostęp do sesji z poziomu PHP.
Najnowsza wersja SDK wymaga PHP w wersji minimum 5.3.
Powodzenia!
Facebook SDK 4.0
https://developers.facebook.com/docs/reference/php/4.0.0

