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

Сообщений: 190
Дата регистрации: 21.07.2010
Здравствуйте!
Не кидайтесь камнями за вопрос. Я не программист. Делаю что могу своими силами. Чисто для себя. У меня всего одна торговая точка. Мне очень тягостно даётся вся эта канитель с маркировкой. Вроде думаешь всё, работаем. А тут они опять что-то придумали. Вот придумали разрешительный режим.
Я понял смысл. Но вот как реализовать я не знаю. Может кто поделиться кодом?

Вот на что хватило меня. Но это во первых не работает. Сервер отвечает 200. А во вторых мы же должны запросить сервера проверки. Найти наименее загруженный. Ну и обработку ошибок.

Вот подсобрал ещё информацию:



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

Сообщений: 4560
Откуда: Москва
Дата регистрации: 11.11.2008
PavlikPavlikovich
Вот на что хватило меня. Но это во первых не работает. Сервер отвечает 200.
Вы же не сами этот код выдумали, а на основе чего-то.
Откуда взялись все эти заголовки, почему возник вопрос GET или POST и т.д и т.п.?
Наверно, у вас должно быть описание интерфейса работы с ЧЗ.

Для меня, например, слова "Честный знак" значат не больше, чем "Дело табак".
И не думаю, что я здесь один такой.

PavlikPavlikovich
Вот подсобрал ещё информацию
Не вижу здесь ничего, касающегося запроса к markirovka.crpt.ru
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
PavlikPavlikovich
Может кто поделиться кодом?
У меня пока до этого места дошло.
Примеры брал из методички честного знака.
Пробовал подсовывать реальные коды маркировки, которые мы уже отправили в ЧЗ и не отправили, ответ примерно одинаковый.
Код фискальника убрал из запроса, разницы нет.
Осталось сообразить что из ответов куда вставить.




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

Сообщений: 190
Дата регистрации: 21.07.2010
akvvohinc
PavlikPavlikovich
Вот на что хватило меня. Но это во первых не работает. Сервер отвечает 200.
Вы же не сами этот код выдумали, а на основе чего-то.
Откуда взялись все эти заголовки, почему возник вопрос GET или POST и т.д и т.п.?
Наверно, у вас должно быть описание интерфейса работы с ЧЗ.

Для меня, например, слова "Честный знак" значат не больше, чем "Дело табак".
И не думаю, что я здесь один такой.

Я собрал это из трёх кусков. Где -то было get где-то post. Но я так понимаю что GET правильнее. т.к. нам нужно получить от сервера значение тега 1265 (UUID=&Time=) которое мы потом отправим в ККМ.

akvvohinc
PavlikPavlikovich
Вот подсобрал ещё информацию
Не вижу здесь ничего, касающегося запроса к markirovka.crpt.ru
Для меня "Разрешительный режим Честного знака" это два этапа.
1) Запрос в честный знак
2) Передача данных в ККМ
Может вы и правы. Что это уже другая тема.

akvvohinc
У меня пока до этого места дошло.
Примеры брал из методички честного знака.
Пробовал подсовывать реальные коды маркировки, которые мы уже отправили в ЧЗ и не отправили, ответ примерно одинаковый.
Код фискальника убрал из запроса, разницы нет.
Осталось сообразить что из ответов куда вставить.
А что у вас проходит так проверка?
Вы пихаете код маркировки без криптохвоста. Я могу ошибаться, но надо пихать с ним. Так еще и надо в код маркировки пихать два разделителя "\u001d"
Вот исходный код:
010460620309799921yEM1!K9800526900093CbP6240FA083231.05
вот что надо посылать в запросе:
010460620309799921yEM1!K9\u001d8005269000\u001d93CbP6\u001d240FA083231.05

Еще по хорошему как я и писал выше, нужно запрашивать у них список серверов с временем отклика и обращаться к наиболее "быстрому" У вас же вшит один сервер. А вдруг с ним что-то не так.
Причём как я понимаю надо обыграть момент того что если нет интернета. Сервера не доступны. Тогда уже в ККМ надо пихать не время проверки, а информацию что проверить не удалось.
Как я и писал выше. Нам нужно получить от сервера только одну строку с идентификатором запроса и временем этого заппроса.
UUID=&Time=
Пример ответа: UUID=b99278f8-fbef-42ff-9159-d1c743760f36&Time=1721227186096

