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 PHPのpersistent_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\FacebookResponse
のgetGraphUser
メソッドを呼ぶとユーザノードを表すFacebook\GraphNodes\GraphUser
のオブジェクトが取得できます。