- Подготовка производственной площадки к маркировке
- Сроки внедрения маркировки для производителей: что нужно знать малым, средним и крупным?
- Оборудование для маркировки: какое нужно и что пригодится из того, что у вас уже есть?
- Состав кода маркировки молочной продукции
Необходимо авторизоваться или зарегистрироваться на портале
Данные электронной подписи не соответствуют текущему участнику.
Авторизация и аутентификация успешно проходят.
1. Формирование данных для подписания:
1. Формирование данных для подписания:
- Сначала генерируется документ в формате JSON, содержащий информацию о выводе товара из оборота.
- Документ сериализуется в строку JSON и затем кодируется в Base64 для передачи.
2. Подписание данных:
- Используется открепленная электронная подпись, которая создается на основе части документа поля products. Для этого применяется сертификат, найденный в хранилище по отпечатку (thumbprint).
- Подписываемая строка сначала кодируется в Base64, а затем подписывается с помощью криптографической библиотеки через объект CAdESCOM.CadesSignedData.
3. Формирование документа для отправки:
- Полный документ (в формате JSON)
- Подписанная часть документа прикрепляется отдельно в виде открепленной подписи.
- Тело документа в формате Base64
- Тело документа в формате Base64
- На сервер отправляется JSON-объект, содержащий закодированный документ и открепленную подпись, а также токен для аутентификации.
# Этап 5: Подписание части документа (products) откреплённой подписью
# Этап 5: Подписание части документа (products) откреплённой подписью
def sign_document_part(products_json, thumbprint):
return sign_data(products_json, thumbprint) # Подписание необработанного JSON
# Этап 6: Отправка данных о выводе товара из оборота (БАДов) с открепленной подписью
def send_withdrawal_request(token, document_json, signed_data_base64):
url = «https://markirovka.crpt.ru/api/v3/true-api/lk/documents/create?pg=bio»
headers = {
'accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {token}'
}
# Подписание уже выполнено до этого шага, поэтому только преобразование документа в Base64
document_base64 = base64.b64encode(document_json.encode('utf-8')).decode('utf-8')
data = {
«document_format»: «MANUAL»,
«product_document»: document_base64,
«type»: «LK_RECEIPT»,
«signature»: signed_data_base64 # Открепленная подпись части документа
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
print(«Response:», response.json())
else:
raise Exception(f«Error: {response.status_code}, {response.text}»)
url = «https://markirovka.crpt.ru/api/v3/true-api/lk/documents/create?pg=bio»
headers = {
'accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {token}'
}
# Преобразование документа в Base64
document_base64 = base64.b64encode(document_json.encode('utf-8')).decode('utf-8')
data = {
«document_format»: «MANUAL»,
«product_document»: document_base64,
«type»: «LK_RECEIPT»,
«signature»: signed_data_base64 # Открепленная подпись части документа
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
print(«Response:», response.json())
else:
raise Exception(f«Error: {response.status_code}, {response.text}»)
# Этап 2: Подписание строки (для авторизации или документа)
# Этап 2: Подписание строки (для авторизации или документа)
def sign_data(data_to_sign, thumbprint):
oStore = win32com.client.Dispatch(«CAdESCOM.Store»)
oStore.Open(2, 'My', 0) # Открытие хранилища сертификатов
# Найти сертификат по отпечатку
for cert in oStore.Certificates:
if cert.Thumbprint.lower() == thumbprint.lower():
oCert = cert
break
else:
raise Exception(«Сертификат не найден»)
oStore.Close()
# Создание подписчика
oSigner = win32com.client.Dispatch(«CAdESCOM.CPSigner»)
oSigner.Certificate = oCert
# Подписание строки
oSignedData = win32com.client.Dispatch(«CAdESCOM.CadesSignedData»)
oSignedData.ContentEncoding = 1 # Base64
oSignedData.Content = base64.b64encode(data_to_sign.encode('utf-8')).decode('utf-8')
signed_data = oSignedData.SignCades(oSigner, 1, False, 0) # Открепленная подпись
# Удаление переносов строк из открепленной подписи
signed_data = signed_data.replace(«\r», «»).replace(«\n», «»)
return signed_data
S
Используется открепленная электронная подпись, которая создается на основе части документа поля products.
Если написано верно, то тут скорее всего ошибка. Подписывать надо именно ту строку, которую передаете в POST запросе, т.е. эту:
data = {
«document_format»: «MANUAL»,
«product_document»: document_base64,
«type»: «LK_RECEIPT»,
«signature»: signed_data_base64 # Открепленная подпись части документа}
25.09.2024 17:14
0