Отправка http запросов с Дайджест-аутентификацией из 1С на примере кассового аппарата MG N707TS
Возникала необходимость использовать кассовый аппарат MG N707TS под ubuntu, как известно, COM объекты не поддерживаются. На самом деле не все так сложно!
Расписывать долго не буду, смотрите «Процедура КнопкаСформироватьНажатие» , может кому пригодится.
- Описание
- Подробнее
Описание
Функция ПреобразоватьЗаголовкиВСтруктуру(текЗаловка)
БезКавычек = СтрЗаменить(текЗаловка,"""","");
БезПС = СтрЗаменить(БезКавычек,Символы.ПС,"");
МассивПодстрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(БезПС);
КлючиЗнач = Новый Соответствие;
Для Каждого ЭлМ Из МассивПодстрок Цикл
Масс2 = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ЭлМ,"=");
КлючиЗнач.Вставить(СокрЛП(Масс2[0]),СокрЛП(Масс2[1]));
КонецЦикла;
Возврат КлючиЗнач;
КонецФункции
Функция МД5(ПолСтрок)
фу = Новый ХешированиеДанных(ХешФункция.MD5);
фу.Добавить(ПолСтрок);
с1 = СтрЗаменить(НРег(фу.ХешСумма)," ","");
Возврат с1;
КонецФункции
Функция Рассчитать_response(Логин,Пароль,realm,Метод="GET",УРЛ,nonce,nc,cnonce,qop);
мд5_А1 = МД5(Логин+":"+ realm +":"+Пароль);
мд5_А2 = МД5(Метод+":"+ УРЛ);
мд5_response = МД5(мд5_А1+":"+nonce+":"+nc+":"+cnonce+":"+qop+":"+ мд5_А2);
Возврат мд5_response;
КонецФункции
Процедура КнопкаСформироватьНажатие(Кнопка)
_userName = "1";
_passWord = "0";
НомерОперации = 1;
гч = Новый ГенераторСлучайныхЧисел(ТекущаяДата()-НачалоДня(ТекущаяДата()));
_cnonce = МД5(Строка(гч.СлучайноеЧисло(1,999999))); // можно просто "ABCDEF" без разницы
//GET / POST
_МЕТОД = ЭлементыФормы.ПолеВыбораМетода.Значение;
Если _МЕТОД = "POST" Тогда
//чек
_url = "cgi/chk";
//qty - Необязательное поле. Должно быть цифрой с не более чем тремя знаками после десятичной точки. Если поле пропущено, количество принимается равным 1.
//price- Должно быть цифрой с не более чем двумя знаками после десятичной точки.
//name - Название товара.
//code - Код товара из не более чем 13 цифр
//tax - Необязательное поле. Номер налоговой ставки из таблицы Tax. 0 - без нало-га. При отсутствии поля продажа происходит с первой налоговой ставкой из таблицы налогов.
МассивСтрокОперации = Новый Массив;
МассивСтрокОперации.Добавить(Новый Структура("C",Новый Структура("cm","комментарий")));
МассивСтрокОперации.Добавить(Новый Структура("S",Новый Структура("code,price,name,qty,tax",1,20.50,"товар1",3,1)));
МассивСтрокОперации.Добавить(Новый Структура("D",Новый Структура("prc,all",-7,0))); // скидка 7% этот товар
МассивСтрокОперации.Добавить(Новый Структура("S",Новый Структура("code,price,name,qty,tax",2,40.30,"товар2",0.750,1)));
МассивСтрокОперации.Добавить(Новый Структура("D",Новый Структура("prc,all",-5,1))); // скидка 5% на промежуточный итог
МассивСтрокОперации.Добавить(Новый Структура("D",Новый Структура("sum,all",-10,1)));// скидка 10 денег на весь чек
//сумма по чеку 73.05
// обязательно!!! в отбраном порядке т.к. если наличка первая ругается не неверную сумму
// если в обратном порядке то рассчитывает здачу
МассивСтрокОперации.Добавить(Новый Структура("P",Новый Структура("no,sum",4,50))); // карточкой
//МассивСтрокОперации.Добавить(Новый Структура("P",Новый Структура("no,sum",3, 0)));// кредит
//МассивСтрокОперации.Добавить(Новый Структура("P",Новый Структура("no,sum",2, 0)));// чеком
МассивСтрокОперации.Добавить(Новый Структура("P",Новый Структура("no,sum",1,25))); // наличные
стрОпераця = Новый Структура;
стрОпераця.Вставить("F",МассивСтрокОперации); //продажа
//стрОпераця.Вставить("R",МассивСтрокОперации); //возврат
зпJSON = Новый ЗаписьJSON;
зпJSON.УстановитьСтроку();
ЗаписатьJSON(зпJSON,стрОпераця);
ТелоЗапроса = зпJSON.Закрыть();
Иначе
_url = "cgi/rep/pay";
_url = "cgi/tbl/Oper";
_url = "cgi/chk";
_url = "cgi/state";
КонецЕсли;
СоединениеККМ = Новый HTTPСоединение(ИП_ИмяКассы);
HTTPЗапрос = Новый HTTPЗапрос(_url);
HTTPОтвет = СоединениеККМ.Получить(HTTPЗапрос);
тЗаговокАутентификации = HTTPОтвет.Заголовки.Получить("WWW-Authenticate");
сотвЗаголовковАутентификации= ПреобразоватьЗаголовкиВСтруктуру(тЗаговокАутентификации);
_realm = сотвЗаголовковАутентификации.Получить("Digest realm");
_nonce = сотвЗаголовковАутентификации.Получить("nonce");
_qop = сотвЗаголовковАутентификации.Получить("qop");
_nc = Формат(НомерОперации,"ЧЦ=8; ЧН=; ЧВН=; ЧГ=");
_response= Рассчитать_response(_userName,_passWord,_realm,_МЕТОД,_url,_nonce,_nc,_cnonce,_qop);
тАвторизация = "Digest username="+_userName +","
+ "realm=" +_realm +","
+ "nonce=" +_nonce +","
+ "uri=" +_url +","
+ "algorithm="+сотвЗаголовковАутентификации.Получить("algorithm")+","
+ "cnonce=" +_cnonce +","
+ "nc=" +_nc +","
+ "qop=" +_qop +","
+ "response=" +_response;
ЗаголовокЗапроса = Новый Соответствие;
ЗаголовокЗапроса.Вставить("Authorization",тАвторизация);
HTTPЗапрос2 = Новый HTTPЗапрос(_url,ЗаголовокЗапроса);
Если _МЕТОД = "POST" Тогда
HTTPЗапрос2.УстановитьТелоИзСтроки(ТелоЗапроса);
HTTPОтвет2 = СоединениеККМ.ОтправитьДляОбработки(HTTPЗапрос2);
Иначе
HTTPОтвет2 = СоединениеККМ.Получить(HTTPЗапрос2);
КонецЕсли;
телоОтвета= HTTPОтвет2.ПолучитьТелоКакСтроку();
Сообщить(телоОтвета);
чJSON = Новый ЧтениеJSON;
чJSON.УстановитьСтроку(телоОтвета);
ВостДанные = ПрочитатьJSON(чJSON);
КонецПроцедуры

