reCAPTHAをお問い合わせフォームに組み込もう

目次

reCAPTHAをお問い合わせフォームに組み込もう

reCAPTHAをlocalhost専用として登録しよう

スパム対策のために、reCAPCHAをお問い合わせフォームに入れようと思う。

https://www.google.com/recaptcha/admin

上記にアクセスして、localhostを登録。

サイトキーシークレットキーは後で使うので、このページは表示したままにしてください。

reCAPCHAをお問い合わせフォームのページに入れよう

サイトキーとシークレットキーが取得出来たら、コーディングしましょう。

Viewの下の方に下記を記述。

サイトキーは先ほど取得したものに置き換えてください。

HTML(Views/contact.php)
<script src="https://www.google.com/recaptcha/api.js?render=サイトキー"></script>

次に、formの中にreCAPCHA専用のhiddenフィールドを記述。

HTML(Views/contact.php)
    <form id="contact" name="contact" method="POST" action="/contact.php" class="border-2 border-teal-300 rounded-xl p-4">
        <input type="hidden" name="recaptchaResponse" id="recaptchaResponse">
        ...
    </form>

別記事でform.addEventListner(‘submit’…を書いた続きに下記を記述。

JavaScript
    e.preventDefault();

    grecaptcha.ready(function () {
      grecaptcha.execute('サイトキー', { action: 'contact' }).then(function (token) {
        document.getElementById('recaptchaResponse').value = token;

        form.submit(); // トークンセット後に送信
      });
    });

最後に、Controllerに下記を記述。

Controller
$recaptchaToken = $_POST['recaptchaResponse'] ?? '';

if (!$recaptchaToken) {
  exit('reCAPTCHAトークンがありません');
}

$secretKey = 'シークレットキー';

$ch = curl_init();
curl_setopt_array($ch, [
  CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => http_build_query([
    'secret'   => $secretKey,
    'response' => $recaptchaToken,
    'remoteip' => $_SERVER['REMOTE_ADDR'],
  ]),
  CURLOPT_RETURNTRANSFER => true,
]);

$response = curl_exec($ch);
curl_close($ch);

$result = json_decode($response, true);

if (
  empty($result['success']) ||
  $result['score'] < 0.5 ||
  $result['action'] !== 'contact'
) {
  exit('不正な送信と判断されました');
}

お問い合わせフォームの右下に下記のアイコンが表示されていれば、
reCAPCHAの設定が完了しています。

curl_ini()が動かない

reCATCHAの設定が終わったところで、いざメール送信してみたら、思いっきりエラーが出た。

何がダメなのか調べたところ、$ch = curl_init(); でエラーになっていた。

これは、拡張dllが必要なようで、php.iniのextension=curlの部分のコメントを外してApacheを再起動した。

すると、php_curl.dllが無いと言われちまった・・・

確認したら、該当のフォルダにphp_curl.dllはありました!

httpd-xampp.confにlibssh2.dllの記述をする

恐らくXAMPP特有の問題だと思うけれど、上記はhttpd-xampp.confの問題らしい。

httpd-xampp.confに「LoadFile “(PHPフォルダがあるディレクトリ)/libssh2.dll”」の記述をすれば

無事にcurl_ini()を動かすことが出来ました!

SSL証明書が無いと怒られた

これで大丈夫だろうと再びメール送信してみたところ、「不正な送信と判断されました」との画面表示・・・

$resultをvar_dumpしてみるとNULLになっていた。

さらにvar_dump(curl_error($ch));してみたところ、

「SSL certificate problem: unable to get local issuer certificate」との表示。

あ、これSSL証明書が無いから通してもらえないという原因だったんだ。

またこれもXAMPPによくあるエラーみたいで、

curl_setopt_arrayの中の最後に一行追加。

Controller
    curl_setopt_array($ch, [
      CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
      CURLOPT_POST => true,
      CURLOPT_POSTFIELDS => http_build_query([
        'secret'   => $secretKey,
        'response' => $recaptchaToken,
        'remoteip' => $_SERVER['REMOTE_ADDR'],
      ]),
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_SSL_VERIFYPEER => false, // ← 検証用(本番では true 推奨)
    ]);

お陰様で、無事にメール送信までこぎつけられました。

これで安心!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次