Вот ещё номера ошибок проверки кодов маркировки раздобыл:
DO CASE
CASE errorCode= "1"
м.ERROR = "Ошибка валидации КМ в ГИС МТ."
CASE errorCode= "2"
м.ERROR ="КМ не содержит GTIN."
CASE errorCode= "3"
м.ERROR ="КМ не содержит серийный номер."
CASE errorCode= "4"
м.ERROR = "КМ содержит недопустимые символы."
CASE errorCode= "5"
м.ERROR ="Ошибка верификации крипто-подписи КМ в ГИС МТ (формат крипто-подписи не соответствует типу КМ)."
CASE errorCode= "6"
ТекстОшибки = "Ошибка верификации крипто-подписи КМ в ГИС МТ (крипто-подпись не валидная)."
CASE errorCode= "7"
м.ERROR = "Ошибка верификации крипто-подписи КМ в ГИС МТ (крипто-ключ не валиден)."
CASE errorCode= "8"
м.ERROR = "КМ не прошел верификацию в стране эмитента/ошибка разбора КМ."
CASE errorCode= "9"
м.ERROR ="Найденные AI в КМ не поддерживаются."
CASE errorCode= "10"
м.ERROR = "КМ не найден в ГИС МТ."
ELSE
"Неклассифицированная ошибка отправки запроса по КМ в ГИС МТ: "+КодОшибки+"."
ENDCASE



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

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
PavlikPavlikovich
А что у вас проходит так проверка?
Вы пихаете код маркировки без криптохвоста.
В примере пихаю код из примера.
Также вставлял данные из таблицы, где хранятся коды маркировок и помечаются проданными.
Вставляю как есть, то есть отсканированный. Тогда ответ 200 с текстом.
Пробовал вставлять "доработанный" марккод, как вставляется в файл-чек, который отправляет в ОФД и ЧЗ программа Штрихопечать. На чеке выходит [М+].
В запросе получаю ошибку.
На этом пока эксперименты временно закончил. Надо попробовать отправлять кодмарку именно воды и разобрать что он там отвечает про на найден в базе и тд.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
PavlikPavlikovich
Вот ещё номера ошибок проверки кодов маркировки раздобыл:
Очень полезно, у меня видимо ошибка 10 везде.
Как получить список серверов и время отклика есть в методичке.
Что-то новое нарою, поделюсь обязательно



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

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
Alsim
PavlikPavlikovich
А что у вас проходит так проверка?
Вы пихаете код маркировки без криптохвоста.
В примере пихаю код из примера.
Также вставлял данные из таблицы, где хранятся коды маркировок и помечаются проданными.
Вставляю как есть, то есть отсканированный. Тогда ответ 200 с текстом.
Пробовал вставлять "доработанный" марккод, как вставляется в файл-чек, который отправляет в ОФД и ЧЗ программа Штрихопечать. На чеке выходит [М+].
В запросе получаю ошибку.
На этом пока эксперименты временно закончил. Надо попробовать отправлять кодмарку именно воды и разобрать что он там отвечает про на найден в базе и тд.
В марке нужно экранировать символы '\' '"' '/' . Так же обязательно передавать символ разделитель GS (ASC 29) и он так же должен быть экранирован.
m.cRight=Strtran(m.cRight,'\','\u005C')
m.cRight=Strtran(m.cRight,'"','\u0022')
m.cRight=Strtran(m.cRight,'/','\u002F')
m.cRight=Strtran(m.cRight,Chr(29),'\u001d')

В самой команде нужно экранировать символ кавычек , задваивая его :
-d "{""codes"":[""010462930887704421DzkcYt2\u001d8005177000\u001d93dGVz""]}"
Вот рабочий пример комаднды через curl.exe:
C:\curl.exe --keepalive-time 500 --keepalive --insecure --stderr "C:\CRPT_error.txt" --output "C:\CRPT_responce.txt" --show-error --silent -X POST "https://cdn01.crpt.ru:443/api/v4/true-api/codes/check" -H "Content-Type: application/json" -H "X-API-KEY: *******-ee53-49e7-a8ae-a2ba17456a2e" -d "{""codes"":[""0104607031581605215t>3TJBi:aIBg\u001d93UytE""]}"
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
Евгений Банщиков
В самой команде нужно экранировать символ кавычек , задваивая его :
-d "{""codes"":[""010462930887704421DzkcYt2\u001d8005177000\u001d93dGVz""]}"


У меня вопрос. Мы же потом будем пихать код маркировки через переменную. Тогда же ничего задваивать не надо? Я сделал вот так:
m.fiscalDriveNumber="" && номер фискального регистратора ККМ
m.kod_markir="01000565671rnpBaO56546&tMk91EE069256564VlBZImXP/XSeai5656DYBdswbyig+565464J5KI0=" && Код маркировки товара с криптохвостом (код маркировкивыдуман)
IF m.fiscalDriveNumber=""
postBody = '{"codes":["'+m.kod_markir+'"]}'
ELSE
postBody = '{"codes":["'+m.kod_markir+'"],"fiscalDriveNumber": "'+m.fiscalDriveNumber+'"}'
ENDIF


Евгений Банщиков
В марке нужно экранировать символы '\' '"' '/' . Так же обязательно передавать символ разделитель GS (ASC 29) и он так же должен быть экранирован.
m.cRight=Strtran(m.cRight,'\','\u005C')
m.cRight=Strtran(m.cRight,'"','\u0022')
m.cRight=Strtran(m.cRight,'/','\u002F')
m.cRight=Strtran(m.cRight,Chr(29),'\u001d')

Спасибо, добавил в код. Что-то у меня пока тест не проходит. Выдаёт ошибку 8 -КМ не прошел верификацию в стране эмитента/ошибка разбора КМ.
Предполагаю это потому что я сканировал код сканером в блокнот и вставил сюда. Разделители потерялись видимо.

ПОДСКАЖИТЕ
Я запихал Json ответ в строку. И пытаюсь её так разобрать. Я в правильном направлении?
m.ТелоОтветаJSON=http.ResponseText() && получаем тело ответа JSON как строку
m.errorCode = VAL(STREXTRACT(m.ТелоОтветаJSON, '"errorCode":', ','))

Я нашёл пример для 1с
Тут они из строки выдирают параметры. В Фоксе аналог этой функции STREXTRACT() ?
Валидность = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"valid");
Наличие = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"found");
Продан = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"sold");
Нанесен = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"utilised");
СераяЗона = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"grayZone");
БлокПродажи = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"isBlocked");
Принадлежность = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"isOwner");

