| Для 1С (Версия 7.7)
Скачать smsc_api_1c77.txt (52 Кб)
Исходный код библиотеки:
// M.SMSC.RU API (m.smsc.ru) версия 1.9 (03.07.2019)
Перем SMSC_Логин; // логин клиента Перем SMSC_Пароль; // пароль клиента Перем SMSC_HTTPS; // использовать HTTPS протокол Перем SMSC_Отладка; // флаг отладки Перем SMSC_Кодировка; // кодировка сообщения (utf-8 или koi8-r), по умолчанию используется windows-1251
Перем ЕСТЬ_ПРОКСИ; // Флаг использования PROXY-сервера Перем ПРОКСИ_АДРЕС; Перем ПРОКСИ_ПОРТ; Перем ПРОКСИ_ЛОГИН; Перем ПРОКСИ_ПАРОЛЬ;
Перем Соединение; Перем Hex[16]; Перем ФорматыСообщений[11];
//*************************************************************************************** // ВНУТРЕННИЕ СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //*************************************************************************************** // Процедура инициализации переменных // Процедура ИнициализацияПеременных()
SMSC_Логин = "login"; SMSC_Пароль = "password"; SMSC_Отладка = 0; SMSC_HTTPS = 1; SMSC_Кодировка = "";
ЕСТЬ_ПРОКСИ = 0; ПРОКСИ_АДРЕС = ""; ПРОКСИ_ПОРТ = ""; ПРОКСИ_ЛОГИН = ""; ПРОКСИ_ПАРОЛЬ = "";
КонецПроцедуры
//*************************************************************************************** // Функция преобразования строки вида х,у в список значений // Функция Строка2Список(Стр)
Перем Рез;
Рез = СоздатьОбъект("СписокЗначений"); й = 1;
Для й = 1 По 4 Цикл
Поз = Найти(Стр, ",");
Если Поз = 0 Тогда Рез.ДобавитьЗначение(Стр); Прервать; Иначе Рез.ДобавитьЗначение(Лев(Стр,Поз-1)); КонецЕсли;
Стр = Сред(Стр, Поз+1, СтрДлина(Стр)-Поз);
КонецЦикла;
Возврат Рез;
КонецФункции // Строка2Список()
//*************************************************************************************** Функция URLEncode(Стр1)
//СтрокаСимволов = " !""@№#;%:?*().,/$^&"; СтрокаСимволов = " @№#%?/$&+";
Рез = ""; Стр = СокрЛП(Стр1); Для Сч=1 По СтрДлина(Стр) Цикл Символ = Сред(Стр, Сч, 1); КС = КодСимв(Символ);
флЗаменили = 0; Если Найти(СтрокаСимволов, Символ) > 0 Тогда
Рез = Рез + "%"+ Hex[Цел(КС/16)+1] + Hex[Цел(КС%16)+1]; флЗаменили = 1;
КонецЕсли;
Если (КС <= 127) и (флЗаменили = 0) Тогда Рез = Рез + Символ; ИначеЕсли флЗаменили = 0 Тогда Рез = Рез + "%"+ Hex[Цел(КС/16)+1] + Hex[Цел(КС%16)+1]; КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции // URLEncode()
//******************************************************************************* // Переводит время в формате Unix DateTimeStamp в строку с датой, временем // // Пареметры: // ШтампВремени - штамп времени в формате Unix // Функция Unix2Date (ШтампВремени)
ЧислоДней = Цел(ШтампВремени / 86400);
Д = Дата("01.01.1970") + ЧислоДней; ОстСек = ШтампВремени % 86400;
Ч = Цел(ОстСек / 3600); ОстСек = ОстСек % 3600;
М = Цел(ОстСек / 60); С = ОстСек % 60;
Возврат Формат(Д, "Д ДДММГГГГ") + " " + Ч + ":" + М + ":" + С;
КонецФункции // Unix2Date()
//******************************************************************************* // Осуществляет загрузку внешней компоненты WinHttp.dll // Функция УстановитьКомпоненту()
Попытка
Соединение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); Соединение.Option(9, 80); Если ЕСТЬ_ПРОКСИ = 1 Тогда Соединение.SetProxy(2, СокрЛП(ПРОКСИ_АДРЕС) + ":" + СокрЛП(ПРОКСИ_ПОРТ)); КонецЕсли;
Исключение
Сообщить("Не удалось создать объект WinHttp.WinHttpRequest.5.1!" + РазделительСтрок + "Проверьте наличие системной библиотеки ""WinHttp.dll""!"); Возврат 0;
КонецПопытки;
Возврат 1;
КонецФункции // УстановитьКомпоненту()
//*************************************************************************************** // Функция чтения адреса // Функция _SMSC_ПрочитатьАдрес(Адрес, Параметры)
Перем Рез;
Попытка Соединение.Open("POST", СокрЛП(Адрес), 0); Если ЕСТЬ_ПРОКСИ = 1 Тогда Соединение.SetCredentials(СокрЛП(ПРОКСИ_ЛОГИН), СокрЛП(ПРОКСИ_ПАРОЛЬ), 1); КонецЕсли; Соединение.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); Соединение.Send(СокрЛП(Параметры)); Рез = Соединение.ResponseText(); Исключение Сообщить("Не удалось получить данные с сервера!", "!"); Возврат ""; КонецПопытки;
Возврат Рез;
КонецФункции //_SMSC_ПрочитатьАдрес()
//*************************************************************************************** // Функция вызова запроса. Формирует URL и делает 5 попыток чтения. // Функция _SMSC_ПослатьКоманду(Команда, Аргументы = "")
Адрес = "http" + ?(SMSC_HTTPS = 2, "s", "") + "://m.smsc.ru/sys/" + Команда + ".php"; Параметры = "login=" + СокрЛП(URLEncode(SMSC_Логин)) + "&psw=" + СокрЛП(URLEncode(SMSC_Пароль)) + "&fmt=1" + ?(ПустаяСтрока(SMSC_Кодировка) = 1, "", "&charset=" + SMSC_Кодировка) + "&" + СокрЛП(Аргументы);
Для Сч = 1 По 5 Цикл
Если Сч > 1 Тогда Адрес = "http" + ?(SMSC_HTTPS = 2, "s" , "") + "://" + "www" + Сч + ".m.smsc.ru/sys/" + Команда + ".php"; КонецЕсли;
Рез = _SMSC_ПрочитатьАдрес(Адрес, Параметры);
Если ПустоеЗначение(Рез) = 0 Тогда Прервать; КонецЕсли;
КонецЦикла;
Если ПустоеЗначение (Рез) = 1 Тогда
Если SMSC_Отладка = 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, ФорматСообщения = 0, Отправитель = "", ДопПараметры = "")
Ответ = _SMSC_ПослатьКоманду ("send", "cost=3&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + "&translit=" + Транслит + "&id=" + ИД + ?(ФорматСообщения > 0, "&" + ФорматыСообщений[ФорматСообщения], "") + ?(ПустаяСтрока(Отправитель) = 1, "", "&sender=" + URLEncode(Отправитель)) + ?(ПустаяСтрока(Время) = 1, "", "&time=" + URLEncode(Время)) + ?(ПустаяСтрока(ДопПараметры) = 1, "", "&" + ДопПараметры));
// (id, cnt, cost, balance) или (id, -error)
Если (SMSC_Отладка = 1) Тогда
РезИД = Число(Ответ.ПолучитьЗначение(1)); Рез = Число(Ответ.ПолучитьЗначение(2)); Если (Рез > 0) Тогда Сообщить ("Сообщение отправлено успешно. ID: " + РезИД + ", всего SMS: " + Ответ.ПолучитьЗначение(2) + ", стоимость: " + Ответ.ПолучитьЗначение(3) + " руб., баланс: " + Ответ.ПолучитьЗначение(4) + " руб."); Иначе Сообщить ("Ошибка № " + Строка(-Рез) + ?(РезИД > 0, ", ID: " + РезИД, "")); КонецЕсли;
КонецЕсли;
Возврат Ответ;
КонецФункции // ПослатьSMS()
//*************************************************************************************** // Функция получения стоимости SMS // // обязательные параметры: // // Телефоны - список телефонов через запятую или точку с запятой // Сообщение - отправляемое сообщение // // необязательные параметры: // // Транслит - переводить или нет в транслит (1 или 0) // Отправитель - имя отправителя (Sender ID) // ДопПараметры - строка дополнительных параметров, добавляемая в URL-запрос ("list=79999999999:Ваш пароль: 123\n78888888888:Ваш пароль: 456") // // возвращает список (<стоимость>, <количество sms>) либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтоимость(Телефоны, Сообщение, Транслит = 0, Отправитель = "", ДопПараметры = "")
Ответ = _SMSC_ПослатьКоманду("send", "cost=1&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + ?(ПустаяСтрока(Отправитель) = 1, "", "&sender=" + URLEncode(Отправитель)) + "&translit=" + Транслит + ?(ПустаяСтрока(ДопПараметры) = 1, "", "&" + ДопПараметры));
// (cost, cnt) или (0, -error)
Если (SMSC_Отладка = 1) Тогда
Рез1 = Число(Ответ.ПолучитьЗначение(1)); Рез2 = Число(Ответ.ПолучитьЗначение(2)); Если (Рез2 > 0) Тогда Сообщить ("Стоимость рассылки: " + Рез1 + " руб. Всего SMS: " + Рез2); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли;
КонецЕсли;
Возврат Ответ;
КонецФункции
//*************************************************************************************** // Функция проверки статуса отправленного SMS // // ИД - ID cообщения // Телефон - номер телефона // // возвращает список: // для отправленного SMS (<статус>, <время изменения>, <код ошибки sms>) // для HLR-запроса (<статус>, <время изменения>, <код ошибки sms>, <код страны регистрации>, <код оператора абонента>, // <название страны регистрации>, <название оператора абонента>, <название роуминговой страны>, <название роумингового оператора>, // <код IMSI SIM-карты>, <номер сервис-центра>) // либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтатус(ИД, Телефон)
Ответ = _SMSC_ПослатьКоманду("status", "phone=" + URLEncode(Телефон) + "&id=" + ИД);
// (status, time, err) или (0, -error)
Если (SMSC_Отладка = 1) Тогда
Рез1 = Число(Ответ.ПолучитьЗначение(1)); Рез2 = Число(Ответ.ПолучитьЗначение(2));
Если (Рез2 >= 0) Тогда Сообщить ("Статус SMS = " + Рез1 + ?(ПустоеЗначение(Рез2) = 0, ", время изменения статуса - " + Unix2Date(Число(Ответ.ПолучитьЗначение(2))), "")); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли;
КонецЕсли;
Возврат Ответ;
КонецФункции // ПолучитьСтатус()
//*************************************************************************************** // Функция получения баланса // // без параметров // // возвращает баланс в виде строки или 0 в случае ошибки
Функция ПолучитьБаланс()
Ответ = _SMSC_ПослатьКоманду("balance"); // (balance) или (0, -error) Рез = Число(Ответ.ПолучитьЗначение(1));
Если (SMSC_Отладка = 1) Тогда
Если Рез >= 0 тогда Сообщить("Сумма на счете: " + Рез + " руб."); Иначе Сообщить("Ошибка № " + Строка(-Число(Ответ.ПолучитьЗначение(2)))); КонецЕсли;
КонецЕсли;
Возврат Рез;
КонецФункции // ПолучитьБаланс()
//*************************************************************************************** // Предопределенная процедура // Процедура ПриОткрытии()
Если УстановитьКомпоненту() = 0 Тогда Возврат; КонецЕсли;
ИнициализацияПеременных();
КонецПроцедуры // ПриОткрытии()
//*************************************************************************************** // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ //*************************************************************************************** Hex[1]="0"; Hex[2]="1"; Hex[3]="2"; Hex[4]="3"; Hex[5]="4"; Hex[6]="5"; Hex[7]="6"; Hex[8]="7"; Hex[9]="8"; Hex[10]="9"; Hex[11]="A"; Hex[12]="B"; Hex[13]="C"; Hex[14]="D"; Hex[15]="E"; Hex[16]="F";
ФорматыСообщений[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", 1); // Ответ = ПослатьSMS("79999999999", "http://m.smsc.ru\nM.SMSC.RU", 0, 0, 0, 0, "", "maxsms=3"); // Ответ = ПослатьSMS("79999999999", "0605040B8423F0DC0601AE02056A0045C60C036D79736974652E72750001036D7973697465000101", 0, 0, 0, 5, ""); // Ответ = ПослатьSMS("79999999999", "", 0, 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-сообщений на основе библиотеки.
|