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

26.07.21

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

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

Скачать исходный код

Наименование Файл Версия Размер
Пример интеграции (авторизации) с IP телефонией zadarma.com:
.epf 9,39Kb
16
.epf 1 9,39Kb 16 Скачать

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

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

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

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

Платформа 8.3.14.

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

См. также

Интеграция 1С с телефонией и чатами WhatsApp и Telegram

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

Интеграция 1С с телефонией и чатами WhatsApp и Telegram автоматизирует работу оператора со звонками и чатами и добавит вашей 1С элементы CRM системы. Храните всю историю взаимоотношений в 1С, не теряйте звонки, скачивайте, прослушивайте в любое время из карточки клиента или журнала звонков, держите руку на пульсе, используя блок отчетов по звонкам. Интегрируйте вашу 1С и чатами WhatsApp и Telegram, общайтесь с клиентами с единого номера и в одном окне. Теперь чаты с клиентами хранятся в карточке партнера в 1С, а не в личных мобильных ваших менеджеров.

4100 руб.

28.04.2022    14136    11    8    

36

Внешняя компонента для подключения 1С к телефонии Asterisk

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

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

2400 руб.

04.05.2018    45201    117    66    

61

Модуль интеграции с телефонией Новофон для 1С:УНФ 3.0

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

Модуль интеграции с виртуальной телефонией Новофон для решения 1С:Управление нашей фирмой, редакция 3.0.

12000 руб.

26.02.2024    374    0    0    

0

Звонок из 1С через сервис сайта zvonok.com

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

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

1 стартмани

18.01.2024    491    0    v3132    0    

3

Как мы проводили автообзвон должников

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

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

18.01.2024    710    slavik27    11    

5

Простые звонки, модификация расширения для УНФ

Телефония, SIP Адаптация типовых решений 8.3.14 1С:Управление нашей фирмой 1.6 Россия Абонемент ($m)

Модифицированное расширение "Простые звонки" для УНФ (1.6.25 и выше).

1 стартмани

20.09.2022    4822    2    Scroudge    3    

3

Интеграция с программой для звонков Softphone.Pro

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

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

1 стартмани

20.07.2022    3035    1    nikolay.surdo    0    

3

Выгрузка записей разговоров с АТС Билайна

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

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

1 стартмани

01.07.2022    2439    2    s_evgen    0    

0
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. iclubber 06.09.22 11:23 Сейчас в теме
Дайте Демо попробовать
2. itcorpru 238 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 27 27.03.23 22:46 Сейчас в теме
Доброго дня!
Получилось ли получить статистику Задармы?
Собственно, никак не пойму в каком формате даты передать.
4. itcorpru 238 28.03.23 17:31 Сейчас в теме
(3)
Собственно, никак не пойму в каком формате даты передать.
YYYY-MM-DD HH:MM:SS
5. itcorpru 238 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 27 28.03.23 17:36 Сейчас в теме
(5) Т.е. даты передается не в параметре вызова, а в теле JSON?
7. itcorpru 238 28.03.23 17:37 Сейчас в теме
(6) думаю да, в примере в теле
8. Nik-An 27 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 27 29.03.23 11:33 Сейчас в теме
(8) отвечу себе сам

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