Добрый день, кто уже начал работать с api ЭДО Лайт?
Подскажите как правильно подписать и отправить документ ?
Как черновик документы успешно отправляются, а последующее подписание выдает ошибки "Ошибка подписи"... Поделитесь рабочим кодом
Вот пример, как подписывать и отправлять УПД на ЭДО Лайт.
Процедура ОтправитьУПДнаЭДО(П,СФ,Отказ,ОписаниеОшибки) Экспорт
ПолучитьТокен(П,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
УПД = ПолучитьУПД(П,СФ,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
Подпись = Подписать(УПД.ДвоичныеДанные,П.Токен_Отпечаток,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
Подпись = ПолучитьПрисоединеннуюПодпись(Подпись,УПД.ДвоичныеДанные,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
ПолучитьТокен(П,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
ПС = Символы.ВК+Символы.ПС;
Заголовки = Заголовки(П);
Р = "---------------------------Lkjd09340ijk1nx94pi8md8nd8a23cgQr";
Заголовки.Вставить("Content-Type","multipart/form-data; boundary="+Р);
Тело = "";
Тело = Тело + "--"+Р+ПС;
Тело = Тело + "Content-Disposition: form-data; name=""content""; filename="""+УПД.ИДФайл+".xml"""+ПС;
Тело = Тело + "Content-Type: application/xml"+ПС+ПС;
Тело = Тело + ПолучитьСтрокуИзДвоичныхДанных(УПД.ДвоичныеДанные,КодировкаТекста.ANSI)+ПС;
Тело = Тело + "--"+Р+ПС;
Тело = Тело + "Content-Disposition: form-data; name=""signature"""+ПС;
Тело = Тело + "Content-Type: text/plain"+ПС+ПС;
Тело = Тело + Base64_Строка(Подпись) + ПС;
Тело = Тело + "--"+Р+"--"+ПС;
А = ПолучитьДвоичныеДанныеИзСтроки(Тело,КодировкаТекста.ANSI);
ИмяСервера = ПолучитьИмяСервера(П.ОператорЭДО);
Соединение = Новый HTTPСоединение(ИмяСервера,,,,,,Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/api/v1/outgoing-documents",Заголовки);
Запрос.УстановитьТелоИзДвоичныхДанных(А);
Состояние(ИмяСервера+"/api/v1/outgoing-documents");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Состояние();
Тело = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния<>201 Тогда
Отказ = Истина;
ОписаниеОшибки = "Ошибка выполнения запроса outgoing-documents. Код состояния="+Ответ.КодСостояния+" "+Тело;
Возврат;
КонецЕсли;
Т = JSON_В_Значение(Тело);
Если ТипЗнч(Т)<>Тип("Структура") Тогда
Отказ = Истина;
ОписаниеОшибки = "Ошибка разбора JSON "+Тело;
Возврат;
КонецЕсли;
Ссылка = Документы.ДокументЭДО.ПолучитьСсылку(Новый УникальныйИдентификатор(Т.id));
Док = Документы.ДокументЭДО.СоздатьДокумент();
Док.ОператорЭДО = П.ОператорЭДО;
Док.УстановитьСсылкуНового(Ссылка);
Док.ДокументыОснования.Добавить().ДокументОснование = СФ;
Док.Дата = ТекущаяДата();
Док.ОбменДанными.Загрузка = Истина;
Док.Записать();
КонецПроцедуры
Функция Заголовки(П=Неопределено)
Результат = Новый Соответствие;
Результат.Вставить("Content-Type","application/json;charset=UTF-8");
Если ТипЗнч(П)=Тип("Структура") Тогда
Если П.Свойство("Токен") Тогда
Результат.Вставить("Authorization","Bearer "+П.Токен);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура Авторизация(П,Отказ,ОписаниеОшибки)
Соединение = Новый HTTPСоединение(ПолучитьИмяСервера(П.ОператорЭДО),,,,,,Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("api/v1/session",Заголовки());
Ответ = Соединение.Получить(Запрос);
Тело = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния<>200 Тогда
Отказ = Истина;
ОписаниеОшибки = "Ошибка запроса авторизации: "+Ответ.КодСостояния+" "+Тело;
Возврат;
КонецЕсли;
Данные = JSON_В_Значение(Тело);
Если ТипЗнч(Данные)<>Тип("Структура") Тогда
Отказ = Истина;
ОписаниеОшибки = "Ошибка разбора JSON: "+Тело;
Возврат;
КонецЕсли;
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Данные.data,КодировкаТекста.UTF8,Ложь);
МассивСертификатов = .....
П.Вставить("Токен_Отпечаток",МассивСертификатов[0].Отпечаток);
Подпись = Подписать(ДвоичныеДанные,П.Токен_Отпечаток,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
Подпись = ПолучитьПрисоединеннуюПодпись(Подпись,ДвоичныеДанные,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
//Получение токена
Данные.Вставить("data",Base64_Строка(Подпись));
Запрос = Новый HTTPЗапрос("api/v1/session",Заголовки());
Запрос.УстановитьТелоИзСтроки(Значение_В_JSON(Данные),КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Тело = Ответ.ПолучитьТелоКакСтроку();
Если Ответ.КодСостояния<>200 Тогда
Отказ = Истина;
ОписаниеОшибки = "Ошибка запроса авторизации: "+Ответ.КодСостояния+" "+Тело;
Возврат;
КонецЕсли;
Данные = JSON_В_Значение(Тело);
Если ТипЗнч(Данные)<>Тип("Структура") Тогда
Отказ = Истина;
ОписаниеОшибки = "Ошибка разбора JSON: "+Тело;
Возврат;
КонецЕсли;
П.Вставить("Токен",Данные.token);
КонецПроцедуры
Процедура ПолучитьТокен(П,Отказ,ОписаниеОшибки) Экспорт
Сервер = ПолучитьИмяСервера(П.ОператорЭДО);
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Рег.Токен,
| Рег.СрокДействия,
| Рег.Отпечаток
|ИЗ
| РегистрСведений.АутентификационныеТокены КАК Рег
|ГДЕ
| Рег.Сервер = &Сервер
| И Рег.Организация = &Организация
| И Рег.СрокДействия > &ТекущаяДата");
Запрос.УстановитьПараметр("Сервер",Сервер);
Запрос.УстановитьПараметр("Организация",П.Организация);
Запрос.УстановитьПараметр("ТекущаяДата",ТекущаяДата());
Табл = Запрос.Выполнить().Выгрузить();
Если Табл.Количество()>0 Тогда
П.Вставить("Токен",Табл[0].Токен);
П.Вставить("Токен_СрокДействия",Табл[0].СрокДействия);
П.Вставить("Токен_Отпечаток",Base64Значение(Табл[0].Отпечаток));
Иначе
Авторизация(П,Отказ,ОписаниеОшибки);
Если Отказ Тогда
Возврат;
КонецЕсли;
СрокДействия = ТекущаяДата()+9*3600; //9 часов
Набор = РегистрыСведений.АутентификационныеТокены.СоздатьНаборЗаписей();
Набор.Отбор.Сервер.Установить(Сервер);
Набор.Отбор.Организация.Установить(П.Организация);
НовСтрока = Набор.Добавить();
НовСтрока.Сервер = Сервер;
НовСтрока.Организация = П.Организация;
НовСтрока.Токен = П.Токен;
НовСтрока.Отпечаток = Base64_Строка(П.Токен_Отпечаток);
НовСтрока.СрокДействия = СрокДействия;
Набор.Записать();
П.Вставить("Токен_СрокДействия",СрокДействия);
П.Вставить("Токен_Отпечаток",Base64Значение(П.Токен_Отпечаток));
КонецЕсли;
КонецПроцедуры
(9) Я рабоал еще с "API ЭДО Lite Версия 3.0".
Использовал другой метод: "3.1. Метод загрузки файла информации продавца УПД". С помощью multipart/form-data передавал сразу данные и подпись. Причем на открепленную подпись ругалась, с прикрепленной - работало. Сейчас может уже исправили.
(10) Да, ваш метод тоже вызывает "ошибку подписи"
Хотя с подписью все в порядке (Получаю токен, работаю в ГисМТ по такой же схеме - там все ок)
Подписываю средствами КриптоПро (comCPSigner = Новый COMОбъект("CAdESCOM.CPSigner"))
Черновики загружаются отдельно, и успешно, а вот подписать уже не дает
(11) Да, вспомнил. Метод "3.5. Подписание исходящего документа" тоже пробовал, но не получилось. Выдавал ошибку, как у вас. Вроде бы как двоичные данные не совпадали с черновиком.
(13) Подписывать можно и так и так, там всё работает.
(12) Да, тоже где то в комментах прочитал что могут не совпадать черновики с подписываемым документом... но документ получаю методом "3.5. Получение содержимого XML документа" , Подписываю открепленной подписью и отправляю в таком же виде (Строка, кодировка: "windows-1251") и не дает
(14) Попробуйте не "УстановитьТелоИзСтроки" а "УстановитьТелоИзДвоичныхДанных".
Предварительно получайте содержимое XML-документа как двоичные данные и отправляйте как двоичные данные, иначе могут возникать перекодировки и изменение содержимого.
Отправляю УПД через ЭДО лайт клиентам с водой в том числе маркированной,с учетом того,что роуминг с клиентами настроен,ни один не видит у себя,ни диадок,ни особенно сбис.У кого нибудь есть практика что бы видели?