Задать вопрос
@webpirat777

Почему отображается ошибка «Invalid recaptcha verify response»?

Yii начал изучать буквально 2 недели назад. Решил внедрить в форму reCaptcha v2 от Google.
После заполнения формы и по нажатию кнопки отправить у меня отображается ошибка: "Invalid recaptcha verify response". Кто может подсказать чем вызвана данная проблема?

Использую yii-basic шаблон.
Через composer устанавливал в проект himiklab\yii2-recaptcha-widget.

entry.php

// Представление формы

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\MaskedInput;                
<code lang="html">
<div class="form">
    <div class="form__wrap">
        <div class="form__close">&times;</div>
        <h2 class="form__title">Заполните анкету</h2>

        <?php
        // Начало ActiveForm
        $form = ActiveForm::begin([
            'enableAjaxValidation' => false,  
            'id' => 'sendcheck',
            'method' => 'POST',
            'action' => ['site/entry'],
        ])
        ?>
         // остальной код
        <div class="form__recaptcha">
            <?= $form->field($model, 'reCaptcha')->widget(\himiklab\yii2\recaptcha\ReCaptcha2::class, ['siteKey' => '6LdvXFAqAAAAA-XXXXXXXXXX'])-> label(false) ?>
        </div>

        <div class="form__button">
            <?= Html::submitButton('Отправить') ?>
        </div>
        
        <!-- // Конец ActiveForm -->
        <?php ActiveForm::end(); ?>
    </div>

</div>

<div class="sent">
    <div class="sent__close">&times;</div>
    <div class="sent__label">
        <h2 class="sent__title">Ваша анкета <br> успешно отправлена!</h2>
    </div>
</div>
</code>



EntryForm

// Модель валидации формы
<?php

namespace app\models;

use Yii;
use yii\base\Model;

class EntryForm extends Model
{
    public $fio;     // Полное имя
    public $city;    // Город
    public $phone;   // Номер телефона
    public $consent; // Согласие на обработку персональных данных
    public $reCaptcha; // reCAPTCHA

    public function rules()
    {
        return [
            // остальные правила для полей формы...

            ['reCaptcha', \himiklab\yii2\recaptcha\ReCaptchaValidator2::class, 'secret' => '6LdvXFAqAAAAALXXXXXXXXXXXX'], // Правило для проверки reCAPTCHA
        ];
    }

    public function attributeLabels()
    {
        return [
            'fio' => 'ФИО',
            'city' => 'Город (Населенный пункт)',
            'phone' => 'Номер телефона',
        ];
    }
}



Entry

// Модель для взаимодействия с базой данных
<?php 
namespace app\models;

use Yii;
use yii\db\ActiveRecord;   // паттерн проектирования  для взаимодействия с базой данных


// Модель для взаимодействия с базой данных(представляет таблицу entries в базе данных)

class Entry extends ActiveRecord
{
    public static function tableName()
    {
        return 'entries'; // Название таблицы в базе данных
    }

    public function rules()
    {
        return [
            [['fio', 'city', 'phone', 'consent',], 'required'],
            ['fio', 'string', 'max' => 25],
            ['city', 'string', 'max' => 42],
            ['phone', 'string', 'max' => 18],
            ['consent', 'boolean'],
            // ['g-recaptcha-response', 'boolean'],
        ];
    }
}



index.js

document.getElementById('sendcheck').addEventListener('submit', (e) => {
        e.preventDefault();

        // сбор данных формы
        const formData = new FormData(e.target);


        //получаем токен reСAPTCHA
        const recaptchaResponse = grecaptcha.getResponse();


        // Добавляем токен reCAPTCHA в formData
         formData.append('g-recaptcha-response', recaptchaResponse);

        // Проверяем, что токен reCAPTCHA не пустой
        if (!recaptchaResponse) {
            alert('Пожалуйста, подтвердите, что вы не робот.');
            return;
        }

        //ссылка на сервер
        const url = 'https://namedomen.ru/index.php?r=site/entry';

        // Отправка данных через fetch
        fetch(url, {
            method: 'POST',
            body: formData,
        })
            .then(response => response.json())
            .then(data => {

                if (data.success) {
                    // Показываем модальное окно, если success: true
                    document.querySelector('.sent').style.display = 'block';
                } else {
                    console.error('Ошибка отправки данных:', data.message);
                }

            })
            .catch(error => {
                console.error('Ошибка', error);
            })

    })



SiteController

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\web\Response;
use yii\filters\VerbFilter;
// use app\models\LoginForm;
// use app\models\ContactForm;
use app\models\EntryForm;                            // модель формы валидации данных пользователя
use app\models\Entry;                               // модель для работы с базой данных

class SiteController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::class,
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

    /**
     * Displays homepage.
     *
     * @return string
     */
    public function actionIndex()
    {
        $model = new EntryForm(); 
        return $this->render('index', ['model' => $model]); 
    }


    public function actionEntry()
    {
        $model = new EntryForm();

        // Код загружает данные формы, отправленные методом POST в модель и выполняет валидацию.
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {



            // Здесь получаем токен reCAPTCHA, который был отправлен с формой.
            $recaptchaResponse = Yii::$app->request->post('g-recaptcha-response');

            // проверка токена reCAPTCHA
            $secret = '6LdvXFAqAAAAALXXXXXXXXXXX';   // указать секретный ключ


            $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$recaptchaResponse}");   


            $responseKeys = json_decode($response, true);

            // Проверка успешности проверки reCAPTCHA
            if (intval($responseKeys["success"]) !== 1) {
                return $this->asJson(['success' => false, 'message' => 'Ошибка валидации reCAPTCHA.']);
            }

            // Создаем новую запись в таблице entries
            $entry = new Entry();
            $entry->fio = $model->fio;
            $entry->city = $model->city;
            $entry->phone = $model->phone;
            $entry->consent = $model->consent;


            if ($entry->save()) {
                // return $this->asJson(['success' => true, 'message' => 'Данные успешно сохранены.']);
                return $this->render('index', ['model' => $model]);
                // return $this->redirect(['site/entry']); // Перенаправление
            } else {
                // Yii::error($model->errors);
                return $this->asJson(['success' => false, 'message' => 'Ошибка при сохранении данных.']);
                // return $this->redirect(['site/entry']);
            }
        }

        return $this->render('entry', ['model' => $model]);
    }



web.php

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language' => 'ru-RU',   
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
               'reCaptcha' => [
                         'class' => 'himiklab\yii2\recaptcha\ReCaptcha',
                         'siteKey' => '6LdvXFAqAAAAAXXXXXXXX',      // Замените на ваш ключ сайта
                        'secret' => '6LdvXFAqAAAAAXXXXXXXXX',      // Замените на ваш секретный ключ
                ],
    ],
];



Это весь код , который нужен для полной картины(я надеюсь на это)
Буду рад если поможете мне понять ,в чем моя ошибка
  • Вопрос задан
  • 105 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
MLDevelop
@MLDevelop
Думаю проблема в самой зависимости - она давно не обновлялась и репозиторий находится в архиве (на скрине), а API Google ReCaptcha изменился. Стоит поискать другие пакеты для интеграции в форму ReCaptcha 671a18e0a6bd4695125598.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы