日本でも着実にユーザーを増やしているFacebook。いいねボタンが色んなサイトに設置されていますし、
某CGMサイトでは自身のコメントシステムを排除してFacebookプラグインに置き換えたり(それまで投稿されたコメント見れなくなった…)と勢いがハンパないです。
そんな激アツなFacebookとCakePHPを連携してアカウントを作成するコントローラーを作成してみました。
- まずはオフィシャルのphp-sdkを入手
- ゲットしたファイル群をapp/vendorsにfacebookディレクトリを作って丸ごとぶち込む
- FacebookControllerを作成(ユーザ情報のテーブルを扱えるならなんでもいい)
さてここからコーディング開始。
まずはメンバ変数$facebookを宣言して、beforeFilter()でインスタンスを生成します。
var $facebook;
function beforeFilter(){
App::import('Vendor', 'facebook/src/facebook');
$this->facebook = new Facebook(array(
'appId' => '123456789123456789',
'secret' => '123456abcdefghijklmnopqrstuvwxyz',
'cookie' => true,
));
}
appIdとsecretは自分で登録したアプリの情報に置き換えてください。
php-sdkのexampleではFBMLとJavascriptを使ってログインボタンを生成してますが、今回は純粋にFacebookController::index()にアクセスしたらFacebookに飛ばされて初回だけ承認する流れにします。
なぜならphp以外の記述がめんどくさいからです!
では以下のようにindex()を用意します。
function index(){
$this->autoRender = false;
$url = $this->facebook->getLoginUrl(array('next' => 'http://localhost/facebook/callback', 'req_perms' => 'email,publish_stream'));
$this->redirect($url);
}
ここで重要なのが$autoRenderにfalseを代入しとかないとリダイレクトしてくれません。ちょっとハマりました。
でgetLoginUrl()メソッドでurlを生成するんですが、引数の連想配列に'req_perms'というキーでアプリからアクセス出来るapiを選べるんです。ユーザ登録に使うのでemailと、あとウォールへ書き込み出来るようにpublish_streamも入れています。ここのページでいろんなapiが確認出来ますよ->
Permissions - Facebook開発者
でさらにcallback()を用意します。
function callback(){
$session = $this->facebook->getSession();
$me = null;
if ($session) {
try {
$uid = $this->facebook->getUser();
$me = $this->facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
}
}
$access_token = $this->facebook->getAccessToken();
$user_data = array(
'User' => array(
'username' => $me['first_name'].'.'.$me['last_name'],
'password' => $this->Auth->password(mt_rand()),
'email' => $me['email'],
'other_service_id' => array('facebook' => $me['id'], 'token' => $access_token)
)
);
}
承認して戻って来たユーザの$sessionをとって確認して、api('/me')でユーザ情報の部分を叩けば名前とか、性別、言語等がゲット出来ます。ちなみにgetLoginUrl()のreq_permsで指定したemailも$meの中に入ってるんでpr($me)してみるといいと思います。
ここまでできたら$data['User']作成してユーザ登録、ログイン処理という感じなんですがaccessTokenも一緒にDBに保存しておけば以下のコードでウォールへの投稿もできましたよ。
$attachment = array(
'access_token' => $access_token,
'message' => "This is test.",
'name' => "name test",
'link' => "http://testtesttesttesttest.com",
'description' => "here description",
'picture'=> "http://example.jp/image.jpg"
);
$this->facebook->api('/me/feed', 'POST', $attachment);
こんなかんじで簡単にFacebbokConnectをCakePHPで使えました。