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ステップです。

  1. Google reCAPTCHAへサイト登録
  2. サイトキー・シークレットキー取得
  3. フォームへJavaScript追加
  4. 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は、ユーザーに余計な操作をさせることなくスパム対策ができる便利なサービスです。

一般的にはページ表示時にトークンを取得する実装が紹介されていますが、入力時間が長いフォームではトークンの有効期限切れが発生することがあります。

そのため、自作のお問い合わせフォームでは送信ボタンを押したタイミングでトークンを取得して送信する方法がおすすめです。

少し実装が増えるだけで、安全性と安定性が向上するため、これから新しくフォームを作成する方はぜひ採用してみてください。