Temus / JotX

Jot + Events + Configs + Actions + Plugins
18 stars 16 forks source link

JotX + reCAPTCHA v2 #13

Closed tri-motor closed 1 year ago

tri-motor commented 1 year ago

Здравствуйте,

Как подружить JotX и reCAPTCHA v2 Checkbox?

Temus commented 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.

Остальные скрипты капчи стандартные.

tri-motor commented 1 year ago

Всё же не очень понятно как трансформировать для v2. Допустим так (в завершающей части):

if ( $response['success'] == true ) {
    // Но что здесь? Что скажет JotX отправлять коммент?
}

if ( $response['success'] == false ) {
    // Это то, что скажет JotX не отправлять коммент? А что произойдет затем? Просто остаемся на месте?
    $object->form['error'] = 4; $object->form['confirm'] = 0; return true;
}
tri-motor commented 1 year ago

Со вторым понял правильно ? :

$object->form['error'] = 4 будет выражаться в XXX.config.php в виде [+form.error:select=&4=Ваше сообщение было отклонено+] ?

А $object->form['confirm'] = 0 не даст отправить/запостить коммент?

tri-motor commented 1 year ago

Но с первым, если $response['success'] == true, непонятно. Непонятно, что должно быть в

if ( $response['success'] == true ) {
    // Но что здесь?
}
Temus commented 1 year ago

С первым ничего не надо делать, форма будет отправляться как обычно. v2 от v3 только этим отличается:

if ($out && isset($response['score'])) {
    $out =  ($response['score'] > 0.5);
}
tri-motor commented 1 year ago

В общем, для 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