Евгений Банщиков
Вот рабочий пример комаднды через curl.exe:
C:\curl.exe --keepalive-time 500 --keepalive --insecure --stderr "C:\CRPT_error.txt" --output "C:\CRPT_responce.txt" --show-error --silent -X POST "https://cdn01.crpt.ru:443/api/v4/true-api/codes/check" -H "Content-Type: application/json" -H "X-API-KEY: *******-ee53-49e7-a8ae-a2ba17456a2e" -d "{""codes"":[""0104607031581605215t>3TJBi:aIBg\u001d93UytE""]}"
При всём уважении. Не ругайте. Я не понимаю что это такое curl. Не программист я. Это аналог всего того что я сейчас пытаюсь сделать?

Пытаюсь что-то слепить из кусков. Как удачный тест будет. Выложу



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

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
PavlikPavlikovich
У меня вопрос. Мы же потом будем пихать код маркировки через переменную. Тогда же ничего задваивать не надо? Я сделал вот так:
Если вы делаете запрос через WinHttp.WinHttpRequest , то наверно задваивать не надо. Я использую утилиту curl.exe , там это делать необходимо.

PavlikPavlikovich
Спасибо, добавил в код. Что-то у меня пока тест не проходит. Выдаёт ошибку 8 -КМ не прошел верификацию в стране эмитента/ошибка разбора КМ.
Предполагаю это потому что я сканировал код сканером в блокнот и вставил сюда. Разделители потерялись видимо.
Да ,cкорее всего нет разделителей GS

