| Для 1С (Версия 8.2; 8.3)
Скачать smsc_api_1c82.txt (10 Кб)
Исходный код библиотеки:
// M.SMSC.RU API (www.m.smsc.ru) версия 1.19 (03.07.2019)
Перем SMSC_LOGIN; // логин клиента Перем SMSC_PASSWORD; // пароль клиента Перем SMSC_HTTPS; // использовать HTTPS протокол Перем SMSC_DEBUG; // флаг отладки
Перем ЕСТЬ_ПРОКСИ; // Флаг использования PROXY-сервера Перем ПРОКСИ_АДРЕС; Перем ПРОКСИ_ПОРТ; Перем ПРОКСИ_ЛОГИН; Перем ПРОКСИ_ПАРОЛЬ;
Перем Соединение; Перем ФорматыСообщений;
//*************************************************************************************** // ВНУТРЕННИЕ СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //***************************************************************************************
//*************************************************************************************** // Процедура инициализации переменных // Процедура ИнициализацияПеременных() SMSC_LOGIN = "<login>"; SMSC_PASSWORD = "<password>"; SMSC_DEBUG = 0; SMSC_HTTPS = 1; ЕСТЬ_ПРОКСИ = Ложь; ПРОКСИ_АДРЕС = ""; ПРОКСИ_ПОРТ = ""; ПРОКСИ_ЛОГИН = ""; ПРОКСИ_ПАРОЛЬ = ""; КонецПроцедуры
//*************************************************************************************** // Функция преобразования строки вида х,у в список значений // Функция Строка2Список(Стр) Перем Рез; Рез = Новый СписокЗначений; Сч = 1; Для Сч = 1 По 4 Цикл Поз = Найти(Стр, ","); Если Поз = 0 Тогда Рез.Добавить(Стр); Прервать; Иначе Рез.Добавить(Лев(Стр,Поз-1)); КонецЕсли; Стр = Сред(Стр, Поз+1, СтрДлина(Стр)-Поз); КонецЦикла; Возврат Рез; КонецФункции // Строка2Список()
//*************************************************************************************** // Переводит время в формате Unix DateTimeStamp в строку с датой, временем // // Пареметры: // ШтампВремени - штамп времени в формате Unix // Функция Unix2Date (ШтампВремени) Возврат Дата("19700101000000") + ШтампВремени; КонецФункции // Unix2Date()
//*************************************************************************************** функция Hex(КС) _Hex = Новый Массив(16); _Hex[0]="0"; _Hex[1]="1"; _Hex[2]="2"; _Hex[3]="3"; _Hex[4]="4"; _Hex[5]="5"; _Hex[6]="6"; _Hex[7]="7"; _Hex[8]="8"; _Hex[9]="9"; _Hex[10]="A"; _Hex[11]="B"; _Hex[12]="C"; _Hex[13]="D"; _Hex[14]="E"; _Hex[15]="F"; Возврат(_Hex[Цел(КС/16)] + _Hex[Цел(КС%16)]); конецфункции
//*************************************************************************************** Функция URLEncode(Стр1) Рез = ""; Стр= СокрЛП(Стр1); Для Сч=1 По СтрДлина(Стр) Цикл Символ = Сред(Стр, Сч, 1); КС = КодСимвола(Символ); Рез = Рез + "%"+ Hex(Цел(КС/256)) + "%"+ Hex(КС%256); КонецЦикла;
Возврат Рез; КонецФункции // URLEncode()
//*************************************************************************************** // Функция вызова запроса. Формирует URL и делает 3 попытки чтения. // Функция _SMSC_ПрочитатьАдрес(Сервер, РесурсНаСервере, _Параметры) Экспорт Перем Рез; Перем ХТТПОтвет; ЕСТЬ_ПРОКСИ = Ложь; Прокси = Неопределено; Если ЕСТЬ_ПРОКСИ Тогда Прокси = Новый ИнтернетПрокси; Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; Прокси.Пользователь = ПРОКСИ_ЛОГИН; Прокси.Пароль = ПРОКСИ_ПАРОЛЬ; Прокси.Установить("http" + ?(SMSC_HTTPS=1, "s", ""), ПРОКСИ_АДРЕС, ПРОКСИ_ПОРТ); КонецЕсли; Попытка Если SMSC_HTTPS = 0 Тогда Соединение = Новый HTTPСоединение(Сервер, , , , Прокси, Ложь); Иначе Соединение = Новый HTTPСоединение(Сервер, , , , Прокси, 10, Новый ЗащищенноеСоединениеOpenSSL); Конецесли; Исключение Сообщить("Не удалось установить соединение с сервером:" + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное); Возврат ""; КонецПопытки;
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла(); РесурсПараметры = РесурсНаСервере+"?"+_Параметры; Если СтрДлина(РесурсПараметры) < 2000 Тогда // GET Попытка ХТТПОтвет = Соединение.Получить(РесурсПараметры, ИмяФайлаРезультата); Соединение = Неопределено; Исключение Сообщить("Не удалось получить данные с сервера", СтатусСообщения.Важное); Возврат ""; КонецПопытки; Иначе // POST //Создаём файл отправки - содержимое POST-запроса. ИмяФайлаОтправки = ПолучитьИмяВременногоФайла(); ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, "", ЛОЖЬ); ФайлОтправки.Записать(_Параметры); ФайлОтправки.Закрыть();
//Формируем заголовок POST-запроса. ЗаголовокHTTP = Новый Соответствие(); ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded"); ФайлОтправки = Новый Файл(ИмяФайлаОтправки); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); ЗаголовокHTTP.Вставить("Content-Length", Строка(РазмерФайлаОтправки));
Попытка ХТТПОтвет = Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, РесурсНаСервере, ИмяФайлаРезультата, ЗаголовокHTTP); Соединение = Неопределено; Исключение Сообщить("Не удалось получить данные с сервера:" + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное); Возврат ""; КонецПопытки; КонецЕсли; Кодировка = ""; Если Найти(ХТТПОтвет.Заголовки.Получить("Content-Type"), "charset=utf-16be") > 0 Тогда Кодировка = "UTF-16BE"; КонецЕсли; ФайлРезультата = Новый ЧтениеТекста(ИмяФайлаРезультата, Кодировка); Рез = ФайлРезультата.ПрочитатьСтроку(); Возврат Рез; КонецФункции //_SMSC_ПрочитатьАдрес()
//*************************************************************************************** // Функция вызова запроса. Формирует URL и делает 5 попыток чтения. // Функция _SMSC_ПослатьКоманду(Команда, Аргументы = "")
Сервер = "m.smsc.ru"; Ресурс = "/sys/" + Команда + ".php"; _Параметры = "login=" + СокрЛП(URLEncode(SMSC_LOGIN)) + "&psw=" + СокрЛП(URLEncode(SMSC_PASSWORD)) + "&fmt=1&charset=utf-16" + ?(Не ПустаяСтрока(Аргументы), "&" + СокрЛП(Аргументы), ""); Для Сч = 1 По 5 Цикл
Если Сч > 1 Тогда Сервер = "www" + Сч + ".m.smsc.ru"; КонецЕсли;
Рез = _SMSC_ПрочитатьАдрес(Сервер, Ресурс, _Параметры);
Если НЕ ПустаяСтрока(Рез) Тогда Прервать; КонецЕсли;
КонецЦикла;
Если ПустаяСтрока (Рез) Тогда
Если SMSC_DEBUG = 1 Тогда Сообщить("Ошибка чтения адреса: "+ Сервер + Ресурс + "?" + _Параметры); КонецЕсли;
Рез = "," // Фиктивный ответ
КонецЕсли;
Возврат Строка2Список(Рез);
КонецФункции // _SMSC_ПослатьКоманду()
//*************************************************************************************** // Функция отправки SMS // // обязательные параметры: // // Телефоны - список телефонов через запятую или точку с запятой // Сообщение - отправляемое сообщение // // необязательные параметры: // // Транслит - переводить или нет в транслит (1 или 0) // Время - необходимое время доставки в виде строки (DDMMYYhhmm, h1-h2, 0ts, +m) // ИД - идентификатор сообщения // ФорматСообщения - формат сообщения (0 - обычное sms, 1 - flash-sms, 2 - wap-push, 3 - hlr, 4 - bin, 5 - bin-hex, 6 - ping-sms, 7 - mms, 8 - mail, 9 - call, 10 - viber, 11 - soc) // Отправитель - имя отправителя (Sender ID) // ДопПараметры - строка дополнительных параметров, добавляемая в URL-запрос ("valid=01:00&maxsms=3&tz=2") // // возвращает список (<id>, <количество sms>, <стоимость>, <баланс>) в случае успешной отправки // либо массив (<id>, -<код ошибки>) в случае ошибки // Функция ПослатьSMS(Телефоны, Сообщение, Транслит = Ложь, Время = "", ИД = 0, ФорматСообщения = 0, Отправитель = "", ДопПараметры = "") Ответ = _SMSC_ПослатьКоманду ("send", "cost=3&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + "&translit=" + ?(Транслит,1,0) + "&id=" + XMLСТрока(ИД) + ?(ФорматСообщения > 0, "&" + ФорматыСообщений[ФорматСообщения], "") + ?(ПустаяСтрока(Отправитель), "", "&sender=" + URLEncode(Отправитель)) + ?(ПустаяСтрока(Время), "", "&time=" + URLEncode(Время)) + ?(ПустаяСтрока(ДопПараметры), "", "&" + ДопПараметры));
// (id, cnt, cost, balance) или (id, -error)
Если SMSC_DEBUG = 1 Тогда
РезИД = Число(Ответ[0].Значение); Рез = Число(Ответ[1].Значение); Если (Рез > 0) Тогда Сообщить ("Сообщение отправлено успешно. ID: " + РезИД + ", всего SMS: " + Ответ[1].Значение + ", стоимость: " + Ответ[2].Значение + " руб., баланс: " + Ответ[3].Значение + " руб."); Иначе Сообщить ("Ошибка № " + Строка(-Рез) + ?(РезИД > 0, ", ID: " + РезИД, "")); КонецЕсли;
КонецЕсли;
Возврат Ответ; КонецФункции // ПослатьSMS()
//*************************************************************************************** // Функция получения стоимости SMS // // обязательные параметры: // // Телефоны - список телефонов через запятую или точку с запятой // Сообщение - отправляемое сообщение // // необязательные параметры: // // Транслит - переводить или нет в транслит // Отправитель - имя отправителя (Sender ID) // ДопПараметры - строка дополнительных параметров, добавляемая в URL-запрос ("list=79999999999:Ваш пароль: 123\n78888888888:Ваш пароль: 456") // // возвращает список (<стоимость>, <количество sms>) либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтоимость(Телефоны, Сообщение, Транслит = Ложь, Отправитель = "", ДопПараметры = "")
Ответ = _SMSC_ПослатьКоманду("send", "cost=1&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + ?(ПустаяСтрока(Отправитель), "", "&sender=" + URLEncode(Отправитель)) + "&translit=" + ?(Транслит,1,0) + ?(ПустаяСтрока(ДопПараметры), "", "&" + ДопПараметры));
// (cost, cnt) или (0, -error)
Если SMSC_DEBUG = 1 Тогда Рез1 = Число(Ответ[0].Значение); Рез2 = Число(Ответ[1].Значение); Если (Рез2 > 0) Тогда Сообщить ("Стоимость рассылки: " + Рез1 + " руб. Всего SMS: " + Рез2); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли;
КонецЕсли;
Возврат Ответ; КонецФункции
//*************************************************************************************** // Функция проверки статуса отправленного SMS // // ИД - ID cообщения // Телефон - номер телефона // // возвращает список: // для отправленного SMS (<статус>, <время изменения>, <код ошибки sms>) // для HLR-запроса (<статус>, <время изменения>, <код ошибки sms>, <код страны регистрации>, <код оператора абонента>, // <название страны регистрации>, <название оператора абонента>, <название роуминговой страны>, <название роумингового оператора>, // <код IMSI SIM-карты>, <номер сервис-центра>) // либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтатус(ИД, Телефон) Ответ = _SMSC_ПослатьКоманду("status", "phone=" + URLEncode(Телефон) + "&id=" + XMLСтрока(ИД));
// (status, time, err) или (0, -error)
Если SMSC_DEBUG = 1 Тогда
Рез1 = Число(Ответ[0].Значение); Рез2 = Число(Ответ[1].Значение); Если (Рез2 >= 0) Тогда Сообщить ("Статус SMS = " + Рез1 + ?(Рез2 > 0, ", время изменения статуса - " + Ответ[1].Значение, "")); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли; КонецЕсли;
Возврат Ответ; КонецФункции // ПолучитьСтатус()
//*************************************************************************************** // Функция получения баланса // // без параметров // // возвращает баланс в виде строки или 0 в случае ошибки // Функция ПолучитьБаланс() Ответ = _SMSC_ПослатьКоманду("balance"); // (balance) или (0, -error) Рез = Число(Ответ[0].Значение);
Если SMSC_DEBUG Тогда
Если Рез >= 0 тогда Сообщить("Сумма на счете: " + Рез + " руб."); Иначе Сообщить("Ошибка № " + Строка(-Число(Ответ[1].Значение))); КонецЕсли;
КонецЕсли; Возврат Рез; КонецФункции // ПолучитьБаланс()
//*************************************************************************************** // Предопределенная процедура // Процедура ПередОткрытием(Отказ, СтандартнаяОбработка) ИнициализацияПеременных(); КонецПроцедуры // ПередОткрытием()
Процедура КнопкаВыполнитьНажатие() // Ответ = ПослатьSMS("79999999999", "Ваш пароль: 123", Истина); // Сообщение(Ответ); КонецПроцедуры
//*************************************************************************************** // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ //***************************************************************************************
ФорматыСообщений = Новый Массив(12); ФорматыСообщений[1] = "flash=1"; ФорматыСообщений[2] = "push=1"; ФорматыСообщений[3] = "hlr=1"; ФорматыСообщений[4] = "bin=1"; ФорматыСообщений[5] = "bin=2"; ФорматыСообщений[6] = "ping=1"; ФорматыСообщений[7] = "mms=1"; ФорматыСообщений[8] = "mail=1"; ФорматыСообщений[9] = "call=1"; ФорматыСообщений[10] = "viber=1"; ФорматыСообщений[11] = "soc=1";
// Examples: // Ответ = ПослатьSMS("79999999999", "Ваш пароль: 123", Истина); // Ответ = ПослатьSMS("79999999999", "http://m.smsc.ru\nM.SMSC.RU", Ложь, 0, 0, 0, "", "maxsms=3"); // Ответ = ПослатьSMS("79999999999", "0605040B8423F0DC0601AE02056A0045C60C036D79736974652E72750001036D7973697465000101", Ложь, 0, 0, 5, ""); // Ответ = ПослатьSMS("79999999999", "", Ложь, 0, 0, 3, ""); // Ответ = ПолучитьСтатус(sms_id, "79999999999"); // Баланс = ПолучитьБаланс();
Пример использования библиотеки:
... Ответ = ПослатьSMS("79999999999", "Ваш пароль: 123", 1); ... Ответ = ПослатьSMS("79999999999", "http://m.smsc.ru\nM.SMSC.RU", 0, 0, 0, 0, "", "", "push=1"); ... Ответ = ПослатьSMS("79999999999", "0605040B8423F0DC0601AE02056A0045C60C036D79736974652E72750001036D7973697465000101", 0, 0, 0, 0, "", "", "bin=2"); ... Ответ = ПослатьSMS("79999999999", "", 0, 0, 0, 0, "", "", "hlr=1"); ... Ответ = ПолучитьСтатус(sms_id, "79999999999"); ... Баланс = ПолучитьБаланс(); ...
Полнофункциональная обработка для отправки SMS-сообщений на основе библиотеки.
FAQ: Как подключиться по HTTPS-протоколу
|