СМС-сервисы в 1С-Битрикс
Начиная с версии 18.5.0 в 1С-Битрикс добавлена поддержка СМС-служб, для штатной авторизации, регистрации и восстановления пароля с помощью СМС.
Из коробки на данный момент поддерживаются следующие службы отправки SMS: Компания SMS.RU, SMS-ассистент, Компания Twilio.com.
Если вы используете одну из этих компаний, обновляйте 1С-Битрикс до необходимой версии, установите модуль Служба сообщений, укажите данные для подключения к СМС-сервису и в настройках Главного модуля у вас должно появиться следующее:
Добавление СМС-сервиса
Если вы хотите добавить собственный СМС-сервис, для начала необходимо создать класс СМС-сервиса, который будет наследовать класс Bitrix\MessageService\Sender\Base
, с обязательными методами:
getShortName(): string
— Сокращенное наименование сервиса (например, домен)getId(): string
— Символьный код сервисаgetName(): string
— Полное наименование сервиса (будет выводиться во всех списках)canUse(): boolean
— Еслиfalse
– сервис не будет выводитьсяgetFromList(): array
— Список подтвержденных имен отправителяsendMessage(): Bitrix\MessageService\Sender\Result\SendMessage
— Отправка сообщения
Примерный код базового СМС-сервиса:
<?php namespace Ps\Sms\Provider; use Bitrix\Main\Error; use Bitrix\MessageService\Sender\Base; use Bitrix\MessageService\Sender\Result\SendMessage; class Smsc extends Base { private $login; private $password; private $client; public function __construct() { $this->login = 'login'; $this->password = 'my_strong_password'; $this->client = new SmscApi($this->login, $this->password); } public function sendMessage(array $messageFields) { if (!$this->canUse()) { $result = new SendMessage(); $result->addError(new Error('Ошибка отправки. СМС-сервис отключен')); return $result; } $parameters = [ 'phones' => $messageFields['MESSAGE_TO'], 'mes' => $messageFields['MESSAGE_BODY'], ]; if ($messageFields['MESSAGE_FROM']) { $parameters['sender'] = $messageFields['MESSAGE_FROM']; } $result = new SendMessage(); $response = $this->client->send($parameters); if (!$response->isSuccess()) { $result->addErrors($response->getErrors()); return $result; } return $result; } public function getShortName() { return 'smsc.ru'; } public function getId() { return 'smscru'; } public function getName() { return 'SMS-центр'; } public function canUse() { return true; } public function getFromList() { $data = $this->client->getSenderList(); if ($data->isSuccess()) { return $data->getData(); } return []; } }
После того, как мы создали класс, необходимо его зарегистрировать в обработчике события:
<?php $event = \Bitrix\Main\EventManager::getInstance(); $event->addEventHandler('messageservice', 'onGetSmsSenders', 'registerSmscService'); function registerSmscService() { return [ // Класс нашего СМС-сервиса new Smsc(), ]; }
После этого в настройках Главного модуля должен появиться наш СМС-сервис
Пример
Примеры СМС-сервисов: sms16.ru, smsc.ru и mainsms.ru на GitHub.
Присылайте пулл-реквесты с вашими СМС-сервисами – обязательно добавим :)
API
Отправка сообщения
Для того, чтобы отправить сообщение с СМС кодом подтверждения регистрации, выполним следующий код:
<?php $userId = 1; $phone = \Bitrix\Main\UserPhoneAuthTable::normalizePhoneNumber('+79999999999'); \Bitrix\Main\UserPhoneAuthTable::add([ 'USER_ID' => $userId, 'PHONE_NUMBER' => $phone, ]); list($code, $phoneNumber) = \CUser::GeneratePhoneCode($userId); $sms = new \Bitrix\Main\Sms\Event( 'SMS_USER_CONFIRM_NUMBER', // SMS_USER_RESTORE_PASSWORD - для восстановления [ 'USER_PHONE' => $phoneNumber, 'CODE' => $code, ] ); $sms->send(true);
Подтверждение номера телефона
Для того, чтобы проверить введенный код:
<?php $phoneRecord = \Bitrix\Main\UserPhoneAuthTable::getList([ 'filter' => [ '=USER_ID' => 1 ], 'select' => ['USER_ID', 'PHONE_NUMBER', 'USER.ID', 'USER.ACTIVE'], ])->fetchObject(); if(!$phoneRecord) { // Ошибка. Пользователь не найден } $smsCode = 1111; if(\CUser::VerifyPhoneCode($phoneRecord->getPhoneNumber(), $smsCode)) { if($phoneRecord->getUser()->getActive() && !$USER->IsAuthorized()) { $USER->Authorize($userId); } return true; }