---
title: Подключение к подсистеме Отправка SMS
slug: общие-бсп-подключение-к-подсистемам/подключение-к-подсистеме-отправка-sms
---

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

БСП поставляется с реализованными механизмами отправки через следующих провайдеров:
- SMS4B
- SMSRU
- SMSЦЕНТР
- Билайн
- МТС
- СМСУслуги

Для работы с этими провайдерами необходимо только настроить учетную запись в пользовательском режиме
![Изображение](/bsp-sms/1.png)

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

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

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

```bsl

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

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

```bsl
// Отправляет 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;

КонецФункции

#КонецОбласти

#КонецОбласти

```

