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

Скачать smsc_api_1c82.txt (10 Кб)

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

Перем SMSC_LOGIN;         // логин клиента
Перем SMSC_PASSWORD;     // пароль клиента или MD5-хеш пароля в нижнем регистре
Перем 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()

   
//***************************************************************************************
// Функция чтения адреса
//
Функция _SMSC_ПрочитатьАдрес(Сервер, РесурсНаСервере, _Параметры)
   
   
Перем Рез;     
   
   
Прокси = Неопределено;
   
Если ЕСТЬ_ПРОКСИ Тогда
        Прокси
= Новый ИнтернетПрокси;
       
Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина;
       
Прокси.Пользователь = ПРОКСИ_ЛОГИН;
       
Прокси.Пароль = ПРОКСИ_ПАРОЛЬ;
       
Прокси.Установить("http" + ?(SMSC_HTTPS=1, "s", ""), ПРОКСИ_АДРЕС, ПРОКСИ_ПОРТ);
   
КонецЕсли;
   
   
Попытка
        Соединение
= Новый HTTPСоединение(Сервер, , , , Прокси, ?(SMSC_HTTPS=1, Истина, Ложь));
   
Исключение
        Сообщить
("Не удалось установить соединение с сервером:"
           
+ Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
       
Возврат "";
   
КонецПопытки;

   
ИмяФайлаРезультата = ПолучитьИмяВременногоФайла();
   
   
РесурсПараметры = РесурсНаСервере+"?"+_Параметры;
   
Если СтрДлина(РесурсПараметры) < 2000 Тогда // GET
       
       
Попытка
            Соединение
.Получить(РесурсПараметры, ИмяФайлаРезультата);
           
Соединение = Неопределено;
       
Исключение
            Сообщить
("Не удалось получить данные с сервера", СтатусСообщения.Важное);
           
Возврат "";
       
КонецПопытки;
           
   
Иначе // POST   
       
        //Создаём файл отправки - содержимое POST-запроса.
       
ИмяФайлаОтправки = ПолучитьИмяВременногоФайла();
       
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, ЛОЖЬ);
       
ФайлОтправки.ЗаписатьСтроку(_Параметры);
       
ФайлОтправки.Закрыть();

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

       
Попытка
             Соединение
.ОтправитьДляОбработки(ИмяФайлаОтправки, РесурсНаСервере, ИмяФайлаРезультата, ЗаголовокHTTP);
           
Соединение = Неопределено;
       
Исключение
            Сообщить
("Не удалось получить данные с сервера:" + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
           
Возврат "";
       
КонецПопытки;
       
   
КонецЕсли;   
       
   
ФайлРезультата = Новый ЧтениеТекста(ИмяФайлаРезультата);
   
Рез = ФайлРезультата.ПрочитатьСтроку();
   
   
Возврат Рез;
   
КонецФункции //_SMSC_ПрочитатьАдрес()
               

//***************************************************************************************
// Функция вызова запроса. Формирует URL и делает 3 попытки чтения.
//
Функция _SMSC_ПослатьКоманду(Команда, Аргументы = "")

   
Сервер = "billing.smstraf.ru";
   
Ресурс = "/sys/" + Команда + ".php";
   
Параметры = "login=" + СокрЛП(URLEncode(SMSC_LOGIN)) + "&psw=" + СокрЛП(URLEncode(SMSC_PASSWORD)) + "&fmt=1&charset=utf-16" +
        ?(
Не ПустаяСтрока(Аргументы), "&" + СокрЛП(Аргументы), "");
   
   
Для Сч = 1 По 3 Цикл
       
        Если Сч
> 1 Тогда
            Для Сч2
= 1 По 2000 Цикл
                у
= Сч2; // Небольшой таймаут
           
КонецЦикла;
       
КонецЕсли;
       
       
Если Сч = 3 Тогда
            Сервер
= "www2.billing.smstraf.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, 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=" + XMLСтрока(ИД) + ?(ФорматСообщения > 0, "&" + ФорматыСообщений[ФорматСообщения], "") +
                    ?(
ПустаяСтрока(Отправитель), "", "&sender=" + URLEncode(Отправитель)) +
                    ?(
ПустаяСтрока(Время), "", "&time=" + СтрЗаменить(Время, " ", "%20")) +
                    ?(
ПустаяСтрока(ДопПараметры), "", "&" + ДопПараметры));

   
// (id, cnt, cost, balance) или (id, -error)

   
Если SMSC_DEBUG = 1 Тогда

        РезИД
= Число(Ответ[0].Значение);
       
Рез = Число(Ответ[1].Значение);
       
Если (Рез > 0) Тогда
            Сообщить
("Сообщение отправлено успешно. ID: " + РезИД + ", всего SMS: " + Ответ[1].Значение +
                   
", стоимость: " + Ответ[2].Значение + " руб., баланс: " + Ответ[3].Значение + " руб.");
       
Иначе       
            Сообщить
("Ошибка № " + Строка(-Рез) + ?(РезИД > 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(Сообщение) +
                    ?(
ПустаяСтрока(Отправитель), "", "&sender=" + URLEncode(Отправитель)) +
                   
"&translit=" + Транслит + ?(ПустаяСтрока(ДопПараметры), "", "&" + ДопПараметры));

   
// (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, ", время изменения статуса - " + Unix2Date(Ответ[1].Значение), ""));
       
Иначе
            Сообщить
("Ошибка № " + Строка(-Рез2));
       
КонецЕсли;   
       
   
КонецЕсли;

   
Возврат Ответ;
   
КонецФункции // ПолучитьСтатус()


//***************************************************************************************
// Функция получения баланса
//
// без параметров
//
// возвращает баланс в виде строки или 0 в случае ошибки
//
Функция ПолучитьБаланс()
           
   
Ответ = _SMSC_ПослатьКоманду("balance"); // (balance) или (0, -error)
   
Рез = Число(Ответ[0].Значение);

   
Если SMSC_DEBUG = 1 Тогда

        Если Рез
>= 0 тогда
            Сообщить
("Сумма на счете: " Строка(Рез) + " руб.");
       
Иначе
            Сообщить
("Ошибка № " Строка(-Рез));
       
КонецЕсли;   

   
КонецЕсли;
       
   
Возврат Рез;
   
КонецФункции // ПолучитьБаланс()   


//***************************************************************************************
// Предопределенная процедура
//
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)           
   
   
ИнициализацияПеременных();
   
КонецПроцедуры // ПередОткрытием() 


//***************************************************************************************
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
//***************************************************************************************

ФорматыСообщений = Новый Массив(7);
ФорматыСообщений[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", "0605040B8423F0DC0601AE02056A0045C60C037761702E736D73632E72752F0001037761702E736D73632E7275000101", 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 и повышенный тариф на международные SMS для операторов СМАРТС, Ростелеком, Йота
26.05.2017
В связи с изменением с 1 июня тарифов на отправку SMS-сообщений оператором Мегафон и введение международного тарифа согласно предыдущей новости, также меняются тарифы для операторов СМАРТС, Ростелеком и Йота, отправка сообщений на которых осуществляется через оператора Мегафон. Поэтому все указанные ранее изменения для оператора Мегафон также распространяются на указанных операторов. Новые тарифы указаны на странице Тарифы.