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