СМС-сервисы в 1С-Битрикс

1С-Битрикс
СМС-сервисы в 1С-Битрикс

Начиная с версии 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 Base
10{
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.