Подключение к подсистеме Отправка SMS
При использовании предопределенных провайдеров
БСП поставляется с реализованными механизмами отправки через следующих провайдеров:
- SMS4B
- SMSRU
- SMSЦЕНТР
- Билайн
- МТС
- СМСУслуги
Для работы с этими провайдерами необходимо только настроить учетную запись в пользовательском режиме
Добавление собственного провайдера (на примере RocketSMS)
- Добавить провайдера в перечисление
ПровайдерыSMS
- Реализовать механизмы отправки/получения 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;
КонецФункции
#КонецОбласти
#КонецОбласти