

### 起きている問題

WebサイトにreCAPTCHA v3を埋め込もうとしております。  
検証環境と本番環境（異なるレンタルサーバー）を用意し、全く同じWebサイトデータを再現しています。(PHP Ver.7.4)  
両サイトで同じreCAPTCHAを連携。同一キー、同一プログラムでreCAPTCHAが成功しているかの検証行ったところ、

  * 本番環境：100%の確率でreCAPTCHAが失敗
  * 検証環境：100%の確率でreCAPTCHAが成功

となり、本番環境でのみ、reCAPCHAが成功せず困っております。

**ソースコード**  
フォームのformタグの後ろに、次のコードを記述し、reCAPCHAを検証しております。

[code]

    <script>
    // reCAPTCHAのコールバック関数
    function onSubmit(token) {
    // reCAPTCHAトークンを非表示フィールドにセット
    document.getElementById("recaptchaResponse").value = token;
    
    // フォームを送信
    document.getElementById("contact_form").submit();
    }
    </script>
    
    <?php
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // フォームが送信された場合の処理
    
    // フォームデータを取得
    $form_title = $_POST['form_title'];
    $fullname = $_POST['fullname'];
    $phonetic = $_POST['phonetic'];
    // ... 他のフォームフィールドの取得 ...
    
    // Google reCAPTCHA v3のSecret keyを指定
    $secretKey = 'XXXXXX';
    
    // reCAPTCHAのトークンを取得
    $recaptchaToken = $_POST['recaptcha_response'];
    
    // reCAPTCHAのトークンをGoogleに送信して検証
    $recaptchaUrl = 'https://www.google.com/recaptcha/api/siteverify';
    $recaptchaData = array(
    'secret' => $secretKey,
    'response' => $recaptchaToken
    );
    
    $recaptchaOptions = array(
    'http' => array(
    'method' => 'POST',
    'header' => 'Content-type: application/x-www-form-urlencoded',
    'content' => http_build_query($recaptchaData)
    )
    );
    
    $recaptchaContext = stream_context_create($recaptchaOptions);
    $recaptchaResult = file_get_contents($recaptchaUrl, false, $recaptchaContext);
    $recaptchaResponse = json_decode($recaptchaResult);
    
    // reCAPTCHAが成功しているかを確認
    if ($recaptchaResponse->success) {
    // reCAPTCHAが成功した場合
    // 成功メッセージを表示
    echo "成功";
    } else {
    // reCAPTCHAが失敗した場合
    // エラーメッセージを表示
    }
    }
    ?>
    
[/code]

### 問題解決するために試したこと

$recaptchaContext、$recaptchaResult、$recaptchaResponseの値の取得内容を確認したところ、以下のような結果になりました。

【検証環境】

[code]

    $recaptchaContext→Resource id #20
    $recaptchaResult→ { "success": true, "challenge_ts": "2023-08-21T01:51:38Z", "hostname": "link-web.net", "score": 0.9 }
    $recaptchaResponse→Uncaught Error: Object of class stdClass could not be converted to string in /home/link-web/www/zenko/wp-content/themes/sanko/contact.php:1221 Stack trace: #0 /home/link-web/www/zenko/wp-includes/template-loader.php(106): include() #1 /home/link-web/www/zenko/wp-blog-header.php(19): require_once('/home/link-web/...') #2 /home/link-web/www/zenko/index.php(17): require('/home/link-web/...') #3 {main} thrown in /home/link-web/www/zenko/wp-content/themes/sanko/contact.php on line 1221
    
[/code]

【本番環境】

[code]

    $recaptchaContext→Resource id #717
    $recaptchaResult→ 空
    $recaptchaResponse→ 空
    
[/code]

Resource idの値が違っているのでここが糸口になるのかと思うのですが、このResource idが何を示しているのかがわかりませんでした。

このResource idの件を含め、問題解決につながるアドバイスをいただけますと幸いです。


CC BY-SA 4.0
2023-08-21T06:03:39.283
95997
2023-08-21T06:51:11.900
2023-08-21T06:51:11.900
3060
59535
question
php recaptcha
Webサイトに埋め込んでいるreCAPTCHA v3が、正しく成功しない