Отправляем СМС через сервис SMS.RU

Постановка задачи


В библиотеке стандартных подсистем (БСП), которая разрабатывается фирмой 1С с целью облегчить жизнь разработчикам, имеется подсистема Отправка SMS. Данная подсистема содержит ряд процедур и функций, с помощью которых можно выполнять отправку коротких сообщений (СМС) посредством операторов МТС и Билайн. Так как ценовая политика этих операторов не устраивала, решено было выполнять отправку СМС через сервис SMS.RU.

Задача: добавить в подсистему Отправка SMS сервис SMS.RU.

Анализ работы сервиса


Отправить СМС через этот сервис можно двумя способами:
  1. HTTP-запросом
  2. Через секретный почтовый ящик
Будем использовать первый вариант, описание API функции находится тут. Функция поддерживает как GET так и POST-запрос. Так как GET-запрос отправляет информацию как часть URL, то это может повлиять на безопасность и конфиденциальность отправляемой информации, ведь мы будем передавать номера телефонов и текст сообщения, поэтому перестрахуемся и будем использовать POST-запрос.
Что бы выполнить отправку сообщений, нужно авторизоваться. Авторизация выполняется тремя способами:
  1. По уникальному ключу
  2. По логину и паролю
  3. По логину, временному токену и хэш-суммы(пароль+токен)
Из соображений безопасности будем использовать третий метод авторизации, мы не ищем легких путей, только усиленная авторизация, только БЕЗОПАСНОСТЬ!!!

Реализация работы с сервисом SMS.RU


Для этого создадим общий модуль ОтправкаСМСЧерезSMSRU и реализуем поставленную задачу, ах да, контекст выполнения модуля на сервере.

1) Функция получения временного токена, нужна для усиленной авторизации.


// Получение временного ключа, с помощью которого в дальнейшем шифруется пароль (GET).
//
Функция ПолучитьТокенСМС_РУ()

// Выполним GET-запрос.
Попытка
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("txt");
Соединение = Новый HTTPСоединение("sms.ru");
Соединение.Получить("/auth/get_token", ИмяФайлаРезультата);
ТекстовыйФайл = Новый ЧтениеТекста(ИмяФайлаРезультата);
Ключ = ТекстовыйФайл.ПрочитатьСтроку();
ТекстовыйФайл.Закрыть();
Исключение
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;

// Удалим результирующий файл.
Попытка
УдалитьФайлы(ИмяФайлаРезультата);
Исключение
КонецПопытки;

Если Ключ = Неопределено Тогда
ВызватьИсключение "Ошибка получения ключа, запрос вернул пустой ответ.";
КонецЕсли;

Возврат СокрЛП(Ключ);

КонецФункции // ПолучитьТокенСМС_РУ()


Выполняется GET запрос по адресу /auth/get_token, в ответ получаем временный токен, который считываем из файла. Разработчики платформы 1С не настаивают удалять временные файлы, но все же рекомендуют, поэтому во всех функциях и процедурах удаляем за собой временные файлы.

2) Функция вычисления хэш-суммы от пароль + токен.


Вычисление хэш-суммы я уже рассматривал, так что вот вам ссылка SHA_512(логин+токент).

3) Получение результата вызова функции сервиса отправки СМС.


// Получение ответа после попытки отправки сообщения.
//
// Параметры:
// ПолноеИмяФайла - строка, полное имя файлв, в котором содержится ответ.
//
Функция ПолучитьОтветОтправки(ПолноеИмяФайла)

Ответ = Новый Структура("Код, IDСообщений", "", Новый Массив);

ТекстовыйФайл = Новый ЧтениеТекста(ПолноеИмяФайла);
Ответ.Код = ТекстовыйФайл.ПрочитатьСтроку();
Ответ.Код = ?(Ответ.Код = Неопределено, "", СокрЛП(Ответ.Код));
Если Ответ.Код = "100" Тогда
IDСообщения = ТекстовыйФайл.ПрочитатьСтроку();
Пока IDСообщения <> Неопределено Цикл
Если Найти(IDСообщения, "balance") = 0 Тогда
Ответ.IDСообщений.Добавить(СокрЛП(IDСообщения));
КонецЕсли;
IDСообщения = ТекстовыйФайл.ПрочитатьСтроку();
КонецЦикла;
КонецЕсли;
ТекстовыйФайл.Закрыть();

