reCAPTCHA в Opencart

Если у вас не работает reCAPTCHA в OpenCart - то возможна одна из распространенных причин. В первый раз, когда вы поставили галочку "Я не робот", Google одобряет ваш компьютер как разрешенный совершать определенные действия.
Но в OpenCart всё устроено немного иначе. Когда вы поставили галочку, ваш сайт получил положительный ответ от сервера Google, он сохраняет эту информацию в сессиях. А это значит, что пользователь, который получил "добро" один раз, может совершать любые действия неограниченное количество раз без повторной проверки, где требуется прохождение проверки капчи. Я это нахожу не очень хорошей защитой от СПАМа, потому делюсь с вами моим решением.
Для начала вам нужно открыть файл ваш_сайт/catalog/controller/extension/captcha/google.php, найти

if ($recaptcha['success']) {
	$this->session->data['gcapcha']	= true;
} else {
	return $this->language->get('error_captcha');
}

и заменить на

if (!$recaptcha['success']) {
	return $this->language->get('error_captcha');
}

То есть здесь мы убрали запись положительного результата в сессиях сервера, чтобы проверка на робота была каждый раз, когда пользователи оставляют отзывы или пишут в форме обратной связи.

Но здесь остаётся еще одна проблема. Если пользователь напишет для примера отзыв, но забудет выбрать оценку для отзыва и заранее поставит галочку "Я робот" - сайт выдаст ему соответствующую ошибку, но т.к отправка формы происходит методом ajax, галочка уже будет на каптче, но не будет одобрена, т.к мы выбрали не сохранять в сессиях, а проходить проверку каждый раз.
Чтобы это исправить, мы просто будем сбрасывать reCAPTCHA после каждого действия. Для этого вам нужно открыть ваш_сайт/catalog/view/theme/название_темы/template/product/product.twig, найти

if (json['error']) {
    $('#review').after('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '</div>');
}

и в конце добавить grecaptcha.reset().

Должно получится так:

if (json['error']) {
    $('#review').after('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '</div>');
    grecaptcha.reset();
}

Готово!

Комменарии

Написать комментарий

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Защита от роботов