В блог

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

Начиная с версии 18.5.0 в 1С-Битрикс добавлена поддержка СМС-служб, для штатной авторизации, регистрации и восстановления пароля с помощью СМС.

Из коробки на данный момент поддерживаются следующие службы отправки SMS: Компания SMS.RU, SMS-ассистент, Компания Twilio.com.

Если вы используете одну из этих компаний, обновляйте 1С-Битрикс до необходимой версии, установите модуль Служба сообщений, укажите данные для подключения к СМС-сервису и в настройках Главного модуля у вас должно появиться следующее:

smsru.png

Добавление СМС-сервиса

Если вы хотите добавить собственный СМС-сервис, для начала необходимо создать класс СМС-сервиса, который будет наследовать класс 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(),
    ];
}

После этого в настройках Главного модуля должен появиться наш СМС-сервис

smsc.png

Пример

Примеры СМС-сервисов: 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;
}
Хочу проект
Закрыть