Facebook SDK for PHP (facebook/graph-sdk) v5.xのインストールと使い方まとめ


PHP用Facebook SDK v5を利用してFacebookアプリを作成する最小限の手順です。
Github: facebook/php-graph-sdk

以前に書いた記事「Facebook PHPをComposerで利用するには」の内容が、古くなっていたので、改めて試してまとめました。

SDKのインストール

Instllationに従い、facebook/graph-sdkをcomposerでインストール

$ composer require facebook/graph-sdk

facebook/graph-sdkが含まれる以下のcomporser.jsonが生成される

// composer.json
{
  "require" : {
    "facebook/graph-sdk": "^5.6"
  }
}

ログインサンプル

php-graph-sdk/facebook_login.mdのサンプルを実装して動作を確認してみます。

// login.php
<?php
require_once __DIR__ . "/vendor/autoload.php";

session_start();

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.10',
]);

$helper = $fb->getRedirectLoginHelper();

$permissions = ['email']; // Optional permissions
$loginUrl = $helper->getLoginUrl('https://example.com/fb-callback.php', $permissions);

echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>';

session_start();をしていないとコールバックで以下のエラーになります。

Facebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing from persistent data.

persistent_data_handlerのデフォルトはPHPセッションが使われるため。

参照: Facebook service class for the Facebook SDK for PHPpersistent_data_handlerを参照

コールバックは以下のようなコードになります

//fb-callback.php
<?php
require_once __DIR__ . "/vendor/autoload.php";

session_start();

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.10',
]);

$helper = $fb->getRedirectLoginHelper();

try {
  $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  // When Graph returns an error
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  // When validation fails or other local issues
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

if (! isset($accessToken)) {
  if ($helper->getError()) {
    header('HTTP/1.0 401 Unauthorized');
    echo "Error: " . $helper->getError() . "\n";
    echo "Error Code: " . $helper->getErrorCode() . "\n";
    echo "Error Reason: " . $helper->getErrorReason() . "\n";
    echo "Error Description: " . $helper->getErrorDescription() . "\n";
  } else {
    header('HTTP/1.0 400 Bad Request');
    echo 'Bad request';
  }
  exit;
}

// ... 長期トークンへの変換処理は省略

$_SESSION['fb_access_token'] = (string) $accessToken;

header('Location: index.php');

ユーザプロフィールの取得

ログイン後のindex.phpでは、Retrieve User Profile via the Graph APIを参考にログインユーザ プロフィールの取得を試してみます。

// index.php
<?php
require_once __DIR__ . "/vendor/autoload.php";

session_start();

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.10',
  ]);

try {
  // Returns a `Facebook\FacebookResponse` object
  $response = $fb->get('/me?fields=id,name', $_SESSION['facebook_access_token']);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}

$user = $response->getGraphUser();

echo 'Name: ' . $user['name'];

/meでアクセストークンのユーザのプロフィールを取得するには、Facebook\Facebook クラスの get メソッドを使います。
getメソッドの戻り値は、Facebook\FacebookResponseのインスタンスです。
Facebook\FacebookResponsegetGraphUserメソッドを呼ぶとユーザノードを表すFacebook\GraphNodes\GraphUserのオブジェクトが取得できます。