Процедура КнопкаВыполнитьНажатие(Кнопка)
//без параметров
Стр=ПолучитьРезультатЗапросаАпиOAuth10a(OAuthConsumerKey,OAuthConsumerSecret,OAuthToken,OAuthSecret,"b2b.cifrotech.ua","/api/rest/products","","");
Сообщить(Стр);
//параметр limit
Стр=ПолучитьРезультатЗапросаАпиOAuth10a(OAuthConsumerKey,OAuthConsumerSecret,OAuthToken,OAuthSecret,"b2b.cifrotech.ua","/api/rest/products","limit=1","");
Сообщить(Стр);
//параметр limit и еще 1
Стр=ПолучитьРезультатЗапросаАпиOAuth10a(OAuthConsumerKey,OAuthConsumerSecret,OAuthToken,OAuthSecret,"b2b.cifrotech.ua","/api/rest/products","limit=1","page=1");
Сообщить(Стр);
//параметр НЕ limit
Стр=ПолучитьРезультатЗапросаАпиOAuth10a(OAuthConsumerKey,OAuthConsumerSecret,OAuthToken,OAuthSecret,"b2b.cifrotech.ua","/api/rest/products","sku=1","");
Сообщить(Стр);
КонецПроцедуры
Функция ПолучитьРезультатЗапросаАпиOAuth10a(oauth_consumer_key,oauth_consumer_secret,oauth_token,oauth_token_secret,Сервер,АдресРесурса,ПараметрЛимит,ОстальныеПараметры)
Параметры="";
Если Не ПустаяСтрока(ПараметрЛимит) Тогда
Параметры=Параметры+"?"+ПараметрЛимит;
Если Не ПустаяСтрока(ОстальныеПараметры) Тогда
Параметры=Параметры+"&"+ОстальныеПараметры;
КонецЕсли;
ИначеЕсли Не ПустаяСтрока(ОстальныеПараметры) Тогда
Параметры=Параметры+"?"+ОстальныеПараметры;
КонецЕсли;
ЗапросHTTP=Новый HTTPЗапрос();
ЗапросHTTP.АдресРесурса=АдресРесурса+Параметры; //
oauth_signature_method="HMAC-SHA1";
oauth_timestamp=Формат(ТекущаяУниверсальнаяДата()-'19700101',"ЧГ=");
oauth_nonce=oauth_timestamp;
oauth_version="1.0";
oauth_signature_base="GET&"
+КодироватьСтроку("http://"+Сервер+АдресРесурса,СпособКодированияСтроки.КодировкаURL)+"&"
+КодироватьСтроку(""
+?(ПустаяСтрока(ПараметрЛимит),"",ПараметрЛимит+"&")
+"oauth_consumer_key="+oauth_consumer_key+"&"
+"oauth_nonce="+oauth_nonce+"&"
+"oauth_signature_method="+oauth_signature_method+"&"
+"oauth_timestamp="+oauth_timestamp+"&"
+"oauth_token="+oauth_token+"&"
+"oauth_version="+oauth_version
+?(ПустаяСтрока(ОстальныеПараметры),"","&"+ОстальныеПараметры)
,СпособКодированияСтроки.КодировкаURL);
hmac_sha1_secret=oauth_consumer_secret+"&"+oauth_token_secret;
oauth_signature=КодироватьСтроку(ПолучитьСигнатуру(hmac_sha1_secret,oauth_signature_base,"SHA1"),СпособКодированияСтроки.КодировкаURL);
ЗапросHTTP.Заголовки.Вставить("Authorization","OAuth "
+"oauth_consumer_key="""+oauth_consumer_key+""", "
+"oauth_token="""+oauth_token+""", "
+"oauth_signature_method="""+oauth_signature_method+""", "
+"oauth_timestamp="""+oauth_timestamp+""", "
+"oauth_nonce="""+oauth_nonce+""", "
+"oauth_version="""+oauth_version+""", "
+"oauth_signature="""+oauth_signature+"""");
HTTP=Новый HTTPСоединение(Сервер);
HTTPОтв=HTTP.Получить(ЗапросHTTP);
Возврат HTTPОтв.ПолучитьТелоКакСтроку();
КонецФункции
//Дальше процедуры, реализующие сигнатуру
Функция ПолучитьСигнатуру(Знач Key, Знач Text,Знач HashFunction="SHA256") Экспорт
//Преобразуем ключ в hex
kKey = "";
Для к = 1 ПО СтрДлина(Key) Цикл
kKey = kKey + ПреобразоватьДесятичнуюСИВHex(КодСимвола(Сред(Key,к,1)));
КонецЦикла;
Result = HMAC(kKey, Text, HashFunction);
ТипДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
ДвоичныеДанныеXDTO = ФабрикаXDTO.Создать(ТипДвоичныеДанные,Result);
ТипДвоичныеДанныеBase64 = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "base64Binary");
Result64= ФабрикаXDTO.Создать(ТипДвоичныеДанныеBase64, ДвоичныеДанныеXDTO.Значение).ЛексическоеЗначение;
Возврат Result64;
КонецФункции
// Функция - HMAC
//
// Параметры: 1
// K - ключ в шестнадцатеричном виде - Строка
// text - текстовое сообщение - Строка
// Hash - Hash function (CRC32, MD5, SHA1, SHA256) - Строка
// Возвращаемое значение:
// строка HMAC - Строка
Функция HMAC(Знач K, Знач text, Знач Hash)
Перем kResult;
Перем К0;
//Если длина ключа K больше размера блока, то к ключу K применяем хэш-функцию
Если СтрДлина(K)>128 Тогда
K = SHA1(K,Hash);
КонецЕсли;
//1 Дополняем ключ K нулевыми байтами до размера блока. Размер блока хэш-функции SHA-1 равен 64 байтам.
StringSHA1 = Лев(K,128);
Для к = СтрДлина(K) По 128 Цикл
StringSHA1 = StringSHA1 + "0";
КонецЦикла;
К0 = StringSHA1;
//2 Выполняем операцию «побитовое исключающее ИЛИ» c константой 0x36.
b = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ("36"));
к = 1;
Пока к < 128 Цикл
a = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ(Сред(StringSHA1,к,2)));
с = XOR(a,b);
StringSHA1 = Лев(StringSHA1,к-1)+с+Прав(StringSHA1, 128-к);
к = к + 2;
КонецЦикла;
StringSHA1 = Лев(StringSHA1,128);
//3 Выполняем склейку исходного сообщения со строкой, полученной на шаге 2.
Для к = 1 По СтрДлина(text) Цикл
StringSHA1 = StringSHA1 + ПреобразоватьДесятичнуюСИВHex(КодСимвола(Сред(text,к,1)));
КонецЦикла;
//4 Применим хэш-функцию SHA-1 к строке, полученной на прошлом шаге.
StringSHA1 = SHA1(StringSHA1,Hash);
kResult = StringSHA1;
//5 Выполним операцию «побитовое исключающее ИЛИ» c константой 0x5c.
StringSHA1 = К0;
b = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ("5c"));
к = 1;
Пока к < 128 Цикл
a = ПреобразоватьЧислоВДвоичнуюСИ(ПреобразоватьHexВДесятичнуюСИ(Сред(StringSHA1,к,2)));
с = XOR(a,b);
StringSHA1 = Лев(StringSHA1,к-1)+с+Прав(StringSHA1, 128-к);
к = к + 2;
КонецЦикла;
StringSHA1 = Лев(StringSHA1,128);
//6 Склейка строки, полученной на шаге 4, со строкой, полученной на шаге 5.
StringSHA1 = StringSHA1 + kResult;
//7 Применим хэш-функцию SHA-1 к строке, полученной на прошлом шаге.
StringSHA1 = SHA1(StringSHA1,Hash);
Возврат StringSHA1;
КонецФункции
Функция SHA1(Знач nString, Hash)
Хеширование = Новый ХешированиеДанных(ХешФункция[Hash]);
ТипhexBinary = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
ДвоичныеДанные = ФабрикаXDTO.Создать(ТипhexBinary,nString);
Хеширование.Добавить(ДвоичныеДанные.Значение);
sign = Хеширование.ХешСумма;
sign = СтрЗаменить(НРЕГ(sign), " ", "");
Возврат СтрЗаменить(НРЕГ(sign), " ", "");
КонецФункции
Функция ПреобразоватьДесятичнуюСИВHex(Знач int)
Если int < 256 Тогда
Возврат Прав("00" + ПреобразоватьДесятичнуюСИВОднобайтовыйHex(int),2);
Иначе
Возврат Прав("0000" + ПреобразоватьДесятичнуюСИВДвухбайтовыйHex(int),4);
КонецЕсли;
КонецФункции
Функция ПреобразоватьHexВДесятичнуюСИ(Знач hex)
simbol = СтрДлина(hex) - 1;
dec = 0;
i = 1;
Пока simbol >= 0 Цикл
simbolHex = Сред(hex, i, 1);
Res = Найти("0123456789abcdef", simbolHex) - 1;
dec = dec + Res * Pow(16, simbol);
simbol = simbol - 1;
i = i + 1;
КонецЦикла;
Возврат dec;
КонецФункции
Функция ПреобразоватьЧислоВДвоичнуюСИ(Знач int, rBit = 8)
b = "";
Для k = 1 По rBit Цикл
m = pow(2, rBit - k);
bit = Цел(int / m);
int = int - m * bit;
b = b + bit;
КонецЦикла;
Возврат b;
КонецФункции
Функция XOR(a, b)
res = 0;
s = 1;
к = Мин(СтрДлина(a), СтрДлина(b));
Пока к > 0 Цикл
a1 = Сред(a,к,1);
b1 = Сред(b,к,1);
res = res + s * ?(a1=b1,0,Макс(a1,b1));
s = s*2;
к = к-1;
КонецЦикла;
Возврат ПреобразоватьДесятичнуюСИВHex(res);
КонецФункции
Функция ПреобразоватьДесятичнуюСИВДвухбайтовыйHex(Знач int)
BinaryData = ПреобразоватьЧислоВДвоичнуюСИ(int, 11);
BinaryData = "110" + Лев(BinaryData,5) + "10" + Прав(BinaryData, 6);
DecimalData = ПолучитьДесятичноеЧислоИзДвоичного(BinaryData);
HexData = ПреобразоватьДесятичнуюСИВОднобайтовыйHex(DecimalData);
Возврат HexData;
КонецФункции
Функция ПолучитьДесятичноеЧислоИзДвоичного(b)
res = 0;
s = 1;
к = СтрДлина(b);
Пока к > 0 Цикл
bit = Сред(b,к,1);
res = res + s * bit;
s = s*2;
к = к-1;
КонецЦикла;
Возврат res;
КонецФункции
Функция ПреобразоватьДесятичнуюСИВОднобайтовыйHex(Знач int)
hex = "";
Пока int <> 0 Цикл
p = int % 16;
hex = Сред("0123456789abcdef", p + 1, 1) + hex;
int = Цел(int / 16);
КонецЦикла;
Возврат hex;
КонецФункции
Показать