Пример интеграции (авторизации) с IP телефонией zadarma.com

26.07.21

Интеграция - Телефония, SIP

Когда-то возникла необходимость совершать звонки через ІР телефонию. Долго подбирал для себя варианты из предложенных на рынке. Но в итоге остановился на задарма, и уже почти год активно юзаем. В работе столкнулись с проблемой авторизации штатными средствами 1С. Тех. поддержка ничего внятного подсказать не могла, посылая на готовые модули типа симплит (с отдельной помесячной оплатой)..

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример интеграции (авторизации) с IP телефонией zadarma.com:
.epf 9,39Kb ver:1
16
16 Скачать (1 SM) Купить за 1 850 руб.

После долгих мучений и помощью хороших людей все же получилось авторизоваться через 1С. 
Про преимущества и недостатки телефонии - судить каждому по-себе. В телефонии есть бесплатные тарифы, которые можно опробовать. Детали на /zadarma.com.

В обработке есть возможность авторизоваться, совершить пробный звонок или посмотреть баланс.

Ключ апи и секрет кей - можно получить в кабинете после регистрации.

По кнопке - баланс - сообщается баланс в валюте аккаута, по кнопке Позвонить - выполняется звонок.
Для успешного звонка - внутренний номер должен быть активен, хотя в телефонии есть возможность звонить с любого внутреннего номера на внешний, при этом принимающий может попасть на голосовое приветствие.

Платформа 8.3.14.

интеграция zadarma.com IP-телефония звонки

См. также

Телефония, SIP Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Модуль интеграции с виртуальной телефонией Новофон для решения 1С:Управление нашей фирмой, редакция 3.0. Обновление релиза в связи с переходом на API 2.0 поставщиком сервиса. Бета-версия 2.0 до окончания перехода поставщиком на новую версию.

12000 руб.

26.02.2024    946    1    0    

2

Разработка внешних компонент Телефония, SIP Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    46786    122    66    

66

Телефония, SIP Пользователь Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 Россия Абонемент ($m)

Данная внешняя обработка позволяет делать звонки из программы 1С, используя сервис сайта zvonok.com.

1 стартмани

18.01.2024    971    1    v3132    0    

3

Телефония, SIP Россия Бесплатно (free)

Делимся опытом разработки системы обзвона абонентов-задолжников.

18.01.2024    1206    slavik27    11    

5

Телефония, SIP Программист Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Отображение информации о клиенте из 1С при входящем звонке — настраиваем интеграцию с Softphone.Pro.

1 стартмани

20.07.2022    3343    1    nikolay.surdo    0    

3

WEB-интеграция Телефония, SIP Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Внешняя обработка для выгрузки записей разговоров с виртуальной АТС Билайна.

1 стартмани

01.07.2022    2637    3    s_evgen    0    

0
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. iclubber 06.09.22 11:23 Сейчас в теме
Дайте Демо попробовать
2. itcorpru 99 21.09.22 14:42 Сейчас в теме
(1) Вот рабочий код


Функция СформироватьСтрокуПараметров(МассивПараметровВх) Экспорт
	СписокЗначений = Новый СписокЗначений; // Подготовительные действия: создание списка значений
	СписокЗначений.ЗагрузитьЗначения(МассивПараметровВх); // Этап 1
	СписокЗначений.СортироватьПоЗначению(НаправлениеСортировки.Возр); // Этап 2
	МассивПараметров = СписокЗначений.ВыгрузитьЗначения(); 

    ParamsStr = "";
    Для Каждого Строка Из МассивПараметров Цикл
        ParamsStr = ParamsStr + Строка + "&";
    КонецЦикла; 
    ParamsStr = ?(Прав(ParamsStr,1) = "&", Лев(ParamsStr, СтрДлина(ParamsStr)-1), ParamsStr);
    Возврат ParamsStr;
КонецФункции
    