Возврат Ответ;

КонецФункции // ПолучитьОтветОтправки()


Функция сервиса отправки СМС возвращает код и ID сообщений, которые необходимо прочитать из файла-ответа. Если код = 100, то сервис принял сообщения к отправке. ID сообщений нужны для проверки статуса отправленных сообщений, потому что в итоге сообщение может быть не доставлено по различным причинам: время жизни истекло, удалено оператором и т.д.

4) Заключительная функция - отправка сообщения!


// Отправляет SMS через сервис SMS.RU
//
// Параметры
//  ПараметрыСМС - Структура - параметры: Логин, Пароль, Получатель, Текст.
//  РежимТестирования - Булево - имитирование отправки сообщения для тестирования.
//  УсиленнаяАвторизация - Булево - использование усиленной авторизации.
//
// Возвращаемое значение:
//   Структура   - код статуса отправки сообщения/й и массив их идентификаторов.
//
Функция ОтправитьSMS(ПараметрыСМС, РежимТестирования, Знач УсиленнаяАвторизация = Ложь) Экспорт

Попытка
Ключ = ПолучитьТокенСМС_РУ();
ХэшСумма = ВычислитьХешСтрокиПоАлгоритмуSHA512(ПараметрыСМС.Пароль + Ключ);
Исключение // Если не удалось получить хэш-сумму токена, то выполним обычную авторизацию.
УсиленнаяАвторизация = Ложь;
КонецПопытки;

test = ?(РежимТестирования, "1", "0");
ПараметрыЗапроса = Новый Структура("login, to, text, test", ПараметрыСМС.Логин, ПараметрыСМС.Получатель, ПараметрыСМС.Текст, test);
Если УсиленнаяАвторизация Тогда
ПараметрыЗапроса.Вставить("token", Ключ);
ПараметрыЗапроса.Вставить("sha512", ХэшСумма);
Иначе
ПараметрыЗапроса.Вставить("password", ПараметрыСМС.Пароль);
КонецЕсли;
ИмяФайлаОтправки = ОтправкаSMSЧерезБилайн.СформироватьФайлДляPOSTЗапроса(ПараметрыЗапроса);
ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());

// POST-запрос.
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("Content-Length", РазмерФайлаОтправки);
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("txt");
Соединение = Новый HTTPСоединение("sms.ru");
Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, "/sms/send", ИмяФайлаРезультата, Заголовки);

Попытка
УдалитьФайлы(ИмяФайлаОтправки);
Исключение
КонецПопытки;

// Чтение результата запроса.
Ответ = ПолучитьОтветОтправки(ИмяФайлаРезультата);
Попытка
УдалитьФайлы(ИмяФайлаРезультата);
Исключение
КонецПопытки;

Возврат Ответ;

КонецФункции // ОтправитьSMS()


Алгоритм функции
Получаем временный токен, вычисляем хэш-сумму от логина и токена, формируем файл с параметрами и их значениями для POST-запроса. Набор параметров зависит от выбора авторизации. Если это усиленная авторизация то параметры: логин, токен, хэш-сумму, номера телефонов и сам текст сообщения. Если обычная авторизация, то вместо токена и хэш-суммы передается пароль. Как вы заметили файл формирует функция СформироватьФайлДляPOSTЗапроса, текст функции приводить не буду, слишком большой, она кодирует значения параметров тем же способом, как кодируются и post данные WWW-формы. После успешного выполнения запроса считываем из файла-ответа код и ID сообщений.

Комментарии

  1. Функцию "ОтправкаSMSЧерезБилайн" где брать?

    ОтветитьУдалить

Отправить комментарий