Функция СформироватьСтрокуПараметров(МассивПараметровВх) Экспорт
СписокЗначений = Новый СписокЗначений; // Подготовительные действия: создание списка значений
СписокЗначений.ЗагрузитьЗначения(МассивПараметровВх); // Этап 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.АдресРесурса + "], Ответ [" + ТекстОтвета + "], ИОШ:" + ИОШ);
КонецПопытки;
Возврат ОтветСервиса;
КонецФункции
Показать