Функция ПодготовитьНомер(Номер)
	НомерФормат = СтрЗаменить(Номер, "+", "");
	НомерФормат = СтрЗаменить(НомерФормат, "-", "");
	НомерФормат = СтрЗаменить(НомерФормат, "(", "");
	НомерФормат = СтрЗаменить(НомерФормат, ")", "");
	НомерФормат = СтрЗаменить(НомерФормат, " ", "");
	
	Возврат "+7"+Прав(НомерФормат, 10);
КонецФункции

#Область Криптование
 
Функция hash_hmac_sha1(Строка, СекретныйКлюч) Экспорт
    Текст = Новый COMОбъект("System.Text.UTF8Encoding");
    Криптография = Новый COMОбъект("System.Security.Cryptography.HMACSHA1");
    Криптография.Key = Текст.GetBytes_4(СекретныйКлюч);
    ХешБайт = Криптография.ComputeHash_2(Текст.GetBytes_4(Строка)).Выгрузить();    
    Хеш = "";
    Для Каждого Байт Из ХешБайт Цикл
        Символ = DecToHex(Байт);
        Хеш = Хеш + ?(СтрДлина(Символ) = 2, Символ, "0"+Символ);
    КонецЦикла;
    Возврат Хеш;
КонецФункции
 
Функция base64_encode(Строка) Экспорт
    
    ВременныйФайл = ПолучитьИмяВременногоФайла();
    
    ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, "CESU-8");
    ЗаписьТекста.Записать(Строка);
    ЗаписьТекста.Закрыть();
    
    ДД_Файла = Новый ДвоичныеДанные(ВременныйФайл);
    СтрокаBase64 = Base64Строка(ДД_Файла);
    
    УдалитьФайлы(ВременныйФайл);
    
    Возврат СтрокаBase64;
    
КонецФункции
 
Функция DecToHex(Знач Число) Экспорт
    тЧисло = Число;
    тБаза = 16;
    
    Пока тЧисло <> 0 Цикл
        тПоз =тЧисло % тБаза;
        Результат = Сред("0123456789abcdef", тПоз + 1, 1) + Результат;
        тЧисло = Цел(тЧисло / тБаза);
    КонецЦикла;
    
    Если Число < тБаза Тогда 
        Результат = "0" + Результат; 
    КонецЕсли;
    
    Возврат Результат;
КонецФункции
 
Функция md5(тСтрока) Экспорт
   Crypt = Новый COMОбъект("System.Security.Cryptography.MD5CryptoServiceProvider");
   Text = Новый COMОбъект("System.Text.UTF8Encoding");
 
   HashArray = Crypt.ComputeHash_2(Text.GetBytes_4(тСтрока)).Выгрузить();
 
   Хеш = "";
   Для Каждого Число Из HashArray Цикл
       Символ = DecToHex(Число);
       Хеш = Хеш + ?(СтрДлина(Символ) = 2, Символ, "0"+Символ);
   КонецЦикла;
 
   Возврат Хеш;
КонецФункции
 
Функция ПолучитьПодпись(secret, method, paramsStr) Экспорт
    //$sign = base64_encode(hash_hmac('sha1', $method . $paramsStr . md5($paramsStr), $secret));                
    sign = base64_encode( hash_hmac_sha1(method + paramsStr + md5(paramsStr), secret) );    
    Возврат sign;
КонецФункции
 
#КонецОбласти


#Область Работа_с_JSON

Функция jsonПрочитатьПлатформой(Значение) Экспорт
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Значение);
    Результат = Неопределено;
    СформироватьДерево(ЧтениеJSON, Результат);
    ЧтениеJSON.Закрыть();
    Возврат Результат;
КонецФункции
 
Процедура СформироватьДерево(ЧтениеJSON, Дерево) Экспорт
    
    ИмяСвойства = Неопределено;
    
    Пока ЧтениеJSON.Прочитать() Цикл
        TипJSON = ЧтениеJSON.ТипТекущегоЗначения;
        
        Если TипJSON = ТипЗначенияJSON.НачалоОбъекта 
        ИЛИ TипJSON = ТипЗначенияJSON.НачалоМассива Тогда
            НовыйОбъект = ?(TипJSON = ТипЗначенияJSON.НачалоОбъекта, Новый Соответствие, Новый Массив);
            
            Если ТипЗнч(Дерево) = Тип("Массив") Тогда
                Дерево.Добавить(НовыйОбъект);
            ИначеЕсли ТипЗнч(Дерево) = Тип("Соответствие") И ЗначениеЗаполнено(ИмяСвойства) Тогда
                Дерево.Вставить(ИмяСвойства, НовыйОбъект);
            КонецЕсли;
            
            СформироватьДерево(ЧтениеJSON, НовыйОбъект);


