Skip to content

Подключение к подсистеме Отправка SMS

При использовании предопределенных провайдеров

БСП поставляется с реализованными механизмами отправки через следующих провайдеров:

  • SMS4B
  • SMSRU
  • SMSЦЕНТР
  • Билайн
  • МТС
  • СМСУслуги

Для работы с этими провайдерами необходимо только настроить учетную запись в пользовательском режиме Изображение

Добавление собственного провайдера (на примере RocketSMS)

  1. Добавить провайдера в перечисление ПровайдерыSMS
  2. Реализовать механизмы отправки/получения SMS в общих модулях для нового провайдера (см. документацию провайдера, там HTTP-сервисы по сути):

Общий модуль ОтправкаSMSКлиентПереопределяемый:

// Определяет адрес страницы провайдера в сети Интернет.
//
// Параметры:
// Провайдер - ПеречислениеСсылка.ПровайдерыSMS - поставщик услуги по отправке SMS.
// АдресВИнтернете - Строка - адрес страницы провайдера в Интернете.
//
Процедура ПриПолученииАдресаПровайдераВИнтернете(Провайдер, АдресВИнтернете) Экспорт
Если Провайдер = ПредопределенноеЗначение("Перечисление.ПровайдерыSMS.RocketSMS") Тогда
АдресВИнтернете = "https://rocketsms.by/";
КонецЕсли;
КонецПроцедуры

Общий модуль ОтправкаSMSПереопределяемый

