СМС-сервисы в 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;
}
