PHPの自作お問い合わせフォームにGoogle reCAPTCHA v3を導入する方法|送信時にトークンを取得する実装も解説
公開日:2026.06.23 更新日:2026.06.23
PHP
この記事には広告が含まれています。

はじめに
PHPで自作のお問い合わせフォームを作成すると、避けて通れないのがスパム対策です。
特にお問い合わせフォームはボットから大量のスパム送信を受けやすく、何も対策をしていないと迷惑メールが増えてしまいます。
そこでおすすめなのが「Google reCAPTCHA v3」です。
reCAPTCHA v3は、ユーザーに画像認証やチェックボックスを表示することなく、不正アクセスかどうかを自動判定してくれます。
この記事では、PHPで作成したお問い合わせフォームへreCAPTCHA v3を導入する方法を解説します。
また後半では、
- 入力時間が長いフォーム
- 確認事項を読んでから送信するフォーム
などでおすすめの「送信ボタンを押したタイミングでトークンを取得して送信する方法」も紹介します。
reCAPTCHA v3とは
Googleが提供するスパム対策サービスです。
従来の
- 「私はロボットではありません」
のようなチェックボックスは表示されません。
ユーザーの操作を解析し、
- 人間
- ボット
を自動判定します。
そのためUX(ユーザー体験)を損なわずにスパム対策ができます。
導入の流れ
導入手順は以下の4ステップです。
- Google reCAPTCHAへサイト登録
- サイトキー・シークレットキー取得
- フォームへJavaScript追加
- PHPでトークンを検証
Googleでサイト登録
Google reCAPTCHAの管理画面からサイトを登録します。
設定内容は以下のようになります。
- ラベル:サイト名
- タイプ:reCAPTCHA v3
- ドメイン:example.com
登録すると
- Site Key
- Secret Key
が発行されます。
HTMLへ追加する
まずはJavaScriptを読み込みます。
<script src="https://www.google.com/recaptcha/api.js?render=サイトキー"></script>
フォームにはトークン保存用のhiddenを追加します。
<input type="hidden" id="recaptchaToken" name="recaptchaToken">
ページ表示時に取得する一般的な方法
もっともよく紹介されている方法です。
grecaptcha.ready(function () {
grecaptcha.execute("サイトキー", {action: "submit"}).then(function(token) {
var recaptchaResponse = document.getElementById("recaptchaResponse");
recaptchaResponse.value = token;
});
});
この方法ならフォーム表示時にトークンを取得できます。
PHP側で検証
送信されたトークンをGoogleへ送信します。
$secret = "シークレットキー";
$response = file_get_contents(
"https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response=".$_POST["recaptchaToken"]);
$result = json_decode($response,true);
判定します。
if($result["success"] && $result["score"] >= 0.5){
//送信処理
}else{
//エラー
}
scoreは0〜1です。
一般的には
- 0.5以上
を許可するケースが多くなっています。
トークンには有効期限がある
ここで一つ注意があります。
実は、「reCAPTCHA v3」のトークンは永続ではありません。
発行から2分で失効します。フォームを開いたまま時間が経ってから送信すると、Googleの検証でエラーになります。
そのため、
- 入力項目が多い
- 確認事項を読む
- 利用規約が長い
このようなフォームでは、
ページ表示時に取得したトークンが期限切れになることがあります。
おすすめは送信時に取得する方法
この問題を防ぐため、
送信ボタンを押したタイミングでトークンを取得する方法
がおすすめです。
流れは
送信ボタンクリック
↓
reCAPTCHA実行
↓
トークン取得
↓
hiddenへセット
↓
submit()
になります。
JavaScript実装例
$('input[type="submit"]').on('click', function(e) {
e.preventDefault();
grecaptcha.ready(function() {
grecaptcha.execute('シークレットキー', {action: 'contact'}).then(function(token) {
document.getElementById('recaptchaResponse').value = token;
setTimeout(function() {
document.querySelector('form[name="form_contact"]').submit();
}, 100);
});
});
});
この方法のメリット
メリットは非常に多くあります。
トークン切れを防げる
送信直前に取得するため、有効期限切れになりません。
入力時間を気にしなくてよい
例えば
- 名前
- 住所
- 電話番号
- お問い合わせ内容
など入力に5〜10分かかっても問題ありません。
利用規約を読ませるフォームにも向いている
企業サイトでは
- 注意事項
- 個人情報保護方針
- 利用規約
などを読んでから送信するケースがあります。
その場合でも安心です。
どちらの方法がおすすめ?
ページ表示時取得
おすすめケース
- ログイン画面
- 検索フォーム
- 入力項目が少ない
送信時取得
おすすめケース
- お問い合わせフォーム
- 会員登録
- 資料請求
- 求人応募
- アンケート
ほとんどの場合はこちらがおすすめです。
まとめ
reCAPTCHA v3は、ユーザーに余計な操作をさせることなくスパム対策ができる便利なサービスです。
一般的にはページ表示時にトークンを取得する実装が紹介されていますが、入力時間が長いフォームではトークンの有効期限切れが発生することがあります。
そのため、自作のお問い合わせフォームでは送信ボタンを押したタイミングでトークンを取得して送信する方法がおすすめです。
少し実装が増えるだけで、安全性と安定性が向上するため、これから新しくフォームを作成する方はぜひ採用してみてください。