PavlikPavlikovich
ПОДСКАЖИТЕ
Я запихал Json ответ в строку. И пытаюсь её так разобрать. Я в правильном направлении?
m.ТелоОтветаJSON=http.ResponseText() && получаем тело ответа JSON как строку
m.errorCode = VAL(STREXTRACT(m.ТелоОтветаJSON, '"errorCode":', ','))
До анализа Json с данными надо проверить на интернет ощибки (типа Failed to connect или Connection timed out')
Примерно так
If '</error>'$Lower(This.cResponce)
m.cMessage=Strconv(Strextract(This.cResponce,'<error>','</error>'),11)
m.cText='ЦРПТ сообщает об ошибке :'+Chr(13)+m.cMessage
Endif
PavlikPavlikovich
Я нашёл пример для 1с
Тут они из строки выдирают параметры. В Фоксе аналог этой функции STREXTRACT() ?
Валидность = ПолучитьИзСтрокиJSON(m.ТелоОтветаJSON,"valid");
Вам в ответ приходит строка в формате Json. Ее нужно распарсить. В винде нет встроеного парсера json , в VFP тоже поэтому или ищите стороний парсер или пишите свой , через strextract или getwornum , это не сложно.
С начала анализируйте своиство ErrorCode. Если оно больше 0 , то берете текст ошибки из свойства Message
Если ErrorCode=0 , анализируйте данные дальше согласно методички ЧЗ
Примерно так
If !.Valid
This.Respons_Error='Структура Кода Марки не валидная'
Else
If !.verified
This.Respons_Error='Проверка крипто-подписи марки завершилась ошибкой'
Else
If !.Found
This.Respons_Error='Код Марки не наиден в системе'
Else
This.ReqId=Alltrim(.ReqId)
This.ReqTime=Alltrim(Transform(.reqTimestamp))
If !.realizable And !(.groupIds=3 And .grayZone)
If Type('.eliminationState')='N' And !Empty(.eliminationState)
Do Case
Case .eliminationState=1
This.Respons_Error='товар выведен из оборота по причинам «по образцам» или «дистанционная продажа»'
Case .eliminationState=2
This.Respons_Error='товар выведен из оборота по причинам «для собственных нужд» или «для производственных целей»'
Otherwise
This.Respons_Error='товар выведен из оборота'
Endcase
Else
If .sold
This.Respons_Error='товар выведен из оборота'
Else
This.Respons_Error='Статус товара отличен от статуса "В обороте"'
Endif
Endif
Else
If .isBlocked
This.Respons_Error='продажа Марки заблокирована '+.ogvs
Else
If .grayZone And !(.groupIds=3 And !.realizable)
This.Respons_Error='Товар находится в "СЕРОЙ ЗОНЕ" '
Else
If Pemstatus(This.oMarkInfo,'expireDate',5) And This.TransDate(.expireDate)<=Date()
This.Respons_Error='У товара истек срок годности ('+Transform(This.TransDate(.expireDate))+')'
Else
This.Respons_Ok=.T.
Endif
Endif
Endif
Endif
Endif
Endif
Endif
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
andrewk

Сообщений: 221
Откуда: Красноярск
Дата регистрации: 15.05.2005
Я слабо представляю кто такой «Честный знак». Но, пробежавшись по теме, замечу:

PavlikPavlikovich
Вот ещё номера ошибок проверки кодов маркировки раздобыл
Здесь во всех 'CASE errorCode =' знак '=' лучше б заменить на '=='. Потому что при Set Exact OFF на errorCode="10" ответ получите неверный.

Евгений Банщиков
В винде нет встроеного парсера json , в VFP тоже поэтому или ищите стороний парсер или пишите свой
Я давно использую nfJson. Он на чистом VFP. Всякое делает, но для данной задачи нужен только nfJsonRead.prg – он парсит JSON-строку или файл в Empty-объект либо массив. Я в нём правил маленько, если интересно могу скинуть.

Есть JSONFox. С ним не разбирался. Есть вариант на VFP, а есть готовая dll на C# (автор пишет, что работает быстрее).
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Евгений Банщиков
С начала анализируйте своиство ErrorCode. Если оно больше 0 , то берете текст ошибки из свойства Message
Спасибо, стало немного легче. Разобрал ответ по полочкам, анализирую ответы.
***
Если отсылаю код платка, он возвращает код (там нет кода 93)
"errorCode":8
"message":"cannot parse code. AiGroupNotSupportedException: AI group [H] is not supported"
но он и по фотке в честном знаке как серый определяется, фиг с ним их у нас 15штук и вряд ли кто купит.
***
С водой, пивом, газировкой получаю "errorCode":10
"message": "cannot find code [04601501261103******938++l] in db"
причем без разницы, продан и передан с чеком в ЧЗ этот товар или нет.
онлайн проверку такой код не проходит, "неизвестный кодмарк"
обрабатывал кодом Евгения, разницы нет. Тот же результат как от чистого "напиканого".
***
если отправляю код так, как он вставляется в чек и благополучно отправляется в ОФД
04601501261103****93ms/a
то есть перед 93 и в конце вставляю GS код
то ошибка {"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
причем этот код прекрасно превращается в штрихкод и проверяется программой честный знак на телефоне.
***
Интересно, может это происходит от полученного Токена? Типа он не от нашей базы?
***
***
Помню, что когда мы ещё не вставляли кодмарки в чек и выводили товар вручную из оборота, делал файлик для честного знака, он его тоже не принимал ни целиком и с GS кодами,
выкрутился тогда отрезая строку кода до 93.
***
парсю ответ пока так, может пригодится кому.
ps там если errorCode = 8, то встаёт в хвост ответа и за ним нет "," то к коду "}]" добавляется, обрабатываю этот случай.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
На сладкое, чтоб успокоиться на сегодня отрезал строку до кода 93.
m.in93 = Rat("93",m.MatrixCode)
IF m.in93 > 0
m.MatrixCode = Left(m.MatrixCode , m.in93-1)
ENDIF
(именно так мы выводили товар из Честного Знака в своё время через кабинет).
Получаю:
"errorCode": 7,
"message": "AI 91 for [0104610011501982***********] is invalid",
то есть:
m.Error = "Ошибка верификации крипто-подписи КМ в ГИС МТ (крипто-ключ не валиден)."
Ну уже хоть что-то
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Евгений Банщиков

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
Alsim
если отправляю код так, как он вставляется в чек и благополучно отправляется в ОФД
04601501261103****93ms/a
то есть перед 93 и в конце вставляю GS код
то ошибка {"code":400,"description":"400 BAD_REQUEST \"Failed to read HTTP message\"","codes":[]}
Зачем в конце вставляете GS ? Насколько мне известно , он там не нужен.

До проверочного режима я просто перед 93 добавлял GS и драивер атолла это нормально принимал и передавал далее в ЧЗ.
С онлаин проверкой от ЧЗ такой способ не сработал. Там требуется точно передавать всю структуру. В некоторых видах марок этих GS оказалось до трех штук в разных местах. Поскольку разбираться со всем этим у меня желания не было, я напряг наших спецов по железу и они перепрограммировали все сканеры в режим считывания GS. После этого все ошибки при проверки исчезли.

P.S.
В методичке от ЧЗ есть набор готовых марок с встроенными ошибками , с помощью которых можно проверить работу софта. Советую использовать их для тестов. (работает только с тестовыми серверами)
Ratings: 0 negative/1 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Евгений Банщиков
Зачем в конце вставляете GS ? Насколько мне известно , он там не нужен.
В соседней теме про ФФД2
forum.foxclub.ru
Равиль подсказал
Цитата:
Мне к сожалению тестировать не на чем, поэтому попробуйте :
1) уйти от тега 1162 - как пишут, что это не работает - хотя я бы сохранил оба варианта

2) обработать код маркировки - добавить разделители chr(29), т.к. сканер может и не прочитать их :

