Добавляем Yandex Captcha в старое ASPRO

  • Vadim Tsukanov
    Разработчик
  • Дата публикации
    25.11.2025
  • Категория
    1С-Битрикс
Задача:

Итак, гугл — нельзя, ставим Яндекс капчу. Новый Аспро уже все это поддерживает, а вот что делает, если АСПРО старое, а пользоваться хочется?

Тут все просто:

Регистрируем и получаем все ключи в Яндексе.

Потом идем по пути /public_html/local/templates/local_aspro_max/components/bitrix/form.result.new/popup/template.php

В форму вставляем

<div id="captcha-container"></div>

Ниже в этом же файле в js добавляем:

	const form = $('form[name="<?=$arResult["arForm"]["VARNAME"]?>"]');
		
		jQuery.ajax({
			url: 'https://smartcaptcha.yandexcloud.net/captcha.js?render=onload&onload=onloadFunction',
			dataType: 'script',
			async: true,
			success: onloadFunction
		});


		function onloadFunction() {
		  if (!window.smartCaptcha) {
		    return;
		  }

		  window.smartCaptcha.render('captcha-container', {
		    sitekey: 'ключ',
		    invisible: true, // Сделать капчу невидимой
			shieldPosition: 'bottom-right',
		  });
		  window.smartCaptcha.execute();

		}

И дописываем метод validate форм

		$('form[name="<?=$arResult["arForm"]["VARNAME"]?>"]').validate({
			highlight: function( element ){
				$(element).parent().addClass('error');
			},
			unhighlight: function( element ){
				$(element).parent().removeClass('error');
			},
			submitHandler: function( form ){
				//проверим капчу и потом добавим остальное

				$.ajax({
				  type: 'POST',
				  url: "/local/API/checkYandexCaptcha.php",
				  dataType: 'json',
				  data:  {
					  token: $('[name=smart-token]').val(),
				  },
				  success: function (response) {
					  if(response.status == 'success'){
						  if( $('form[name="<?=$arResult["arForm"]["VARNAME"]?>"]').valid() ){
		  					setTimeout(function() {
		  						$(form).find('button[type="submit"]').attr("disabled", "disabled");
		  					}, 500);
		  					var eventdata = {type: 'form_submit', form: form, form_name: '<?=$arResult["arForm"]["VARNAME"]?>'};
		  					BX.onCustomEvent('onSubmitForm', [eventdata]);
		  				}
					}else{
						$('.form_footer').html(response.message);
					}
				  }
			  })



			},
			errorPlacement: function( error, element ){
				error.insertBefore(element);
			},
			messages:{
		      licenses_popup: {
		        required : BX.message('JS_REQUIRED_LICENSES')
		      }
			}
		});

Тут четко видим отправку ajax на проверку капчи. содержимое файла:

<?php
require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/prolog_before.php");

$token = $_POST['token']; //Например, $_POST['smart-token'];
if (checkYandexCaptcha($token)) {
    $result = array(
        'status' => 'success'
    );
} else {
    $result = array(
        'status' => 'error',
        'message' => 'Наша система определила Вас, как спам. Попробуйте позже!'
    );
}

echo json_encode($result);

 

Сам метод имеет вид:

define('SMARTCAPTCHA_SERVER_KEY', 'ключ');

function checkYandexCaptcha($token) {
    $ch = curl_init("https://smartcaptcha.yandexcloud.net/validate");
    $args = [
        "secret" => SMARTCAPTCHA_SERVER_KEY,
        "token" => $token,
    ];
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($args));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpcode !== 200) {
        echo "Allow access due to an error: code=$httpcode; message=$server_output\n";
        return true;
    }

    $resp = json_decode($server_output);
    return $resp->status === "ok";
}

 

Еще нет коммментариев. Будь первым!