:: Visual Foxpro, Foxpro for DOS
Re: Разрешительный режим Честного знака
Евгений Банщиков

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
Alsim
У меня пока проблема с получением токенов. Понял, что на каждой рабочем месте должен быть свой. Как именно его получить очень приблизительно представляю.
Вроде как создать файл с произвольным содержимым, подписать директором ключа и потом это шифрованное содержимое и вложить в тело запроса токена.
Руки пока не дошли, текучкой мешаются.
Токен можно получить двумя способами- через запрос и в лк честного знака .На каждое рабочее место токен один и тот же , если работа идет от одной организации. Для рабочего и тестового контура токены разные.
В настоящее время применяется статический токен , с 15 февраля 2024 будет использоваться динамический токен. то есть у токена будет некий срок актуальности , после которого его нужно будет заново перезапрашивать.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Евгений Банщиков
Токен можно получить двумя способами- через запрос и в лк честного знака
В ЛК и получал. У нас одна организация, три филиала. Проверка токена
curl -X GET "https://markirovka.crpt.ru/api/v4/true-api/cdn/info" -H "Content-Type: application/json" -H "X-API-KEY:0e****d8"
выдаёт "Токен не действителен. Необходимо получить новый токен аутентификации"
На компе ГлавБуха тоже. Повторял генерацию токена - дают тоже.
Делал тест товара - ошибка 7 что на моём рабочем месте, что у ГлавБуха где есть подпись и всё прочее.
**
Через запрос не получается вставить подписанное содержимое. Делал с удалением строк переноса и как есть. Через загрузку в переменную из файлы, фокс посылает в баню )))
***
Продолжаю биться
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
Евгений Банщиков
PavlikPavlikovich
"Долговато" эта процедура идёт. Секунды 2-3. Можно как-то ускорить? И это же не перед каждым сканированием надо делать? Может только при запуске программы? Раз в день так сказать. И брать из этой таблицы сервер. Если вдруг среди дня он окажется недоступен, то прать следующий и так далее.
При первом запуске делаете сканирование , выбираете площадку с наименьшим временем отклика. При каждом выполнении запроса замеряете время , если время запроса превысит заданный вами некий порог (например 3 секунды) , запускаете процедуру выбора площадки по новой.

Спасибо! Отличная идея. Сейчас уже сделал выбор сервера перед включением программы. Надо дописать про вычисление времени запроса марки и перезапуска процедуры вычисления сервера.
P.S. мне вообще кажется что у меня от силы будет сервера 2. Т.к. время отклика как мне кажется зависит от "удалённости" сервера. А не его загрузки. Но хотя всё только начинается. Может скоро дойдёт до того что сервера будут перегружаться.


Alsim
Не прокатил полученный токен в каобинете ЧЗ, та же ошибка "errorCode": 7
Пробовал на компе с подключенным ключом, где в ЧЗ вход работает.
Сгенерил файл подписанный по инструкции
olegon.ru
не прокатывает получение.
Пока у меня эта главная проблема. Разбираюсь.

Я просто уверен что вы лучше меня соображаете в этом. Но вдруг.
У меня была ошибка 7. Пока я не подготовил код маркировки перед отправкой.
*Для передачи кода маркировки,его нужно немножно подготовить
m.kod_markir=SUBSTR(m.kod_markir,1,31)+CHR(29)+SUBSTR(m.kod_markir,32,6)+CHR(29)+SUBSTR(m.kod_markir,38) && . обязательно передавать символ разделитель GS (ASC 29)


Я хочу вести логирование ответов проверки марок. Не знаю зачем. Пусть будет
Хочу писать в таблицу. Подскажите кто знает. Строки ответа главные "reqId" и "reqTimestamp" (ИД запроса и время запроса) имеют всегда одну длину символов?
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
У вас немного неправильно выдираются данные. Ну или не так как я хочу. У символьных значений выдирается с кавычками. Я у себя переделал, что бы их не было.
Покажу на примере одной строки
m.realizable = Strextract(m.cText,["realizable":],[,],1) && ваша
m.realizable = Strextract(m.cText,["realizable":"],[",],1) && моя