Если Дерево = Неопределено Тогда
                Дерево = НовыйОбъект;
            КонецЕсли;
        ИначеЕсли TипJSON = ТипЗначенияJSON.ИмяСвойства Тогда
            ИмяСвойства = ЧтениеJSON.ТекущееЗначение;
        ИначеЕсли TипJSON = ТипЗначенияJSON.Число 
        ИЛИ TипJSON = ТипЗначенияJSON.Строка 
        ИЛИ TипJSON = ТипЗначенияJSON.Булево 
        ИЛИ TипJSON = ТипЗначенияJSON.Null Тогда
            Если ТипЗнч(Дерево) = Тип("Массив") Тогда
                Дерево.Добавить(ЧтениеJSON.ТекущееЗначение);
            ИначеЕсли ТипЗнч(Дерево) = Тип("Соответствие") Тогда
                Дерево.Вставить(ИмяСвойства, ЧтениеJSON.ТекущееЗначение);
            КонецЕсли;
        Иначе
            Возврат;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

#КонецОбласти

#Область Константы

Функция ПолучитьКлючAPI() Экспорт
	Возврат "ТутКлюч";
КонецФункции

Функция ПолучитьСекретныйКлюч() Экспорт
	Возврат "ТутСекретныйКлюч";
КонецФункции

Функция ПолучитьДоменAPI()
	Возврат "api.zadarma.com";
КонецФункции

Функция ПолучитьВерсиюAPI()
	Возврат "/v1";
КонецФункции


#КонецОбласти


Функция ПолучитьБаланс(API_Key, Secret_Key) Экспорт     
    Домен = ПолучитьДоменAPI();
    ВерсияAPI = ПолучитьВерсиюAPI();        
    Метод = "/info/balance/";  
	ПараметрыСтроки = "";
	
	Адрес = Метод + ПараметрыСтроки;
	
    Sign = ПолучитьПодпись(Secret_Key, ВерсияAPI + Метод, ПараметрыСтроки);    
    SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());    
    Соединение = Новый HTTPСоединение(Домен,,,,,60, SSL);    
    ЗапросHTTP = Новый HTTPЗапрос();
    ЗапросHTTP.АдресРесурса = ВерсияAPI + Адрес;        
    ЗапросHTTP.Заголовки.Вставить("Authorization", API_Key + ":" + sign);        
    ЗапросHTTP.Заголовки.Вставить("Accept-Charset","utf-8");        
    HTTPОтвет    = Соединение.Получить(ЗапросHTTP);
    ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();            
    Попытка        
        ОтветСервиса = jsonПрочитатьПлатформой(ТекстОтвета);
		Сообщить("Баланс: " + ОтветСервиса.Получить("balance"));
    Исключение
        //запись в лог - ошибка сервиса, обратно вернулся не json
        ОтветСервиса = ТекстОтвета;
        ИОШ = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Callback", УровеньЖурналаРегистрации.Ошибка, , , "Вызов: ["+ ЗапросHTTP.АдресРесурса + "], Ответ [" + ТекстОтвета + "], ИОШ:" + ИОШ);
	КонецПопытки;  
	
    Возврат ОтветСервиса;
КонецФункции

