Расширение правил Google reCAPTCHA

Доброго времени суток. Расширил схему правил антибота

// my_changes/schemas/security/antibot_rules.post.php

<?php

$schema['gift_certificates']['confirm'] = [
  'request_method' => 'POST',
  'verification_scenario' => 'confirm',
  'save_post_data' => [
    'gift_cert_data',
  ],
  'rewrite_controller_status' => [
    CONTROLLER_STATUS_DENIED,
  ],
];

return $schema;

Инициализировал хук и создал функцию.

// my_changes/init.php

<?php

if (!defined('BOOTSTRAP')) {
    die('Access denied');
}
fn_register_hooks(
    'settings_variants_image_verification_use_for'
);

// my_changes/func.php

function fn_my_changes_settings_variants_image_verification_use_for(&$objects)
{
    $objects['confirm'] = __('gift_certificate');
}

Включил настройку для данной страницы и добавил в шаблон image_verification.tpl

// views/gift_certificates/view.tpl

{capture name="gift_certificate"}

  {include file="common/image_verification.tpl" option="confirm" align="left" sidebox=true}

  <button id="gift_cert_confirm">test</button>

  <div id="gift_cert_envelope">
    {include file="addons/gift_certificates/components/envelope.tpl" gift_cert_data=$gift_cert_data}
  <!--gift_cert_envelope--></div>

  <script>
    (function(_, $) {
      document.addEventListener("DOMContentLoaded", function() {

        $("#gift_cert_confirm").on('click', function(event) {

          let token = "{$token}";
          // var recaptchaToken = $("input#recaptcha-token").val();

          console.log([
            token,
            recaptchaToken
          ]);

          $.ceAjax('request', '{fn_url('gift_certificates.confirm')}', {
            data: {
              token: token,
              // "g-recaptcha-response": recaptchaToken
            },
            result_ids: 'gift_cert_envelope',
            method: 'post'
          });
        });
      });
    }(Tygh, Tygh.$));
  </script>

{/capture}

{$smarty.capture.gift_certificate nofilter}

{capture name="mainbox_title"}{__("gift_certificate")}{/capture}
<?php

use Tygh\Registry;

if (!defined('BOOTSTRAP')) {
    die ('Access denied');
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    fn_trusted_vars('gift_cert_data');

    if ($mode == 'confirm') {
        $token = $_REQUEST['token'];
        $gift_cert_data = fn_my_changes_get_gift_certificate_info_by_token($token);

        fn_print_die($_REQUEST);

        if (defined('AJAX_REQUEST')) {
            Tygh::$app['view']->assign('gift_cert_data', $gift_cert_data);
            Tygh::$app['view']->display('addons/my_changes/views/gift_certificates/view.tpl');
        }
    }
}

Но при выполнении confirm запроса выдает ошибку “К сожалению, не удалось пройти антибот проверку. Попробуйте ещё раз.”

Как я понял в запросе должна присутствовать переменная “g-recaptcha-response” с токеном из iframe’a для валидации и сохранения результата валидации в сессии, но она отсутствует. Пожалуйста, подскажите в чем проблема?

Вопрос решен. Оказывается captcha не поддерживает кастомные запросы через ceAjax. Форма является обязательным атрибутом

1 лайк