Соответственно это только у символьных данных. Числовые и логические у вас сделаны верно.



Исправлено 1 раз(а). Последнее : PavlikPavlikovich, 11.11.24 19:04
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
PavlikPavlikovich
У меня была ошибка 7. Пока я не подготовил код маркировки перед отправкой.
*Для передачи кода маркировки,его нужно немножно подготовить
m.kod_markir=SUBSTR(m.kod_markir,1,31)+CHR(29)+SUBSTR(m.kod_markir,32,6)+CHR(29)+SUBSTR(m.kod_markir,38) && . обязательно передавать символ разделитель GS (ASC 29)
Этот вариант обработки кода у меня используется для вставки кодмарки в файл-чек.
Только в Вашем варианте не учитывается, что 93 может располагаться не только на 31 позиции.
На других товарах как на пиве, газировке, молочке и воде она может быть и на 24 и 38 позиции.
А может, как у нас на платках совсем не быть.
***ищу позицию 93 справа, так как "93" может быть в кодмарке не один раз
m.in93 = Rat("93",m.MatrixCode)
IF m.in93 > 0
*m.MatrixCode = Left(m.MatrixCode , m.in93-1) &&так отправляем запрос в чз
m.MatrixCode = Left(m.MatrixCode, m.in93-1) + Chr(29) + Substr(m.MatrixCode, m.in93, 6) + Chr(29) + Substr(m.MatrixCode, m.in93+6) &&так вставляем в файлчек
ENDIF
***
У меня запрос в ЧЗ с GS возвращает 400
{"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
потому режу до 93 кода. Пока буду делать так, пока не разберусь с ошибкой 7
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
PavlikPavlikovich
Я хочу вести логирование ответов проверки марок. Не знаю зачем. Пусть будет
Тоже буду писать логи, только скорее всего буду просто вставлять тело ответа json как есть, лишь бы влезло ну на крайняк мемо поле сделаю.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Всем привет ! Спасибо за тему первопроходцам !

У меня пока общие вопросы :
1) Эта проверка универсальная, и в итоге заменит проверку КМ в самой кассе ?
2) Это будет работать без сертификатов и всяких там крипто на компе с кассой ?


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Евгений Банщиков

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
Alsim
У меня запрос в ЧЗ с GS возвращает 400
{"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
Если вы через curl работаете , то такая ошибка возникает , если не задвоили кавычки в json строке с данными марки
Выше я приводил пример
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Alsim
PavlikPavlikovich
У меня была ошибка 7. Пока я не подготовил код маркировки перед отправкой.
*Для передачи кода маркировки,его нужно немножно подготовить
m.kod_markir=SUBSTR(m.kod_markir,1,31)+CHR(29)+SUBSTR(m.kod_markir,32,6)+CHR(29)+SUBSTR(m.kod_markir,38) && . обязательно передавать символ разделитель GS (ASC 29)
Этот вариант обработки кода у меня используется для вставки кодмарки в файл-чек.
Только в Вашем варианте не учитывается, что 93 может располагаться не только на 31 позиции.
На других товарах как на пиве, газировке, молочке и воде она может быть и на 24 и 38 позиции.
А может, как у нас на платках совсем не быть.
***ищу позицию 93 справа, так как "93" может быть в кодмарке не один раз
m.in93 = Rat("93",m.MatrixCode)
IF m.in93 > 0
*m.MatrixCode = Left(m.MatrixCode , m.in93-1) &&так отправляем запрос в чз
m.MatrixCode = Left(m.MatrixCode, m.in93-1) + Chr(29) + Substr(m.MatrixCode, m.in93, 6) + Chr(29) + Substr(m.MatrixCode, m.in93+6) &&так вставляем в файлчек
ENDIF
***
У меня запрос в ЧЗ с GS возвращает 400
{"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
потому режу до 93 кода. Пока буду делать так, пока не разберусь с ошибкой 7

Думаю не нужно резать марку.
Понял так, что CHR(29) нужны в строке марки только для проверки средствами ККМ (например перед beginMarkingCodeValidation()),
а для проверки в ЧЗ их нужно заменять (экранировать) символами \u001d
то есть можно говорить как бы о трех состояниях марки :

m.lcMark = Strtran(m.lcMark, Chr(29), []) && Очищенная марка без chr(29), но с криптохвостом !
m.lcMark_KKM = Left(m.lcMark, 31) + Chr(29) + Substr(m.lcMark, 32, 6) + Chr(29) + Substr(m.lcMark, 38) && Марка для проверки средствами драйвера - такой расклад подходит для многих групп товаров, но не для всех !
m.lcMark_CHZ = Strtran(m.lcMark_KKM, Chr(29), [\u001d]) && Марка для проверки в ЧЗ, chr(29) экранируется символами \u001d - обсуждение нашел тут infostart.ru


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
я через "WinHttp.WinHttpRequest.5.1" работаю.
У меня случай не совсем Ваш.
Я не с кассами работаю, а создаю для ККТ ШТРИХ-ON-LINE файл чеки, которая программа Штрихопечать подхватывает, отправляет на печать, OFD и так далее.
Потому и формат кода отличается.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Равиль
Думаю не нужно резать марку.
Left(m.lcMark, 31) этот вариант в своё время меня спас! Спасибо, Равиль! Только работало на мороженом, а на воде или пиве налетел и сделал как выше, с поиском 93 справа.
***
[\u001d] - не жрёт ЧЗ такое! ;) Только обрезанное до 93 кода. А ошибка 7 из-за непоняток с токеном думаю.
***
Сегодня утром снова сделал через запрос
curl -X POST "https://markirovka.crpt.ru/api/v4/true-api/auth/permissive-access" -d "{""data"":""MIINww****
ответ тот же.
{"error_message":"Токен не действителен. Необходимо получить новый токен аутентификации"}
Текст получал подписывая произвольный текст "1" директором ну и так далее с убиранием переносов.
Видимо у нас в кабинете что-то не добавлено, пока отложил, пишу рабочий вариант для тестов.
А с утра ищу по форумам, пока башка не опухнет.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Равиль
Всем привет ! Спасибо за тему первопроходцам !
У меня пока общие вопросы :
1) Эта проверка универсальная, и в итоге заменит проверку КМ в самой кассе ?
2) Это будет работать без сертификатов и всяких там крипто на компе с кассой ?