Функция Позвонить(API_Key, Secret_Key, ВнутреннийНомер, Телефон, сипНомер="") Экспорт  
	ТелефонФормат = ПодготовитьНомер(Телефон);
	
    Домен = ПолучитьДоменAPI();
    ВерсияAPI = ПолучитьВерсиюAPI();     
	Метод = "/request/callback/";
	
	МассивПараметров = Новый Массив();
	МассивПараметров.Добавить( "from="+КодироватьСтроку(ВнутреннийНомер, СпособКодированияСтроки.КодировкаURL) );
	МассивПараметров.Добавить( "to="+КодироватьСтроку(ТелефонФормат, СпособКодированияСтроки.КодировкаURL) );
	Если НЕ сипНомер = "" Тогда
		МассивПараметров.Добавить( "sip="+КодироватьСтроку(сипНомер, СпособКодированияСтроки.КодировкаURL) );
	КонецЕсли;
	
	ПараметрыСтроки = СформироватьСтрокуПараметров(МассивПараметров);
		
	Адрес = Метод +"?"+ ПараметрыСтроки;
	
  //  Method = "/request/callback/?from=1&to="+Телефон+"&predicted=true";    
    Sign = ПолучитьПодпись(Secret_Key, ВерсияAPI + Метод, ПараметрыСтроки);    
    SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());    
    Соединение = Новый HTTPСоединение(Домен,,,,,60, SSL);    
    ЗапросHTTP = Новый HTTPЗапрос();
    ЗапросHTTP.АдресРесурса = ВерсияAPI + Адрес;        
    ЗапросHTTP.Заголовки.Вставить("Authorization", API_Key + ":" + sign);        
    ЗапросHTTP.Заголовки.Вставить("Accept-Charset","utf-8");        
    HTTPОтвет    = Соединение.Получить(ЗапросHTTP);
    ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();            
    Попытка        
        ОтветСервиса = jsonПрочитатьПлатформой(ТекстОтвета);
    Исключение
        //запись в лог - ошибка сервиса, обратно вернулся не json
        ОтветСервиса = ТекстОтвета;
        ИОШ = ОписаниеОшибки();
        ЗаписьЖурналаРегистрации("Callback", УровеньЖурналаРегистрации.Ошибка, , , "Вызов: ["+ ЗапросHTTP.АдресРесурса + "], Ответ [" + ТекстОтвета + "], ИОШ:" + ИОШ);
	КонецПопытки;    
	
    Возврат ОтветСервиса;
КонецФункции
Показать
3. Nik-An 30 27.03.23 22:46 Сейчас в теме
Доброго дня!
Получилось ли получить статистику Задармы?
Собственно, никак не пойму в каком формате даты передать.
4. itcorpru 99 28.03.23 17:31 Сейчас в теме
(3)
Собственно, никак не пойму в каком формате даты передать.
YYYY-MM-DD HH:MM:SS
5. itcorpru 99 28.03.23 17:32 Сейчас в теме
(3){
"status":"success",
"start":"2015-06-01 00:00:00",
"end":"2015-06-29 13:45:23",
"stats":[
{
"id":"155112249",
"sip":"00001",
"callstart":"2015-06-02 12:20:25",
"from":442037691880,
"to":442037691881,
"description":"United Kingdom, London",
"disposition":"busy",
"billseconds":0,
"cost":0.1950,
"billcost":0.0000,
"currency":"USD"
},

]
}
6. Nik-An 30 28.03.23 17:36 Сейчас в теме
(5) Т.е. даты передается не в параметре вызова, а в теле JSON?
7. itcorpru 99 28.03.23 17:37 Сейчас в теме
(6) думаю да, в примере в теле
8. Nik-An 30 28.03.23 17:44 Сейчас в теме
Это пример ответа с https://zadarma.com/ru/support/api/.
Документацию изучил. Там GET запрос. И, по идее, все должно вызываться через параметры.
Пробовал передавать
&start='2023-03-28 00:00:00'
&start="2023-03-28 00:00:00"
&start=2023-03-28 00:00:00
&start=2023-03-28%2000%3A00%3A00

Получаю ошибку авторизации
9. Nik-An 30 29.03.23 11:33 Сейчас в теме
(8) отвечу себе сам

После того как передаваемую дату закодировали в формат URL, еще необходимо сделать замену пробела на "+":
start="2023-03-28%2000%3A00%3A00";
start=СтрЗаменить(start, "%20", "+");
itcorpru; +1 Ответить
Оставьте свое сообщение