私はここ数年、新規にPHPで何か書くときは、FuelPHPというフレームワークを愛用しています。
ちょっと何時になったら2.0が出るのか不安になってきているところですが、まぁThinFrameworkとして便利に使っております。
今回は書捨てレベルのサービスで、一応recaptchaを入れるという段にあって、ライブラリとか使うの逆にめんどくせ。チョロっとそれっぽく動かしておこう。
というケースが有ったので、最低限でrecaptchaをfuelphpで動かすコードと手順を置いておきます。ウンコードですが。
あ、ちなみにもうPHP5.3以下の人はだいぶ減ったと思いますが、配列にShort Array Syntax([]で配列書けるやつ)を使っているので、必要に応じてarray()に修正してくださいね。
recaptchaのキーペアを取得する
Get Startガイドに書いてある、sign up for an API key pairに行き、導入したいドメイン用のキーペアを取得してください。
また、ドメインは複数指定可能で、デフォルトでlocalhost(127.0.0.1)は含まれています。ただ私は、手元の開発環境にはlvh.meを使っていることが多いので、本番のドメイン以外にこっち(lvh.me)も追加しました。
Captchaを導入したいフォームのページにJavascriptを導入する
まず
<head>~</head>の中に、
<script src='https://www.google.com/recaptcha/api.js'></script>
を置きます。
そして、recaptchaのフォームを出したい場所(ただし<form>~</form>内)に、
<div class="g-recaptcha" data-sitekey="##ここにSite Keyを入力##"></div>
を置くと、とりあえずrecaptchaのフォームが表示されます。
あとはサーバサイドでCaptchaの結果を検証するだけ。
FuelPHPの拡張バリデーションルールを作る
まぁバリデーションは多分FuelPHPのValidationクラスを使っていると思うので、今回はこちらの標準クラスに、recaptcha用のバリデーションルールを足す方法で行きます。
fuel/app/classesフォルダ内に、validaterecaptcha.phpを作ってください。
<?php
class ValidateRecaptcha
{
public static function _validation_recaptcha($val)
{
//POSTデータ
$data = http_build_query(
[
"secret" => "/* ReCaptchaのSecretを入力してください */",
"response" => $val
], "", "&");
//header
$header = [
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: ".strlen($data)
];
$context = [
"http" => [
"method" => "POST",
"header" => implode("\r\n", $header),
"content" => $data
]
];
$res = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify', false, stream_context_create($context)), true);
return ($res['success'] == 'true');
}
}
ここでAPIの呼出にfile_get_contentsでちょいちょいっと終わらせている辺が多分簡単。
拡張した独自バリデーションルールを使用する
もうこの辺はマニュアル見てくれってかんじですが、一応最後まで書いておきます。
Formからの送信を受けるコントローラーのアクションメソッドは、下のような形になります。
public function action_xxxx() {
$val = Validation::forge();
$val->add_callable('ValidateRecaptcha');
//↓が重要。captchaの結果はg-recaptcha-responseで帰ってくる。そのフィールドに独自ルールを設定
$val->add('g-recaptcha-response', 'Captchaコード', [], ['trim', 'required'])->add_rule('recaptcha');
if (!$val->run()) {
return Response::forge(View::forge('form', ['errors' => $val->error()]));
} else {
return Response::forge(View::forge('complete'));
}
}



コメント