reCAPTHAをお問い合わせフォームに組み込もう
reCAPTHAをlocalhost専用として登録しよう
スパム対策のために、reCAPCHAをお問い合わせフォームに入れようと思う。
https://www.google.com/recaptcha/admin
上記にアクセスして、localhostを登録。

サイトキーとシークレットキーは後で使うので、このページは表示したままにしてください。
reCAPCHAをお問い合わせフォームのページに入れよう
サイトキーとシークレットキーが取得出来たら、コーディングしましょう。
Viewの下の方に下記を記述。
サイトキーは先ほど取得したものに置き換えてください。
<script src="https://www.google.com/recaptcha/api.js?render=サイトキー"></script>次に、formの中にreCAPCHA専用のhiddenフィールドを記述。
<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’…を書いた続きに下記を記述。
e.preventDefault();
grecaptcha.ready(function () {
grecaptcha.execute('サイトキー', { action: 'contact' }).then(function (token) {
document.getElementById('recaptchaResponse').value = token;
form.submit(); // トークンセット後に送信
});
});
最後に、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の中の最後に一行追加。
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 推奨)
]);お陰様で、無事にメール送信までこぎつけられました。
これで安心!