по п. 1) - увы, пишут что надо делать обе проверки ... хотя надо бы проверить


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Евгений Банщиков

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
Равиль
У меня пока общие вопросы :
1) Эта проверка универсальная, и в итоге заменит проверку КМ в самой кассе ?
Возможно в будущем полностью заменит , но сейчас обе проверки пока что необходимы

Равиль
2) Это будет работать без сертификатов и всяких там крипто на компе с кассой ?
На данный момент на кассе ничего , кроме строки с токеном не нужно.
С марта 2025 все будет сложнее
Цитата:
Срок действия токена ограничен датой 1 марта 2025 года. К этой дате требуется перейти на
целевую схему получения токена с помощью УКЭП, которая предполагает короткий срок
жизни (как сейчас работает jwt-токен ГИС МТ в TrueApi)
Либо на кассе , либо где на выделом компьютере нужно будет запускать периодически ПО (раз в несколько часов) , которое будет генерить токен и передавать его далее модулю проверки .
Там уже нужно наличие флешки с ЭЦП и крипто ПО.



Исправлено 1 раз(а). Последнее : Евгений Банщиков, 12.11.24 11:03
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Равиль
а для проверки в ЧЗ их нужно заменять (экранировать) символами \u001d
то есть можно говорить как бы о трех состояниях марки :
ЗАРАБОТАЛО БЛИН!:friends:Спасибо, Равиль!🍷
Снова выручил!:bodr:
фуф...

