Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Интеграция с API Диадок #1097

Open
MaximGlazunov opened this issue Sep 12, 2024 · 4 comments
Open

Интеграция с API Диадок #1097

MaximGlazunov opened this issue Sep 12, 2024 · 4 comments

Comments

@MaximGlazunov
Copy link

Добрый день.

Планируем уйти от использования компоненты диадок, и интегрироваться через HTTP-запросы на 1С.
В документации написано, что сперва нужно получить авторизационный токен с помощью метода Authenticate.
Пишу все как в документации (https://developer.kontur.ru/docs/diadoc-api/http/Authenticate.html):

Соединение = Новый HTTPСоединение("diadoc-api.kontur.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v3/Authenticate?type=certificate HTTP/1.1");
Запрос.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
Запрос.Заголовки.Вставить("Content-Type","octet-stream");
Запрос.Заголовки.Вставить("Content-Length", "1252");
Запрос.Заголовки.Вставить("Connection", "Keep-Alive");
Запрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + "КлючРазработчика");
Запрос.УстановитьТелоИзДвоичныхДанных(ДД);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

где ДД = СертификатКриптографии.Выгрузить();

Код ответа приходит 400, что бы я ни старался изменить.
Подскажите, пожалуйста, где у меня ошибка?
Может дело в формате ключа разработчика? Сейчас он в формате "API-Буквы_И_Цифры_С-Дефисами".
Его тоже пробовал по разному указывать, и возвращался код 401.

@GilimkhanovDenis GilimkhanovDenis transferred this issue from diadoc/diadocsdk-1c-docs Sep 12, 2024
@MaximGlazunov
Copy link
Author

Вот так сработало, пришел код состояния 200:
Соединение = Новый HTTPСоединение("diadoc-api.kontur.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос();
Запрос.Заголовки.Вставить("POST /v3/Authenticate?type=certificate HTTP/1.1");
Запрос.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
Запрос.Заголовки.Вставить("Content-Type","octet-stream");
Запрос.Заголовки.Вставить("Content-Length", "1252");
Запрос.Заголовки.Вставить("Connection", "Keep-Alive");
Запрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=API-d86150e6-07ff-4e48-beb5-6fde4cb6a64b");
Запрос.УстановитьТелоИзДвоичныхДанных(ДД); //здесь пробовал передавать и СертификатКриптографии.ОткрытыйКлюч - ничего не меняется

Но проблему это не решило: никакой зашифрованной строки в ответе нет.

@Ilnik19
Copy link

Ilnik19 commented Jan 27, 2025

Функция ПолучитьСтруктуруДокументовПоAPIДиадок(ЛогинНаСайтДиадок, ПарольНаСайтДиадок, ключ_api, boxId, ТипДокумента, afterIndexKey) Экспорт

Попытка
	АдресРесурса = "/Authenticate?login=" + ЛогинНаСайтДиадок + "&password=" + ПарольНаСайтДиадок;
	АдресСайта = "diadoc-api.kontur.ru";
	HTTPЗапрос = Новый HTTPЗапрос;
	HTTPЗапрос.Заголовки.Вставить("POST " + АдресРесурса + " HTTP/1.1");
	HTTPЗапрос.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
	HTTPЗапрос.Заголовки.Вставить("Content-Length", 0);
	HTTPЗапрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + ключ_api);
	HTTPЗапрос.АдресРесурса = АдресРесурса;	
	Соединение = Новый HTTPСоединение(АдресСайта, , , , , , Новый ЗащищенноеСоединениеOpenSSL(), Ложь); 
	ФайлРезультата = ПолучитьИмяВременногоФайла();
	Соединение.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультата);
	Ответ = Новый ТекстовыйДокумент();
	Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
	ПолеДокумента = Ответ.ПолучитьТекст();	
	
	Если ТипДокумента = Неопределено Тогда
		АдресСайта = "diadoc-api.kontur.ru/V3/GetDocuments?boxId=" + boxId + "&filterCategory=Any.InboundNotRevoked";
	Иначе		
		АдресСайта = "diadoc-api.kontur.ru/V3/GetDocuments?boxId=" + boxId + "&filterCategory=" + ТипДокумента + ".Inbound";
	КонецЕсли;
	
	Если ЗначениеЗаполнено(afterIndexKey) Тогда
		АдресСайта = АдресСайта + "&afterIndexKey=" + afterIndexKey + "";	
	КонецЕсли;
	
	Если ЗначениеЗаполнено(НачалоПериода) Тогда
		АдресСайта = АдресСайта + "&timestampFromTicks=" + СтрЗаменить(Строка(Число(НачалоПериода - '00010101') * 10000000), Символы.НПП, "");
	КонецЕсли;
	Если ЗначениеЗаполнено(КонецПериода) Тогда
		АдресСайта = АдресСайта + "&timestampToTicks=" + СтрЗаменить(Строка(Число(КонецДня(КонецПериода) - '00010101') * 10000000), Символы.НПП, "");
	КонецЕсли;
		
    HTTPЗапрос = Новый HTTPЗапрос;
	HTTPЗапрос.Заголовки.Вставить("GET /V3/GetDocuments HTTP/1.1");
	HTTPЗапрос.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
	HTTPЗапрос.Заголовки.Вставить("Accept",	"application/json");  
	HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); 
	HTTPЗапрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + ключ_api + ",ddauth_token=" + ПолеДокумента);
	Соединение = Новый HTTPСоединение(АдресСайта, , , , , , Новый ЗащищенноеСоединениеOpenSSL(), Ложь); 	
	ОтветHTTP = Соединение.Получить(HTTPЗапрос);
	ТекстОтвета =  ОтветHTTP.ПолучитьТелоКакСтроку();