// Отправляет SMS через настроенного поставщика услуги.
//
// Параметры:
// ПараметрыОтправки - Структура:
// * Провайдер - ПеречислениеСсылка.ПровайдерыSMS - поставщик услуги по отправке SMS.
// * НомераПолучателей - Массив - массив строк номеров получателей в формате +7ХХХХХХХХХХ;
// * Текст - Строка - текст сообщения, максимальная длина у операторов может быть разной;
// * ИмяОтправителя - Строка - имя отправителя, которое будет отображаться вместо номера у получателей;
// * Логин - Строка - логин для доступа к услуге отправки SMS;
// * Пароль - Строка - пароль для доступа к услуге отправки SMS.
//
// Результат - Структура - возвращаемое значение. Результат отправки:
// * ОтправленныеСообщения - Массив из Структура:
// ** НомерПолучателя - Строка - номер получателя из массива НомераПолучателей;
// ** ИдентификаторСообщения - Строка - идентификатор SMS, по которому можно запросить статус отправки.
// ОписаниеОшибки - Строка - пользовательское представление ошибки, если пустая строка, то ошибки нет.
//
Процедура ОтправитьSMS(ПараметрыОтправки, Результат) Экспорт
Если ПараметрыОтправки.Провайдер = Перечисления.ПровайдерыSMS.RocketSMS Тогда
ОтправитьSMS_RocketSMS(ПараметрыОтправки, Результат);
КонецЕсли;
КонецПроцедуры
// Запрашивает статус доставки SMS у поставщика услуг.
//
// Параметры:
// ИдентификаторСообщения - Строка - идентификатор, присвоенный SMS при отправке.
// Провайдер - ПеречислениеСсылка.ПровайдерыSMS - провайдер услуги отправки SMS.
// Логин - Строка - логин для доступа к услуге отправки SMS.
// Пароль - Строка - пароль для доступа к услуге отправки SMS.
// Результат - см. ОтправкаSMS.СтатусДоставки.
//
Процедура СтатусДоставки(ИдентификаторСообщения, Провайдер, Логин, Пароль, Результат) Экспорт
Если Провайдер = Перечисления.ПровайдерыSMS.RocketSMS Тогда
СтатусДоставки_RocketSMS(ИдентификаторСообщения, Провайдер, Логин, Пароль, Результат);
КонецЕсли;
КонецПроцедуры
// Проверяет правильность сохраненных настроек отправки SMS.
//
// Параметры:
// НастройкиОтправкиSMS - Структура - описание текущих настроек отправки SMS:
// * Провайдер - ПеречислениеСсылка.ПровайдерыSMS
// * Логин - Строка
// * Пароль - Строка
// * ИмяОтправителя - Строка
// Отказ - Булево - установить этот параметр в Истина, если настройки не заполнены или заполнены неверно.
//
Процедура ПриПроверкеНастроекОтправкиSMS(НастройкиОтправкиSMS, Отказ) Экспорт
Если НастройкиОтправкиSMS.Провайдер = Перечисления.ПровайдерыSMS.RocketSMS Тогда
Отказ = ПустаяСтрока(НастройкиОтправкиSMS.Логин) ИЛИ ПустаяСтрока(НастройкиОтправкиSMS.Пароль);
КонецЕсли;
КонецПроцедуры
/// ПРИМЕР РЕАЛИЗАЦИИ ДЛЯ КОНКРЕТНОГО ПРОВАЙДЕРА
#Область СлужебныеПроцедурыИФункции
#Область ОтправкаSMS_RocketSMS
Процедура ОтправитьSMS_RocketSMS(ПараметрыОтправки, Результат)
ОписаниеОшибки = "";
ОтправленныеСообщения = Новый Массив;
ШаблонАндресаРесурса = RocketSMS_ШаблонАндресаРесурса("send", ПараметрыОтправки.Логин, ПараметрыОтправки.Пароль) + "&phone=%1&text=%2";
Для Каждого НомерПолучателя Из ПараметрыОтправки.НомераПолучателей Цикл
НомерПолучателя_ТолькоЦифры = RocketSMS_ОставитьТолькоЦифрыВСтроке(НомерПолучателя);
АндресРесурса = СтрШаблон(ШаблонАндресаРесурса, НомерПолучателя_ТолькоЦифры, ПараметрыОтправки.Текст);
HTTPЗапрос = Новый HTTPЗапрос(АндресРесурса);
РезультатЗапроса = RocketSMS_ВыполнитьЗапрос(HTTPЗапрос);
Если НЕ РезультатЗапроса.ЗапросВыполнен тогда
ОписаниеОшибки = РезультатЗапроса.ТекстСообщения;
Прервать;
КонецЕсли;
ОтправленноеСообщение = Новый Структура();
ОтправленноеСообщение.Вставить("НомерПолучателя", НомерПолучателя);
ОтправленноеСообщение.Вставить("ИдентификаторСообщения", Формат(РезультатЗапроса.ОбъектJSON.id, "ЧГ="));
ОтправленныеСообщения.Добавить(ОтправленноеСообщение);
КонецЦикла;
Результат = Новый Структура;
Результат.Вставить("ОтправленныеСообщения", ОтправленныеСообщения);
Результат.Вставить("ОписаниеОшибки", ОписаниеОшибки);
КонецПроцедуры
Процедура СтатусДоставки_RocketSMS(ИдентификаторСообщения, Провайдер, Логин, Пароль, Результат)
ШаблонАндресаРесурса = RocketSMS_ШаблонАндресаРесурса("status", Логин, Пароль) + "&id=%1";
АндресРесурса = СтрШаблон(ШаблонАндресаРесурса, ИдентификаторСообщения);
HTTPЗапрос = Новый HTTPЗапрос(АндресРесурса);
РезультатЗапроса = RocketSMS_ВыполнитьЗапрос(HTTPЗапрос);
Если НЕ РезультатЗапроса.ЗапросВыполнен тогда
Возврат;
КонецЕсли;
СоответствиеСтатусовSMS = Новый Соответствие;
СоответствиеСтатусовSMS.Вставить("QUEUED", "Отправляется");
СоответствиеСтатусовSMS.Вставить("SENT", "Отправлено");
СоответствиеСтатусовSMS.Вставить("DELIVERED", "Доставлено");
СоответствиеСтатусовSMS.Вставить("FAILED", "Ошибка");
Результат = СоответствиеСтатусовSMS.Получить(РезультатЗапроса.ОбъектJSON.status);
КонецПроцедуры
Функция RocketSMS_ВыполнитьЗапрос(HTTPЗапрос, HTTPМетод = "POST")
Результат = Новый Структура("ЗапросВыполнен, ТекстСообщения, ОбъектJSON", Ложь, "", Неопределено);
HTTPСоединение = Новый HTTPСоединение("api.rocketsms.by", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод(HTTPМетод, HTTPЗапрос);
Если HTTPОтвет.КодСостояния <> 200 тогда
Результат.ТекстСообщения = "Ошибка при выполнении запроса. Код состояния = " + HTTPОтвет.КодСостояния;
Возврат Результат;
КонецЕсли;
ОтветСтрока = HTTPОтвет.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСтрока);
ОбъектJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Если ОбъектJSON.Свойство("error") тогда
Результат.ТекстСообщения = ОбъектJSON.error;
Возврат Результат;
КонецЕсли;
Результат.ЗапросВыполнен = Истина;
Результат.ОбъектJSON = ОбъектJSON;
Возврат Результат;
КонецФункции
Функция RocketSMS_ОставитьТолькоЦифрыВСтроке(Знач ИсходнаяСтрока)
ИсходнаяСтрока = СокрЛП(ИсходнаяСтрока);
Результат = ИсходнаяСтрока;
Для Счетчик = 1 по СтрДлина(ИсходнаяСтрока) Цикл
ТекущийСимвол = Сред(ИсходнаяСтрока, Счетчик, 1);
Если Найти("0123456789" , ТекущийСимвол) = 0 Тогда
Результат = СтрЗаменить(Результат, ТекущийСимвол, "");
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция RocketSMS_ШаблонАндресаРесурса(ИмяФункции, Логин, Пароль)
ШаблонАндресаРесурса = "/simple/%1?username=%2&password=%3";
ШаблонАндресаРесурса = СтрШаблон(ШаблонАндресаРесурса, ИмяФункции, Логин, RocketSMS_Пароль_МД5(Пароль));
Возврат ШаблонАндресаРесурса;
КонецФункции
Функция RocketSMS_Пароль_МД5(Пароль)
ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
ХешированиеДанных.Добавить(Пароль);
Пароль_МД5 = СтрЗаменить("" + ХешированиеДанных.ХешСумма, " ", "");
Возврат Пароль_МД5;
КонецФункции
#КонецОбласти
#КонецОбласти