Сразу скажу, что для отправки смс подтверждения с кодом понадобится какой либо платный сервис. В этом примере использую sms.ru. Может подойти любой дрогой, поддерживаемый штатно Битриксом
Общие настройки в Bitrix и подключение шлюза sms
1. Первым делом Вам необходимо подключить в Битрикс сервис смс оповещений. Сделать это можно на странице настроек модуля "Служба сообщений". В нашем случае мы настраиваем sms.ru
После всех настроек проведите тестирование и убедитесь, что смс приходит. В личном кабинете самого сервиса не забудьте пополнить баланс и провести все настройки
2. В настройках авторизации главного модуля поставить галочки "Регистрировать пользователей по номеру телефона:" и "Номер телефона является обязательным:"
Доработки шаблона компонента авторизации system.auth.authorize
1. В файле result_modifier.php
пишем код:
if(!empty($phoneNumber) || !empty($signedData))
{
// только указываешь свой шаблон (создаешь сначала в админке)
$smsTemplate = 'SMS_USER_CONFIRM_NUMBER';
$result = \CUser::SendPhoneCode($phoneNumber, $smsTemplate, SITE_ID);
if($result->isSuccess()) {
$arResult['SIGNED_DATA'] = \Bitrix\Main\Controller\PhoneAuth::signData([
'phoneNumber' => $phoneNumber,
'smsTemplate' => $smsTemplate
]);
$arResult["SHOW_SMS_FIELD"] = true;
}
else {
$arResult['ERROR_MESSAGE'] = $result->getErrorMessages();
}
if(!empty($signedData)) {
$arResult["SIGNED_DATA"] = $signedData;
$arResult["SHOW_SMS_FIELD"] = true;
}
// verify phone code
$isNeedVerifySmsCode = $_SERVER["REQUEST_METHOD"] == "POST" && $_REQUEST["code_submit_button"] <> '' && !$USER->IsAuthorized() && !empty($signedData);
if($isNeedVerifySmsCode)
{
$smsCode = $_REQUEST['SMS_CODE'];
if(($params = \Bitrix\Main\Controller\PhoneAuth::extractData($signedData)) !== false)
{
if(($userId = CUser::VerifyPhoneCode($params['phoneNumber'], $smsCode)))
{
$USER->Authorize($userId);
LocalRedirect('/personal/');
}
else
{
$arResult['ERROR_MESSAGE'] = 'Неверный код из смс. Попробуйте еще'; // здесь сам ошибку придумай
$arResult["SHOW_SMS_FIELD"] = true;
$arResult["SMS_CODE"] = $smsCode;
$arResult["SIGNED_DATA"] = $signedData;
}
}
}
}
Шаблон , который указывается в переменной $smsTemplate
создается в Bitrix (Почтовые и СМС события -> Шаблоны СМС)
2. Код в template.php
В самом начале подключаем библиотеку CJSCore::Init('phone_auth');
Далее код самой формы
<?if(!isset($arResult["SHOW_SMS_FIELD"]) || $arResult["SHOW_SMS_FIELD"] !== true):?>
<form action="" method="post">
<div class="form__labelt">Мы вышлем вам одноразовый код для входа в смс</div>
<div class="form__input">
<div class="form__labela">Телефон:</div>
<input type="tel" name="PHONE_NUMBER" class="input js-phone-mask" placeholder="+7(999)999-99-99">
</div>
<div class="form__submit">
<button class="btn btn--normal btn--wall">Войти</button>
</div>
</form>
<?endif;?>
Проверяем наличие ошибок и выводим их
<?if(is_array($arResult["ERROR_MESSAGE"]) && count($arResult["ERROR_MESSAGE"]) > 0):?>
<div>
<?foreach($arResult["ERROR_MESSAGE"] as $error):?>
<div><?=$error?></div>
<?endforeach?>
</div>
<?elseif($arResult["ERROR_MESSAGE"] != ''):?>
<div><?=$arResult["ERROR_MESSAGE"]?></div>
<?endif?>
Поле для ввода кода из смс
<if($arResult["SHOW_SMS_FIELD"] == true):?>
<form method="post" action="<=$arResult["AUTH_URL"]?>" name="regform">
<input type="hidden" name="SIGNED_DATA" value="<=htmlspecialcharsbx($arResult["SIGNED_DATA"])?>" />
<div class="bx-authform-formgroup-container">
<div class="bx-authform-label-container">*</span>Введите код из смс</div>
<div class="form__input">
<div class="form__labela">Код из смс:</div>
<input class="input" type="text" name="SMS_CODE" maxlength="255" value="<=htmlspecialcharsbx($arResult["SMS_CODE"])?>" autocomplete="off" />
</div>
</div>
<div class="bx-authform-formgroup-container">
<input type="submit" class="btn btn-primary" name="code_submit_button" value="Отправить код" />
</div>
</form>
<div id="bx_auth_error" style="display:none" class="alert alert-danger"></div>
<div id="bx_auth_resend"></div>
<script>
new BX.PhoneAuth({
containerId: 'bx_auth_resend',
errorContainerId: 'bx_auth_error',
interval: <=$arResult["PHONE_CODE_RESEND_INTERVAL"]?>,
data:
<=CUtil::PhpToJSObject([
'signedData' => $arResult["SIGNED_DATA"],
])?>,
onError:
function(response)
{
console.log(response);
var errorNode = BX('bx_auth_error');
errorNode.innerHTML = '';
for(var i = 0; i < response.errors.length; i++)
{
errorNode.innerHTML = errorNode.innerHTML + BX.util.htmlspecialchars(response.errors[i].message) + '
';
}
errorNode.style.display = '';
}
});
</script>
<endif;?>