PR

FuelPHPでrecaptchaを使うおそらく最も簡単な方法

FuelPHP

私はここ数年、新規に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'));
    }
}

コメント

タイトルとURLをコピーしました