API библиотека для 1С (Версия 7.7)

Скачать smsc_api_1c77.txt (52 Кб)

Исходный код библиотеки: // BILLING.SMSTRAF.RU API (billing.smstraf.ru) версия 1.7 (14.09.2015)

Перем SMSC_Логин;        // логин клиента
Перем SMSC_Пароль;        // пароль клиента или MD5-хеш пароля в нижнем регистре
Перем SMSC_HTTPS;        // использовать HTTPS протокол
Перем SMSC_Отладка;        // флаг отладки
Перем SMSC_Кодировка;    // кодировка сообщения (utf-8 или koi8-r), по умолчанию используется windows-1251

Перем ЕСТЬ_ПРОКСИ;        // Флаг использования PROXY-сервера
Перем ПРОКСИ_АДРЕС;
Перем ПРОКСИ_ПОРТ;
Перем ПРОКСИ_ЛОГИН;
Перем ПРОКСИ_ПАРОЛЬ;

Перем Соединение;
Перем Hex[16];
Перем ФорматыСообщений[6];


//***************************************************************************************
// ВНУТРЕННИЕ СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
//***************************************************************************************
// Процедура инициализации переменных
//
Процедура ИнициализацияПеременных()

   
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 и делает 3 попытки чтения.
//
Функция _SMSC_ПослатьКоманду(Команда, Аргументы = "")

   
Адрес = "http" + ?(SMSC_HTTPS = 2, "s", "") + "://billing.smstraf.ru/sys/" + Команда + ".php";
   
Параметры = "login=" + СокрЛП(URLEncode(SMSC_Логин)) + "&psw=" + СокрЛП(URLEncode(SMSC_Пароль)) + "&fmt=1" +
        ?(
ПустаяСтрока(SMSC_Кодировка) = 1, "", "&charset=" + SMSC_Кодировка) + "&" + СокрЛП(Аргументы);

   
Для Сч = 1 По 3 Цикл

        Если Сч
> 1 Тогда
            Для Сч2
= 1 По 2000 Цикл
                у
= Сч2; // Небольшой таймаут
           
КонецЦикла;
       
КонецЕсли;

       
Рез = _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, 8 - mail, 9 - call)
// Отправитель - имя отправителя (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";

// Examples:
// Ответ = ПослатьSMS("79999999999", "Ваш пароль: 123", 1);
// Ответ = ПослатьSMS("79999999999", "http://billing.smstraf.ru\nBILLING.SMSTRAF.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://billing.smstraf.ru\nBILLING.SMSTRAF.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-сообщения для оператора Теле2 (Казахстан)
05.05.2017
Оператор Теле2 (Казахстан) с 15 мая подобно оператору Билайн вводит повышенный тариф на отправку международных SMS-сообщений с платной регистрацией имен отправителей. Стоимость регистрации одного имени — 12 000 тенге (2174 руб. по текущему курсу). Возможность отправки международных сообщений от общего бесплатного имени согласовывается, по предварительным данным от оператора это будет доступно.
подробнее