Каталог решений - Отправка http запросов с Дайджест-аутентификацией из 1С на примере кассового аппарата MG N707TS

Отправка http запросов с Дайджест-аутентификацией из 1С на примере кассового аппарата MG N707TS

Отправка 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);
    
КонецПроцедуры

 

has been added to your cart:
Оформление заказа