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();
}
Готово!