Исключение	
	Сообщить(ОписаниеОшибки());
	Возврат "";	
КонецПопытки;

Если Не ЗначениеЗаполнено(ТекстОтвета) Тогда
	Возврат "";	
КонецЕсли;	

СтруктураJson = пПрочитатьJSON(ТекстОтвета);
Если СтруктураJson.Свойство("Documents") Тогда
	Возврат СтруктураJson;
Иначе
	Возврат "";	
КонецЕсли;

КонецФункции

@MaximGlazunov
Copy link
Author

Спасибо. А если вход по сертификату?

@Ilnik19
Copy link

Ilnik19 commented Jan 28, 2025

Спасибо. А если вход по сертификату?

АдресСервера = "diadoc-api.kontur.ru";
АдресРесурса = "/V3/Authenticate?type=certificate";

		ДвоичныеДанныеСертификата = Выборка.ДанныеСертификата.Получить();
		ИмяФайлаДанныеСертификата = ПолучитьимяВременногоФайла("cer");
		ДвоичныеДанныеСертификата.Записать(ИмяФайлаДанныеСертификата);
		
		ФайлДанныеСертификата = Новый Файл(ИмяФайлаДанныеСертификата);
		РазмерФайлаДанныеСертификата = XMLСтрока(ФайлДанныеСертификата.Размер());
		
		Заголовки = Новый Соответствие();
		Заголовки.Вставить("POST " + АдресРесурса + " HTTP/1.1");
		Заголовки.Вставить("Host", АдресСервера);
		Заголовки.Вставить("Content-Type", "application/octet-stream");
		Заголовки.Вставить("Content-Lenght", РазмерФайлаДанныеСертификата);
		Заголовки.Вставить("Connection", "Keep-Alive");
		Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + ключ_api);
		
		Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
		Запрос.УстановитьИмяФайлаТела(ИмяФайлаДанныеСертификата);
		
		ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("txt");
		Соединение = Новый HTTPСоединение(АдресСервера, , , , , , Новый ЗащищенноеСоединениеOpenSSL(), Ложь);
		Ответ = Соединение.ОтправитьДляОбработки(Запрос, ИмяВыходногоФайла);
		ОшибкаЗапроса = Ложь;
		
		Если Ответ.КодСостояния = 200 Тогда
			
			МенеджерКриптографии = Новый МенеджерКриптографии("", "", 80);
			МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = "";
			Попытка
				РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(ИмяВыходногоФайла);
				ДанныеBase64 = Base64Строка(РасшифрованныеДанные);
			Исключение
				ЗаписьЖурналаРегистрации("Возникла ошибка при расшифровке токена:" + ОписаниеОшибки(), УровеньЖурналаРегистрации.Ошибка, , Выборка.Документ, "Не удалось отправить статус подписи");
	            ОшибкаЗапроса = Истина;					
				ОбщегоНазначения.СообщитьПользователю("Возникла ошибка при расшифровке токена: " + ОписаниеОшибки() + "");
				Возврат;
			КонецПопытки;
			
			ДанныеBase64URL = КодироватьСтроку(ДанныеBase64, СпособКодированияСтроки.КодировкаURL);
			АдресРесурса = "/V2/AuthenticateConfirm?token=" + ДанныеBase64URL;
			
			Заголовки = Новый Соответствие();
			Заголовки.Вставить("POST " + АдресРесурса + " HTTP/1.1");
			Заголовки.Вставить("Host", АдресСервера);	
			Заголовки.Вставить("Content-Type", "application/octet-stream");
			Заголовки.Вставить("Content-Lenght", РазмерФайлаДанныеСертификата);
			Заголовки.Вставить("Connection", "Keep-Alive");
			Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + ключ_api);
			
			Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
			Запрос.УстановитьИмяФайлаТела(ИмяФайлаДанныеСертификата);
			
			ИмяВыходногоФайлаТокен = ПолучитьИмяВременногоФайла("txt");
			Соединение = Новый HTTPСоединение(АдресСервера,,,,,, Новый ЗащищенноеСоединениеOpenSSL(), Ложь);
			Ответ = Соединение.ОтправитьДляОбработки(Запрос, ИмяВыходногоФайлаТокен);
			
			Если Ответ.КодСостояния = 200 Тогда
				Текст = Новый ТекстовыйДокумент;
				Текст.Прочитать(ИмяВыходногоФайлаТокен, КодировкаТекста.UTF8);
				Токен = Текст.ПолучитьТекст();
			Иначе
				ЗаписьЖурналаРегистрации("Возникла ошибка при подтверждении токена:" + ОписаниеОшибки(),УровеньЖурналаРегистрации.Ошибка, , Выборка.Документ, "Не удалось отправить статус подписи");
				ОшибкаЗапроса = Истина;
				ОбщегоНазначения.СообщитьПользователю("Возникла ошибка при подтверждении токена: " + ОписаниеОшибки() + "");
			КонецЕсли;      
			
		Иначе
			ЗаписьЖурналаРегистрации("Возникла ошибка при попытке аутентификации." + ОписаниеОшибки(), УровеньЖурналаРегистрации.Ошибка, , Выборка.Документ, "Не удалось отправить статус подписи");
			ОшибкаЗапроса = Истина; 
			ОбщегоНазначения.СообщитьПользователю("Возникла ошибка при попытке аутентификации. " + ОписаниеОшибки() + "");
		КонецЕсли;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants