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

26.07.21

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Пример интеграции (авторизации) с IP телефонией zadarma.com:
.epf 9,39Kb
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    766    1    0    

2

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

Продукт интеграции возможностей Облачной АТС Билайн в систему 1С Предприятие 8. Звонки прямо из программы 1С, уведомления о текущих звонках, регистрация пропущенных и завершенных вызовов, ведение журнала, анализ данных об использовании мобильной связи.

12000 руб.

20.03.2019    22828    53    0    

36

Телефония, SIP Анализ продаж Платформа 1С v8.3 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Связка 1С и виртуальных АТС (от Мегафон, Zadarma, Новофон ) позволит четко ответить на вопросы: кто звонил, когда звонил, кому звонил, сколько говорил, сколько ждал на линии, что особо актуально при удаленной работе операторов и менеджеров, о чем говорили, результат разговора, обработаны ли пропущенные звонки, прослушать сам разговор, запланировать встречу, звонок, напоминание по результатам разговора. Возможность позвонить клиенту прямо из 1С одной кнопкой, оставить комментарий о звонке, посмотреть по каждому партнеру и клиенту, контакту клиента историю его звонков и взаимоотношений.

9600 руб.

08.05.2020    27108    30    74    

42

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

Модуль для интеграции облачной АТС "Билайн" и конфигураций на платформе 1С v8. Список поддерживаемых конфигураций: УТ 11.2 и выше, УНФ 1.6, КА 2.0, ERP 2.0 и выше. Краткий перечень возможностей: - Подъем карточки клиента при звонке - Журнал звонков - Скачивание и прослушивание записей разговоров - Аналитика по звонкам. Не нужно покупать дорогостоящее оборудование и лицензии. Разговоры не зависят от наличия Интернета, он нужен только для получения данных с АТС в 1С. Подходит для выездных сотрудников, агентов, торговых представителей и т.п.

5100 руб.

17.07.2017    26786    13    23    

14

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

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

2400 руб.

04.05.2018    46316    119    66    

64

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

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

1 стартмани

18.01.2024    840    0    v3132    0    

3

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

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

18.01.2024    1109    slavik27    11    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. iclubber 06.09.22 11:23 Сейчас в теме
Дайте Демо попробовать
2. itcorpru 98 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 98 28.03.23 17:31 Сейчас в теме
(3)
Собственно, никак не пойму в каком формате даты передать.
YYYY-MM-DD HH:MM:SS
5. itcorpru 98 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 98 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 Ответить
Оставьте свое сообщение