Отправляем СМС через сервис SMS.RU
Постановка задачи
В библиотеке стандартных подсистем (БСП), которая разрабатывается фирмой 1С с целью облегчить жизнь разработчикам, имеется подсистема Отправка SMS. Данная подсистема содержит ряд процедур и функций, с помощью которых можно выполнять отправку коротких сообщений (СМС) посредством операторов МТС и Билайн. Так как ценовая политика этих операторов не устраивала, решено было выполнять отправку СМС через сервис SMS.RU.
Задача: добавить в подсистему Отправка SMS сервис SMS.RU.
Анализ работы сервиса
Отправить СМС через этот сервис можно двумя способами:
- HTTP-запросом
- Через секретный почтовый ящик
Что бы выполнить отправку сообщений, нужно авторизоваться. Авторизация выполняется тремя способами:
- По уникальному ключу
- По логину и паролю
- По логину, временному токену и хэш-суммы(пароль+токен)
Реализация работы с сервисом 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 сообщений.
Функцию "ОтправкаSMSЧерезБилайн" где брать?
ОтветитьУдалить