m.cFullKod = Strtran(m.cFullKod, Chr(29), [])
m.cFullKod = Left(m.cFullKod, 31) + Chr(29) + Substr(m.cFullKod, 32, 6) + Chr(29) + Substr(m.cFullKod, 38)

3) при проверке указываете тип LIBFPTR_MCT12_AUTO, а при регистрации LIBFPTR_MCT_OTHER - хотя не думаю что это критичн
Сделал примерно так, только длину вычисляю справа до "93", так и чеки пошли в Честный Знак с [М+].
*
Сейчас попробовал с хвоста обрезать GS, перегнал в штрих, Честный знак в смартфоне определил.
Послал код в разрешительном примере - также ошибка 400.
*
Сканеры перепрограммировал по методичке Честного Знака, код вставляется в текстбокс и дальше в таблицу, откуда потом берутся в чеки, без GS кодов.
Но и без перепрограммирования было также.
*
Методичку целиком ещё не осилил. Тестовый токен тоже пока получить не удалось.
Хочу в понедельник с утра попробовать повторить тесты на компе ГлавБуха, где Сертификаты и всё прочее для ЧЗ установлены и работают.
Сам же играюсь на домашнем компе, где кроме крипто ничего нет.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
Alsim
Как получить список серверов и время отклика есть в методичке.
lcUrl = "https://cdn.crpt.ru"
lcUrl = lcUrl + "/api/v4/true-api/cdn/info"
http = Createobject("WinHttp.WinHttpRequest.5.1")
Timeout = 20000
http.SetTimeouts(Timeout, Timeout, Timeout, Timeout)
http.Open("GET", lcUrl)
http.SetRequestHeader("Content-Type", "application/json")
http.SetRequestHeader("X-API-KEY", lcApi)
http.Send()
? http.Status
If http.Status <> 200
=Messagebox(Str(http.Status),64,"Ошибка запроса")
Endif
STRTOFILE(http.ResponseText,"ChZn\cdn.json")