ps только m.lcMark_KKM = Left(m.lcMark, 31) + Chr(29) ****** доработал, вычисляю позицию 93 справа
проверил на чем-то у него не 31 а 26 позиция, налетал в своё время
m.in93 = Rat("93",m.MatrixCode)
If m.in93 > 0
m.lcMark = m.MatrixCode
m.lcMark = Strtran(m.lcMark, Chr(29), []) && Очищенная марка без chr(29), но с криптохвостом !
m.lcMark_KKM = Left(m.lcMark , m.in93-1) + Chr(29) + Substr(m.lcMark , m.in93, 6) + Chr(29) + Substr(m.lcMark , m.in93+6)
m.lcMark_CHZ = Strtran(m.lcMark_KKM, Chr(29), [\u001d]) && Марка для проверки в ЧЗ, chr(29) экранируется символами \u001d - обсуждение нашел тут infostart.ru
lcCode = m.lcMark_CHZ
* m.MatrixCode = Left(m.MatrixCode , m.in93-1) &&ошибка 7
Else
***платки без 93 кода
lcCode = m.MatrixCode
Endif



Исправлено 1 раз(а). Последнее : Alsim, 12.11.24 14:44
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Alsim
...
ps только m.lcMark_KKM = Left(m.lcMark, 31) + Chr(29) ****** доработал, вычисляю позицию 93 справа
проверил на чем-то у него не 31 а 26 позиция, налетал в своё время
m.in93 = Rat("93",m.MatrixCode)
If m.in93 > 0
m.lcMark = m.MatrixCode
m.lcMark = Strtran(m.lcMark, Chr(29), []) && Очищенная марка без chr(29), но с криптохвостом !
m.lcMark_KKM = Left(m.lcMark , m.in93-1) + Chr(29) + Substr(m.lcMark , m.in93, 6) + Chr(29) + Substr(m.lcMark , m.in93+6)
m.lcMark_CHZ = Strtran(m.lcMark_KKM, Chr(29), [\u001d]) && Марка для проверки в ЧЗ, chr(29) экранируется символами \u001d - обсуждение нашел тут infostart.ru
lcCode = m.lcMark_CHZ
* m.MatrixCode = Left(m.MatrixCode , m.in93-1) &&ошибка 7
Else
***платки без 93 кода
lcCode = m.MatrixCode
Endif

Александр! тебе тоже спасибо за наводку про m.in93


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
Подскажите!
А если код не прошёл проверку. Товар не продаём. Убираем из чека.
А если нет интернета? То просто не передаём эти теги в чек? Или нужно что-то другое передавать?

Вот нашёл по штриху. На другом языке.
FR.TagNumber=1262; //«идентификатор ФОИВ»
FR.TagType=7; //строка
FR.TagValueStr="030"; //Министерство промышленности и торговли Российской Федерации
FR.FNSendTagOperation();

FR.TagNumber=1263; //«дата документа основания»
FR.TagType=7; //строка
FR.TagValueStr="21.11.2023";
FR.FNSendTagOperation();

FR.TagNumber=1264; //«номер документа основания»
FR.TagType=7; //строка
FR.TagValueStr="1944";
FR.FNSendTagOperation();

