Начиная с версии 18.5.0
в 1С-Битрикс добавлена поддержка штатной авторизации, регистрации и восстановления пароля с помощью СМС.
Из коробки на данный момент поддерживаются следующие сервисы: Компания SMS.RU, SMS-ассистент, Компания Twilio.com.
Если вы используете одну из этих компаний, обновите систему до необходимой версии, установите модуль Служба сообщений, укажите данные для подключения к СМС-сервису в настройках Главного модуля и у вас должно появиться следующее:
Добавление СМС-сервиса
Для добавления собственного СМС-сервиса, начала необходимо создать класс, который будет наследовать
Bitrix\MessageService\Sender\Base
, с обязательными методами:
Метод | Возвращаемое значение | Описание |
---|---|---|
getShortName() | string | Сокращённое наименование сервиса (например, домен) |
getId() | string | Символьный код сервиса |
getName() | string | Полное наименование сервиса (будет выводиться во всех списках) |
canUse() | boolean | Если false – сервис не будет выводиться |
getFromList() | array | Список подтверждённых имён отправителя |
sendMessage() | Bitrix\MessageService\Sender\Result\SendMessage |
Реализация отправки сообщения |
Примерный код для добавления собственного СМС-сервиса:
1<?php 2 3namespace Ps\Sms\Provider; 4 5use Bitrix\Main\Error; 6use Bitrix\MessageService\Sender\Base; 7use Bitrix\MessageService\Sender\Result\SendMessage; 8 9class MyService extends Base10{11 private $login;12 13 private $password;14 15 private $client;16 17 public function __construct() {18 $this->login = 'login';19 $this->password = 'my_strong_password';20 21 $this->client = new Api($this->login, $this->password);22 }23 24 public function sendMessage(array $messageFields) {25 if (!$this->canUse()) {26 $result = new SendMessage();27 $result->addError(new Error('Ошибка отправки. СМС-сервис отключён'));28 return $result;29 }30 31 $parameters = [32 'phones' => $messageFields['MESSAGE_TO'],33 'message' => $messageFields['MESSAGE_BODY'],34 ];35 36 if ($messageFields['MESSAGE_FROM']) {37 $parameters['sender'] = $messageFields['MESSAGE_FROM'];38 }39 40 $result = new SendMessage();41 $response = $this->client->send($parameters);42 43 if (!$response->isSuccess()) {44 $result->addErrors($response->getErrors());45 return $result;46 }47 48 return $result;49 }50 51 public function getShortName() {52 return 'smsc.ru';53 }54 55 public function getId() {56 return 'smscru';57 }58 59 public function getName() {60 return 'SMS-центр';61 }62 63 public function canUse() {64 return true;65 }66 67 public function getFromList() {68 $data = $this->client->getSenderList();69 if ($data->isSuccess()) {70 return $data->getData();71 }72 73 return [];74 }75}
Зарегистрируйте класс в качестве обработчика события:
1<?php 2 3$event = \Bitrix\Main\EventManager::getInstance(); 4$event->addEventHandler('messageservice', 'onGetSmsSenders', 'registerSmscService'); 5 6function registerSmscService() { 7 return [ 8 // Класс СМС-сервиса 9 new Ps\Sms\Provider\MyService(),10 ];11}
В настройках Главного модуля появится новый СМС-сервис:
API
Отправка сообщения
Отправка сообщения с СМС кодом подтверждения регистрации:
1<?php 2 3$userId = 1; 4$phone = \Bitrix\Main\UserPhoneAuthTable::normalizePhoneNumber('+79999999999'); 5 6\Bitrix\Main\UserPhoneAuthTable::add([ 7 'USER_ID' => $userId, 8 'PHONE_NUMBER' => $phone, 9]);10 11list($code, $phoneNumber) = \CUser::GeneratePhoneCode($userId);12 13$sms = new \Bitrix\Main\Sms\Event(14 'SMS_USER_CONFIRM_NUMBER', // SMS_USER_RESTORE_PASSWORD - для восстановления15 [16 'USER_PHONE' => $phoneNumber,17 'CODE' => $code,18 ]19);20$sms->send(true);
Подтверждение номера телефона
Подтверждение кода из СМС:
1<?php 2 3$phoneRecord = \Bitrix\Main\UserPhoneAuthTable::getList([ 4 'filter' => [ 5 '=USER_ID' => 1 6 ], 7 'select' => ['USER_ID', 'PHONE_NUMBER', 'USER.ID', 'USER.ACTIVE'], 8])->fetchObject(); 9 10if(!$phoneRecord) {11 // Ошибка. Пользователь не найден12}13 14$smsCode = 1111;15 16if(\CUser::VerifyPhoneCode($phoneRecord->getPhoneNumber(), $smsCode)) {17 if($phoneRecord->getUser()->getActive() && !$USER->IsAuthorized()) {18 $USER->Authorize($userId);19 }20 21 return true;22}
Пример
Пример подключения СМС-сервисов sms16.ru, smsc.ru, mainsms.ru и некоторых других выложен на GitHub.