if(\Bitrix\Main\Loader::includeModule('bxmaker.authuserphone'))
{
$oManager = \BXmaker\AuthUserPhone\Manager::getInstance();
//операции ...
$phone = $oManager->getPreparedPhone('8 999-111-22-33');
echo $phone; // 79991112233
}
Многие методы возращают объект класса результата - \BXmaker\AuthUserPhone\Result
.
Резльтат всегда либо успешный либо не успешный, когда содержит одну или более ошибок.
Пример инициализации объекта класса с результатом
$result = new \BXmaker\AuthUserPhone\Result();
Передаем основной результат
$result->setResult(10);
echo $result->getResult(); // 10
Передаем дополнитльные данные
$result->setMore('MSG', 'Смс отправлено');
echo $result->getMore('MSG'); //Смс отправлено
Проверяем успешный ли результат
if($result->isSuccess())
{
echo (string) $result->getResult();
}
В процессе выполнения операций может вернуться ошибка. Она всегда обернута в объект класса резлуьтата.
Ошибка представляет из себя объект класса \BXmaker\Authuserphone\Error
$result = new \BXmaker\AuthUserPhone\Result();
$result->createError(
'Телефон не валидный',
'ERROR_PHONE_INVALID',
);
Когда необходимо передать больше данных весте с ошибкой
$result->createError(
'Введите код с картинки',
'ERROR_NEED_CAPTCHA',
[
'captcha' => \BXmaker\AuthUserPhone\Manager::getInstance()->captcha()->getForJs()
]
);
Чтобы получить данные по ошибке
echo $result->getFirstError()->getCode(); // ERROR_NEED_CAPTCHA
echo $result->getFirstError()->getMessage(); // Введите код с картинки
var_export($result->getFirstError()->getMore()); // ['captcha' => [...]]
Если нужно создать ошибку из исключения, то делаем следующее
$ex = new \Exception('Error');
$result->createErrorFromException($ex);
echo $result->getFirstError()->getMessage(); // Error
Когда нужно выбросить исключение при наличии ошибки
if(!$result->isSuccess())
{
$result->throwException();
// throw new \BXmaker\AuthUserPhone\Exception\BaseException()
}
Для использвоания номера телефона, его необходимо привести к виду пригодному для повсеместного использования
$phone = $oManager->getPreparedPhone('+7 (999 111 22-33');
echo $phone; // 79991112233
Телефон долже передаваться на проверку уже подготовленный
if($oManager->isValidPhone($phone))
{
echo 'Номер телефона введен верно';
}
Для отправки пременного кода в смс, кода в номере телефона робота и использования прочих враинтов для проверки номера телефона, необходимо использовать соответствующие методы класса Service.
$result = $oManager->service()->startSmsCode($phone);
if (!$result->isSuccess()) {
$result->throwException();
}
else
{
$answer = [
'TIMEOUT' => $result->getMore('TIMEOUT'),
'LENGTH' => $result->getMore('LENGTH'),
'MSG' => $result->getMore('MSG'),
];
}
Ниже приведен пример проверки временного кода отпреленного по смс. Для проверки других типов подтверждений используйте соответствующие методы класса.
$result = $oManager->service()->checkSmsCode($phone, $code);
if (!$result->isSuccess()) {
$result->throwException();
}
else
{
echo 'Указан валидный код';
}
Рассмотрим вариант проверки лимитов на запрос подтвреждений, напрмиер лимит на отправку кодов в смс.
Для проверки достижения лимитов необходимо передать тип подтверждения и номер телефона (для проверки лимтов по номеру).
// Подготовка ---
//ограничение по ip
$oManager
->limitIP()
->setType(\BXmaker\AuthUserPhone\Manager::CONFIRM_TYPE_SMS_CODE);
//ограничение по номеру телеофна
$oManager
->limit()
->setType(\BXmaker\AuthUserPhone\Manager::CONFIRM_TYPE_SMS_CODE)
->setPhone($phone);
В случае если на момент проверки лимит превышен и требуется вести код с картинки, то будет выброшено исключение \BXmaker\AuthUserPhone\Exception\NeedCaptchaException
содержащее данные для вывода капчи и текст ошибки.
Если при достижении лимита и необходимости ввода символов с картинки, вместе с запросо на сервер пришли эти данные и они валидны, то исключение не будет выброшено и выполнение подет дальше.
// !! подготовка выше
//ограничение по ip
$oManager->limitIP()->checkCanDoRequest();
//ограничение по номеру телеофна
$oManager->limit()->checkCanDoRequest();
Для фиксировани попытки запроса подтверждения и учета лимитов, необходимо выполнить следующий код
// !! подготовка выше
// ограничение по ip адресу
$oManager->limitIP()->setRequest();
//ограничение по номеру
$oManager->limit()->setRequest();
Для фиксировани попытки проверки подтверждения, напрмиер кода из смс и учета лимитов, необходимо выполнить следующий код
// !! подготовка выше
// по ip адресу
$oManager->limitIP()->setCheck();
//для лимитов с привязкой к номеру
$oManager->limit()->setCheck();
В модуле есть возможность задать интервалы между попытками начала подтверждения, например между получением временного кода, звонка робота, получения номера телефона для звонк аот пользователя.
Для получения текущих таймайтов использует следующие методы
$time = $oManager->getSmsCodeTimeout($phone);
$time = $oManager->getUserCallTimeout($phone);
$time = $oManager->getBotCallTimeout($phone);
Есть отдельный метол, который проверит таймаут и в случае если время не закончилось выбросит соответствующее исключение
$oManager->checkSmsCodeTimeout($phone);
$oManager->checkUserCallTimeout($phone);
$oManager->checkBotCallTimeout($phone);
Аналогичные методы есть для логина, email адреса. Позволяет найти пользвотеля по номеру телефона с проверкой пароля. Если данные указаны верно, то в объекте результатаа вернется идентфикиатор пользователя.
$phone = '79991112233';
$password = 'JIO^fne64V+3';
$userIdResult = $oManager->findUserIdByPhonePassword($phone, $password);
if ($userIdResult->isSuccess()) {
$userId = (int)$userIdResult->getResult();
}
Авторизацию необходимо выполнять после всех проверок, так как метод из примера ничего не проверяет а только авторизует и выполняет дополнитльеные некоторые операции необходимые для рабоыт модуля.
$userId = 10;
$resultAuth = $oManager->authorize($userId);
if (!$resultAuth->isSuccess()) {
// можно например выбросить исключение, чтобы не выполнять код далее
$resultAuth->throwException();
}
При регистрации необходимо передать номер телефона и при необходимости доп поля описывающие пользователя. Если регистрация прошла успешно, можно получить идентфииктаор пользователя и можно переходить к авторизации.
$phone = '79991112233';
$arUserFields = [];
$registerResult = $oManager->register($phone, $arUserFields);
if (!$registerResult->isSuccess()) {
$registerResult->throwException();
}
$userId = (int)$registerResult->getResult();
Все доступные настройки модуля описаны как методы в соответствующем классе.
Больше можно узнать на странице описания класса - \BXmaker\AuthUserPhone\Param
$oManager->param()->isEnabledAutoRegister();
Если сайт не врено определился или нужно использовать настройки другого сайта в процессе работы модуля, то можно переключить сайт. Специально устанавливать идентфикатор сайта не нужно, этот метод на исключительный случай.
$oManager->setSiteId('s2');
// автоопределение
$oManager->setSiteId();
Прпедположим что натсроено подключение к сервису, и нужно через него отправить произвольное смс. Для этого нужно объект класса сервиса проинициализировать и вызвать метод отправки смс.
$serviceId= 1;
\BXmaker\AuthUserPhone\manager::getInstance()->service()->getObjectById($serviceId)->sendSms('79991112233', 'text sms');