FR.TagNumber=1265; //«значение отраслевого реквизита
FR.TagType=7; //строка
FR.TagValueStr="UUID=2ce10bdb-6510-4d37-be04-dd473b98c728&Time=1692691702065"
FR.FNSendTagOperation();
Ratings: 0 negative/2 positive
Re: Разрешительный режим Честного знака
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Да, у меня тоже получилось с криптохвостом !
При этом у многих товарных групп разделителями являются не 93, а 92, 91
If Not Directory("ChZn")
Md "ChZn"
Endif
lcApi = "Аутентификационный токен участника оборота"
*!* curl -X POST "<url контура>/api/v4/true-api/codes/check"
*!* -H "Content-Type: application/json"
*!* -H "X-API-KEY: <Аутентификационный токен участника оборота>"
*!* -d "{"codes":["string"]}"
lcUrl = "https://cdn02.crpt.ru" && для теста без перебора просто беру площадку №2
lcUrl = lcUrl + "/api/v4/true-api/codes/check"
*!* Реальный ботинок !! с криптохвостом
lcMark = "010467004269042021gYqC5f?(j6DBk91806992w/jiHfUWJC8gXvAm8tgIm9hoELbZmL/SqSbdgbdKJShT8aE7BhIRhGmtZq9e0dk1Gti16LHlCmTt+DOahqbyFA=="
Do Case
Case [\u001d]$m.lcMark
lcMark_CHZ = m.lcMark
Case Chr(29)$m.lcMark
lcMark_CHZ = Strtran(m.lcMark, Chr(29), [\u001d])
Case [91]$m.lcMark Or [92]$m.lcMark Or [93]$m.lcMark &&
lcMark_CHZ = Strtran(Strtran(Strtran(m.lcMark, [91], [\u001d91]), [92], [\u001d92]), [93], [\u001d93])
Otherwise
lcMark_CHZ = m.lcMark
Endcase
*!* m.in93 = Rat("93",m.MatrixCode)
*!* If m.in93 > 0
*!* m.lcMark = m.MatrixCode
*!* m.lcMark = Strtran(m.lcMark, Chr(29), [])
*!* m.lcMark_KKM = Left(m.lcMark , m.in93-1) + Chr(29) + Substr(m.lcMark , m.in93, 6) + Chr(29) + Substr(m.lcMark , m.in93+6)
*!* m.lcMark_CHZ = Strtran(m.lcMark_KKM, Chr(29), [\u001d])
*!* ENDIF
lcCode = m.lcMark_CHZ
http = Createobject("WinHttp.WinHttpRequest.5.1")
Timeout = 20000
http.SetTimeouts(m.Timeout, m.Timeout, m.Timeout, m.Timeout)
http.Open("POST", m.lcUrl)
http.setRequestHeader("Accept", "application/json")
http.SetRequestHeader("Content-Type", "application/json")
http.SetRequestHeader("X-API-KEY", m.lcApi)
postBody = '{"codes":["' + lcCode + '"]}'
Clear
http.Send(m.postBody)
? m.lcCode
? http.Status
? http.ResponseText
If http.Status <> 200
=Messagebox(Str(http.Status),64,"Ошибка запроса")
Endif
Strtofile(http.ResponseText,"ChZn\codes_check" + Sys(2015) + ".json")


------------------
Тяжело согнать курсором муху с монитора ...




Исправлено 1 раз(а). Последнее : Равиль, 14.11.24 06:52
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Равиль

Сообщений: 6692
Откуда: Уфа
Дата регистрации: 01.08.2003
Правда тут очень грубое допущение, что 91, 92 или 93 не могут быть еще где-то, например в криптохвосте ..

Равиль

Case [91]$m.lcMark Or [92]$m.lcMark Or [93]$m.lcMark
lcMark_CHZ = Strtran(Strtran(Strtran(m.lcMark, [91], [\u001d91]), [92], [\u001d92]), [93], [\u001d93])



------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Равиль
Да, у меня тоже получилось с криптохвостом !
При этом у многих товарных групп разделителями являются не 93, а 92, 91
Отлично! Надо будет попробовать на наших платках. Один продали позавчера, прошёл как [М-].
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
Всем доброе утро!
Столкнулся с проблемой. При запуске программы на windows 7 возникает ошибка при отправке send()
"Ошибка поддержки безопасных каналов."

Нашёл совет отключить проверку SSL на уровне winhttp
WinHttp=CREATEOBJECT("MSScriptControl.ScriptControl")
WinHttp.language="javascript"
WinHttp.AddObject("WinHttp",WinHttp)
WinHttp.Eval('WinHttp.Option(9)=0') && тут выдаёт ошибку. Синтаксис не верный что-ли? Я переделывал от 1С.
WinHttp.Eval('WinHttp.Option(2)=1251')
WinHttp.Eval('WinHttp.Option(4)=13056') &&;//intSslErrorIgnoreFlags
WinHttp.Eval('WinHttp.Option(6)=.T.') &&;//blnEnableRedirects
WinHttp.Eval('WinHttp.Option(12)=.T.') &&;//blnEnableHttpsToHttpRedirects
Ratings: 0 negative/2 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 (Гостей: 20)

© 2000-2025 Fox Club 
Яндекс.Метрика