Тут получается мы получили список серверов. Я так понимаю нужно выполнить запрос до каждого из них. При чём замерять время начала обращения к серверу и время его ответа в милисекундах. Потом нужно выбрать наименьшее время отклика и обратиться к этому серверу.
Я вижу это так:

*Получаем список серверов и время их отклика
lcApi = '' && Аутентификационный токен участника оборота из личного кабинета Честного знака.
lcUrl = "https://cdn.crpt.ru"
lcUrl = lcUrl + "/api/v4/true-api/cdn/info" &&просто список серверов
http = Createobject("WinHttp.WinHttpRequest.5.1")
Timeout = 20000
http.SetTimeouts(Timeout, Timeout, Timeout, Timeout)
http.Open("GET", lcUrl)
http.SetRequestHeader("Content-Type", "application/json")
http.SetRequestHeader("X-API-KEY", lcApi)
http.Send()
? http.Status
If http.Status <> 200
=Messagebox(Str(http.Status),64,"Ошибка запроса")
Endif
*STRTOFILE(http.ResponseText,"ChZn\cdn.json")
m.ТелоОтветаJSON=http.ResponseText() && получаем тело ответа JSON как строку
CREATE CURSOR spisserv (server CHARACTER(40),;
vremya numeric(13),;
dostupen logical(1))
m.i = 0
DO WHILE .T.
m.i = m.i + 1
m.x = STREXTRACT(m.ТелоОтветаJSON, '"host":"', '"}', m.i)
IF EMPTY(m.x) && EMPTY - Определяется, является ли выражение пустым.
EXIT
ENDIF
m.vr1=DATETIME()
lcUrl = m.x+'/api/v4/true-api/health/check' &&
http = Createobject("WinHttp.WinHttpRequest.5.1")
Timeout = 20000
http.SetTimeouts(Timeout, Timeout, Timeout, Timeout)
http.Open("POST", lcUrl)
http.SetRequestHeader("Content-Type", "application/json")
http.SetRequestHeader("X-API-KEY", lcApi)
http.Send()
IF http.Status # 200
m.vr2=DATETIME()
m.dostupen=.T.
m.vremya=m.vr2-m.vr1
ELSE
m.vremya=0
m.dostupen=.F.
endif
APPEND BLANK
REPLACE server WITH m.x, vremya WITH m.vremya, dostupen WITH m.dostupen
ENDDO
Что то значение времени я не получаю. datetime() тут не подходит походу?
Да и что-то опрос этих 11 серверов как-то долговат..



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

