I'm using CodeIgniter, I've installed Facebook SDK 4. I had to do this with inclusion of files, because autoload didn't work. I'm using Javascript to login user.
This is facebook.php (in library-root). I have facebook to autoload in config.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// Autoload the required files
require_once( APPPATH.'libraries/Facebook/FacebookSession.php' );
require_once( APPPATH.'libraries/Facebook/FacebookRequest.php' );
require_once( APPPATH.'libraries/Facebook/FacebookResponse.php' );
require_once( APPPATH.'libraries/Facebook/FacebookSDKException.php' );
require_once( APPPATH.'libraries/Facebook/FacebookRequestException.php' );
require_once( APPPATH.'libraries/Facebook/FacebookAuthorizationException.php' );
require_once( APPPATH.'libraries/Facebook/GraphObject.php' );
require_once( APPPATH.'libraries/Facebook/FacebookSignedRequestFromInputHelper.php' );
require_once( APPPATH.'libraries/Facebook/FacebookJavaScriptLoginHelper.php' );
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookSession;
class Facebook {
var $ci;
var $permissions;
public function __construct() {
$this->ci =& get_instance();
$this->permissions = $this->ci->config->item('permissions', 'facebook');
// Initialize the SDK
$this->ci->config->load('facebook');
FacebookSession::setDefaultApplication( $this->ci->config->item('api_id', 'facebook'), $this->ci->config->item('app_secret', 'facebook') );
$helper = new FacebookJavaScriptLoginHelper(); //This row gives me a blank "white page" and no errror is given, nothing in log or whatsoever.
try {
$session = $helper->getSession();
} catch(FacebookRequestException $ex) {
// When Facebook returns an error
} catch(\Exception $ex) {
// When validation fails or other local issues
}
if ($session !== null) {
$request = new FacebookRequest( $session, 'GET', '/me' )->execute();
$user = $request->getGraphObject()->asArray();
}
else {
echo 'no user';
}
}
}
Why do I get no user all the time? $session always is null even if I'm logged in. I'm sure that appid and secret is correct.
UPDATE
I WAS sure that appid and secret was correct, but I was wrong... But now I get a another problem. When I try to create FacebookJavascriptLoginHelper
() some kind of exception is made. I just get a blank page. What could this be? (When I'm not logged in it shows the website as normal.
I've tried to log errors but I don't get any errors at alla in my logfiles. (I've set that to log alla erorrs in config)
My susspicion is that a file isn't found that is needed. I've tried using the autoload routine as documented at: http://www.benmarshall.me/facebook-sdk-php-v4-codeigniter/ but I couldn't get that to work (none of these fb-files were included). Then no file were included.
UPDATE2 I've understand you really should use Composer for autoloading Facebook files correctly.
I gave it a try: Based on this. All I would have to is add an entry to composer.json https://developers.facebook.com/docs/php/gettingstarted/4.0.0
When I have this: (I've downloaded file from https://github.com/facebook/facebook-php-sdk-v4/archive/master.zip )
{
"name": "facebook/php-sdk-v4",
"description": "Facebook SDK for PHP",
"keywords": ["facebook", "sdk"],
"type": "library",
"homepage": "https://github.com/facebook/facebook-php-sdk-v4",
"license": "Facebook Platform",
"authors": [
{
"name": "Facebook",
"homepage": "https://github.com/facebook/facebook-php-sdk-v4/contributors"
}
],
"require": {
"php": ">=5.4.0",
"ext-mbstring": "*"
},
"require-dev": {
"phpunit/phpunit": "~4.0",
"mockery/mockery": "~0.8",
"guzzlehttp/guzzle": "~4.0"
},
"suggest": {
"guzzlehttp/guzzle": "Allows for implementation of the Guzzle HTTP client"
},
"autoload": {
"psr-4": {
"Facebook\\": "src/Facebook/"
}
},
"autoload-dev": {
"psr-4": {
"Facebook\\Tests\\": "tests/"
}
},
"extra": {
"branch-alias": {
"dev-master": "4.1.x-dev"
}
}
}
It works to enter composer install
in command window (Windows) and vendor folder inside my libraries folder is created and it looks correct.
BUt when I add "facebook/php-sdk-v4" : "4.0.*" to Require-section:
"require": {
"php": ">=5.4.0",
"ext-mbstring": "*",
"facebook/php-sdk-v4" : "4.0.*"
},
I get this error (from composer): The request package Facebook facebook/php-sdk-v4 could not be found in any verision.
UPDATE3 Now I've managed to download Facebook SDK from Composer, but still I can't manage to the autoload to work. I hade to able to this adjustment to download facebook sdk from composer.
{
"minimum-stability": "dev",
"require" : {
"facebook/php-sdk-v4" : "4.0.*"
}
}
I've given up the autoload, cause I'm not able to get it to work in that way. But I got it to work now!!!!
I've installed Composer (having WAMP you need to change openssl to be available in the PHP-ini in the php-folder (there are two php-ini files for wamp)
I created a file in the libraries folder of my CI application
composer.json
{
"minimum-stability": "dev",
"require" : {
"facebook/php-sdk-v4" : "4.0.*"
}
}
and then composer install in command prompt.
I moved the src/facebook-folder to libraries/facebook (with all Facebook classes from the SDK). ( https://www.webniraj.com/2014/06/07/facebook-api-setting-up-the-facebook-php-sdk-4-0-x/ )
And then creating a Facebook.php (in root libraries) like this:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// Autoload the required files
require_once( 'Facebook/HttpClients/FacebookHttpable.php' );
require_once( 'Facebook/HttpClients/FacebookCurl.php' );
require_once( 'Facebook/HttpClients/FacebookCurlHttpClient.php' );
require_once( 'Facebook/Entities/AccessToken.php' );
require_once( 'Facebook/Entities/SignedRequest.php' );
require_once( 'Facebook/FacebookSession.php' );
require_once( 'Facebook/FacebookRedirectLoginHelper.php' );
require_once( 'Facebook/FacebookSignedRequestFromInputHelper.php' );
require_once( 'Facebook/FacebookJavaScriptLoginHelper.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' );
use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookCurl;
use Facebook\HttpClients\FacebookCurlHttpClient;
use Facebook\Entities\AccessToken;
use Facebook\Entities\SignedRequest;
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookOtherException;
use Facebook\FacebookAuthorizationException;
use Facebook\GraphObject;
use Facebook\GraphSessionInfo;
class Facebook {
var $ci;
var $permissions;
public function __construct() {
$this->ci =& get_instance();
$this->permissions = $this->ci->config->item('permissions', 'facebook');
// Initialize the SDK
$this->ci->config->load('facebook');
FacebookSession::setDefaultApplication( $this->ci->config->item('api_id', 'facebook'), $this->ci->config->item('app_secret', 'facebook') );
//Get info based on javascript popup session
$helper = new FacebookJavaScriptLoginHelper();
//If token not already set, then try to fetch session from current FB Login!
//
if ( !$this->ci->session->userdata('fb_token') ) {
try {
$session = $helper->getSession();
} catch(FacebookRequestException $ex) {
// When Facebook returns an error
log_message('INFO', 'FB ERROR' . print_r($ex,true));
} catch(\Exception $ex) {
// When validation fails or other local issues
log_message('INFO', 'FB VALIDATION FAILS' . print_r($ex,true));
}
}
else {
//FB Token already set. Then fetch user information based on token!
$fb_token = $this->ci->session->userdata('fb_token');
$session = new FacebookSession( $fb_token );
}
//Now session is set by current logged in session or by current token set
//(Session is retrieved from FB)
if (isset($session)) {
$this->ci->session->set_userdata( 'fb_token', $session->getToken() );
$request = new FacebookRequest( $session, 'GET', '/me' );
$response = $request->execute();
$user = $response->getGraphObject()->asArray();
}
}
}
I got it to work without having any errors. You can't just try to do a login-check everytime because then FB would return an (annoying ) error. Therefore I store the token recieved in session after first login. Second time (and beyond).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.