Closed tri-motor closed 1 year ago
Плагин на onBeforePOSTProcess типа такого (этот для v3, но это не важно):
<?php
function recaptcha(&$object,$params){
global $modx;
switch($object->event) {
case 'onBeforePOSTProcess':
$url = 'https://www.google.com/recaptcha/api/siteverify';
$token = isset($_POST['g-recaptcha-response']) ? $_POST['g-recaptcha-response'] : '';
$params = [
'secret' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR']
];
$out = false;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response, true);
$out = $response['success'];
if ($out && isset($response['score'])) {
$out = ($response['score'] > 0.5);
}
if (!$out) {
$object->form['error'] = 4;
$object->form['confirm'] = 0;
return true;
}
break;
}
}
?>
Для v2 в форме должен быть блок для чекбокса:
<div class="g-recaptcha" data-sitekey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"></div>
А для v3 в форме должно быть скрытое поле g-recaptcha-response.
Остальные скрипты капчи стандартные.
Всё же не очень понятно как трансформировать для v2. Допустим так (в завершающей части):
if ( $response['success'] == true ) {
// Но что здесь? Что скажет JotX отправлять коммент?
}
if ( $response['success'] == false ) {
// Это то, что скажет JotX не отправлять коммент? А что произойдет затем? Просто остаемся на месте?
$object->form['error'] = 4; $object->form['confirm'] = 0; return true;
}
Со вторым понял правильно ? :
$object->form['error'] = 4 будет выражаться в XXX.config.php в виде [+form.error:select=&4=Ваше сообщение было отклонено
+] ?
А $object->form['confirm'] = 0 не даст отправить/запостить коммент?
Но с первым, если $response['success'] == true, непонятно. Непонятно, что должно быть в
if ( $response['success'] == true ) {
// Но что здесь?
}
С первым ничего не надо делать, форма будет отправляться как обычно. v2 от v3 только этим отличается:
if ($out && isset($response['score'])) {
$out = ($response['score'] > 0.5);
}
В общем, для reCAPTCHA v2 вот такое сработало.
Содержимое файла recaptchav2.inc.php в assets/snippets/jot/plugins:
<?php
function recaptchav2(&$object,$params){
global $modx;
switch($object->event) {
case 'onBeforePOSTProcess':
$url = 'https://www.google.com/recaptcha/api/siteverify';
$token = isset($_POST['g-recaptcha-response']) ? $_POST['g-recaptcha-response'] : '';
$params = [ 'secret' => 'Secret_key', 'response' => $token, 'remoteip' => $_SERVER['REMOTE_ADDR'] ];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response, true);
if ( $response['success'] == false ) {
$object->form['error'] = 4;
$object->form['confirm'] = 0;
return true;
}
break;
}
}
?>
В вызове JotX плагин recaptchav2 в &onBeforePOSTProcess
CMS: EVO 1.4.15 PHP: 7.3.33 JotX: 1.1
Здравствуйте,
Как подружить JotX и reCAPTCHA v2 Checkbox?