Сообщений: 190
Дата регистрации: 21.07.2010
Затупил. через second() надо было делать.
*Получаем список серверов и время их отклика
lcApi = ' ' && Аутентификационный токен участника оборота из личного кабинета Честного знака.
lcUrl = "https://cdn.crpt.ru"
lcUrl = lcUrl + "/api/v4/true-api/cdn/info" &&просто список серверов
http = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
TIMEOUT = 20000
http.SetTimeouts(TIMEOUT, TIMEOUT, TIMEOUT, TIMEOUT)
http.OPEN("GET", lcUrl)
http.SetRequestHeader("Content-Type", "application/json")
http.SetRequestHeader("X-API-KEY", lcApi)
http.SEND()
? http.STATUS
IF http.STATUS <> 200
=MESSAGEBOX(STR(http.STATUS),64,"Ошибка запроса")
ENDIF
*STRTOFILE(http.ResponseText,"ChZn\cdn.json")
m.ТелоОтветаJSON=http.ResponseText() && получаем тело ответа JSON как строку
CREATE CURSOR spisserv (SERVER CHARACTER(40),;
vremya numeric(13,3),;
dostupen logical(1))
m.i = 0
DO WHILE .T.
m.i = m.i + 1
m.x = STREXTRACT(m.ТелоОтветаJSON, '"host":"', '"}', m.i)
IF EMPTY(m.x) && EMPTY - Определяется, является ли выражение пустым.
EXIT
ENDIF
m.vr1=SECONDS()
lcUrl = m.x+'/api/v4/true-api/health/check' &&
http = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
TIMEOUT = 20000
http.SetTimeouts(TIMEOUT, TIMEOUT, TIMEOUT, TIMEOUT)
http.OPEN("POST", lcUrl)
http.SetRequestHeader("Content-Type", "application/json")
http.SetRequestHeader("X-API-KEY", lcApi)
http.SEND()
IF http.STATUS # 200
m.dostupen=.T.
m.vremya=SECONDS()-m.vr1
ELSE
m.vremya=0
m.dostupen=.F.
ENDIF
APPEND BLANK
REPLACE SERVER WITH m.x, vremya WITH m.vremya, dostupen WITH m.dostupen
ENDDO
SELECT * FROM spisserv INTO CURSOR spisserv ORDER BY vremya
SUSP
*ОТВЕТ: {"code":0,"description":"ok","hosts":[{"host":"https://cdn01.crpt.ru"},{"host":"https://cdn02.crpt.ru"},{"host":"https://cdn03.crpt.ru"},{"host":"https://cdn04.crpt.ru"},{"host":"https://cdn05.crpt.ru"},{"host":"https://cdn06.crpt.ru"},{"host":"https://cdn07.crpt.ru"},{"host":"https://cdn08.crpt.ru"},{"host":"https://cdn09.crpt.ru"},{"host":"https://cdn10.crpt.ru"},{"host":"https://cdn11.crpt.ru"}]}



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



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

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
PavlikPavlikovich
"Долговато" эта процедура идёт. Секунды 2-3. Можно как-то ускорить? И это же не перед каждым сканированием надо делать? Может только при запуске программы? Раз в день так сказать. И брать из этой таблицы сервер. Если вдруг среди дня он окажется недоступен, то прать следующий и так далее.
Мысль правильная. У меня в трёх филиалах кладовщики чеки отбивают потоком. Сели, завели возвраты, печатают.
Начинают процесс каждая в произвольное время, когда руки дойдут.
Видимо надо таймер привязывать, или запоминать факт заведения первого возврата в сутки, делать запрос к серверам как у Вас.
***
У меня пока проблема с получением токенов. Понял, что на каждой рабочем месте должен быть свой. Как именно его получить очень приблизительно представляю.
Вроде как создать файл с произвольным содержимым, подписать директором ключа и потом это шифрованное содержимое и вложить в тело запроса токена.
Руки пока не дошли, текучкой мешаются.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
PavlikPavlikovich
Автор

Сообщений: 190
Дата регистрации: 21.07.2010
Токен - один на организацию. Это просто набор символов в кабинете честного знака.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Alsim

Сообщений: 3682
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Не прокатил полученный токен в каобинете ЧЗ, та же ошибка "errorCode": 7
Пробовал на компе с подключенным ключом, где в ЧЗ вход работает.
Сгенерил файл подписанный по инструкции
olegon.ru
не прокатывает получение.
Пока у меня эта главная проблема. Разбираюсь.
Ratings: 0 negative/0 positive
Re: Разрешительный режим Честного знака
Евгений Банщиков

Сообщений: 235
Откуда: Kurgan
Дата регистрации: 09.04.2004
PavlikPavlikovich
"Долговато" эта процедура идёт. Секунды 2-3. Можно как-то ускорить? И это же не перед каждым сканированием надо делать? Может только при запуске программы? Раз в день так сказать. И брать из этой таблицы сервер. Если вдруг среди дня он окажется недоступен, то прать следующий и так далее.
При первом запуске делаете сканирование , выбираете площадку с наименьшим временем отклика. При каждом выполнении запроса замеряете время , если время запроса превысит заданный вами некий порог (например 3 секунды) , запускаете процедуру выбора площадки по новой.
Ratings: 0 negative/1 positive


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

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

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