-
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";
}