API Почта России Создание отправлений (Заказные письма)

1. Lanny 05.06.20 12:25 Сейчас в теме
Добрый день! Реализуется создание отправления на сайте Почта России средствами API

Из спецификации;

Параметры запроса:

Локальный URL: /1.0/erl/send
Curl: curl -X POST {host}/1.0/erl/send –H "Content-Type: multipart/form-data" -H "X-User-Authorization: Basic {токен}" -H "Authorization: AccessToken {токен}" -F "shipment-info=*shipment-info.json;type=application/json" -F "attachment=*letter.pdf" -F "attachment-signature=*letter.pdf.sig"
Тип POST

Заголовки запроса (header)
Authorization AccessToken ...
X-User-Authorization Basic ...
Content-Type multipart/form-data;charset=UTF-8

Тело запроса (Request)

Тело запроса состоит из трех файлов: shipment-info.json, name.pdf и name.sig.
Файл shipment-info.json содержит данные о письме/отправителе/получаете в формате json. Файл name.pdf – файл с письмом в формате pdf. Файл name.sig – файл электронной цифровой подписи в формате sig. Файл с письмом и ЭЦП имеют одинаковые названия и весят до 1мб.
shipment-info.json

Каким образом в 1с реализовать код с параметрами -F (Curl)

"-F "shipment-info=*shipment-info.json;type=application/json"
-F "attachment=*letter.pdf"
-F "attachment-signature=*letter.pdf.sig"
Найденные решения
2. SeverBaP 5 31.07.20 16:32 Сейчас в теме
Я чтобы отправить несколько файлов в запросе делал вот так:
ПотокТело = Новый ПотокВПамяти;
			ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""ApiKey""");
			ЗаписьДанных.ЗаписатьСтроку("");
			ЗаписьДанных.ЗаписатьСтроку(НастройкиИнтеграцииПС.Пароль);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""orderID""");
			ЗаписьДанных.ЗаписатьСтроку("");
			ЗаписьДанных.ЗаписатьСтроку(СокрЛП(ДанныеОЯрлыкеДляЗаказа.НомерРезерваПоИсточнику));
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""label""; filename=""label.pdf""");	
	       	ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
			ЗаписьДанных.ЗаписатьСтроку("");
			ЗаписьДанных.Записать(ДанныеОЯрлыкеДляЗаказа.Ярлык);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary + "--");	
			ЗаписьДанных.Закрыть();
			ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
			
			СтрТелоЗапроса = "ApiKey="+НастройкиИнтеграцииПС.Пароль+"; orderID="+СокрЛП(ДанныеОЯрлыкеДляЗаказа.НомерРезерваПоИсточнику);
			
			// передадим данные на сервер 
			ЗаголовкиHTTP = Новый Соответствие();
			ЗаголовкиHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
			                  
			СерверПриемник = "********";
			
			HTTPСоединение = Новый HTTPСоединение(СерверПриемник,,,,,100);

			АдресСтраницыНаСервере = "********.php";
			
			ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовкиHTTP);
			ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
Показать

относительно параметров "-F" можно в этом примере прописать и попробовать.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SeverBaP 5 31.07.20 16:32 Сейчас в теме
Я чтобы отправить несколько файлов в запросе делал вот так:
ПотокТело = Новый ПотокВПамяти;
			ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""ApiKey""");
			ЗаписьДанных.ЗаписатьСтроку("");
			ЗаписьДанных.ЗаписатьСтроку(НастройкиИнтеграцииПС.Пароль);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""orderID""");
			ЗаписьДанных.ЗаписатьСтроку("");
			ЗаписьДанных.ЗаписатьСтроку(СокрЛП(ДанныеОЯрлыкеДляЗаказа.НомерРезерваПоИсточнику));
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""label""; filename=""label.pdf""");	
	       	ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
			ЗаписьДанных.ЗаписатьСтроку("");
			ЗаписьДанных.Записать(ДанныеОЯрлыкеДляЗаказа.Ярлык);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
			ЗаписьДанных.ЗаписатьСтроку("--" + Boundary + "--");	
			ЗаписьДанных.Закрыть();
			ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
			
			СтрТелоЗапроса = "ApiKey="+НастройкиИнтеграцииПС.Пароль+"; orderID="+СокрЛП(ДанныеОЯрлыкеДляЗаказа.НомерРезерваПоИсточнику);
			
			// передадим данные на сервер 
			ЗаголовкиHTTP = Новый Соответствие();
			ЗаголовкиHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
			                  
			СерверПриемник = "********";
			
			HTTPСоединение = Новый HTTPСоединение(СерверПриемник,,,,,100);

			АдресСтраницыНаСервере = "********.php";
			
			ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовкиHTTP);
			ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
Показать

относительно параметров "-F" можно в этом примере прописать и попробовать.
3. Tatik0m 06.01.21 18:29 Сейчас в теме
У кого-то получилось с интеграцией этого метода?

Сейчас занимаюсь этой же интеграцией, от сервера приходят ошибки различной степени бесполезности:
{
"timestamp" : "2021-01-05T20:59:52+0300",
"status" : 400,
"error" : "Bad Request",
"message" : "Required request part 'shipment-info' is not present",
"path" : "/1.0/erl/send"
}


{
"code" : "2007",
"desc" : "Некорректный запрос",
"sub-code" : "BAD_REQUEST"
}


{
"errors" : [ {
"description" : "Неподдерживаемый файл shipment-info.json",
"details" : "shipment-info.json",
"error" : "UNSUPPORTED_FILE"
} ]
}


415 Доступ заблокирован


Есть пример рабочего кода, как нужно отправлять? - Такая же ошибка происходит в т.ч. с примером консольного curl.
4. Tatik0m 13.01.21 15:39 Сейчас в теме
Возможно получится спасти кому-то пачку нервных клеток и тонну времени на общении с тех. поддержкой.

Проблема была из-за содержимого shipment-info.json. В документации пример идёт в фигурных скобках, которые не нужны.
7. glazrom 9 21.06.21 10:44 Сейчас в теме
(4) получилось сделать интеграцию? с каким адресом по АПИ завелось?
5. Lanny 02.02.21 12:43 Сейчас в теме
У вас получилось отправить из 1С через api? Я отправляю из 1С, приходит id письмо вижу на сайте с сообщением "ЭЦП невалидная или отсутствует". Тех поддержка говорит ошибка в отправляемом запросе. С ЭЦП все нормально (проверку проходит через постмант и из личного кабинета письма подписанные ей ошибок не выдают).
6. glazrom 9 21.06.21 10:41 Сейчас в теме
(5) у вас в итоге получилось сделать интеграцию для отправки? Сколько смотрел публикаций, везде примеры с отправкой посылок, по заказным письмам не увидел.
9. Lanny 23.06.21 07:59 Сейчас в теме
10. glazrom 9 23.06.21 08:14 Сейчас в теме
(9)можете поделиться функцией отправки?
11. Lanny 24.06.21 10:30 Сейчас в теме
(10) Использовала этот (2) код.
8. glazrom 9 21.06.21 15:48 Сейчас в теме
Выкладываю документацию к интеграции, которую прислали из службы поддержки ,возможно кому-то пригодится. На сайте почты инфа по отправке посылок, про письма ничего не нашел.
Прикрепленные файлы:
API_ЭЗП v1.02.pdf
12. danil157 18 03.12.21 15:04 Сейчас в теме
Кто нибудь может выложить рабочий пример отправки эзп?
13. danil157 18 03.03.22 15:55 Сейчас в теме
Вот проверенный пример

&НаСервере
Процедура Команда1НаСервереPOST()

	host 							= "https://otpravka-api.pochta.ru/1.0/erl/send";	
	ТокенАвторизации 				= *************;
	Логин 							= *************;
	Пароль							= *************;	
	КлючАвторизацииПользователя		= СоздатьСтрокуBase64(Логин + ":" + Пароль);	
	
	НеобработанныйАдресПолучателя 	= *************;;
	НеобработанныйАдресОтправителя 	= *************;;

	
	Разделитель = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
	
	//отправка post запроса
	//подготавливаем вложенные сообщения
	ДвоичныеДанные1 = ПодготовитьФайл("shipment-info", "shipment-info.json","application/json", Новый ДвоичныеДанные("C:\shipment-info.json"));
	ДвоичныеДанные2 = ПодготовитьФайл("attachment"   		 , "letter.pdf","application/pdf" , Новый ДвоичныеДанные("C:\letter.pdf"));
	ДвоичныеДанные3 = ПодготовитьФайл("attachment-signature" , "letter.sig" ,"application/sig" , Новый ДвоичныеДанные("C:\letter.sig"));
	
	//устанавливаем заголовки основного сообщения
	Заголовки = Новый Соответствие();
	Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
	
	//формируем основное сообщение
	ПотокВПамяти = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
	
	ЗаписьДанных.ЗаписатьСтроку("--"+Разделитель);
	ЗаписьДанных.Записать(ДвоичныеДанные1);
	ЗаписьДанных.ЗаписатьСтроку("");
	
	ЗаписьДанных.ЗаписатьСтроку("--"+Разделитель);
	ЗаписьДанных.Записать(ДвоичныеДанные2);
	ЗаписьДанных.ЗаписатьСтроку("");

	ЗаписьДанных.ЗаписатьСтроку("--"+Разделитель);
	ЗаписьДанных.Записать(ДвоичныеДанные3);
	ЗаписьДанных.ЗаписатьСтроку("");
	
	ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
	ЗаписьДанных.Закрыть();
	
	ТелоЗапроса = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows()); 
	
	//отправляем данные скрипту
	HTTPСоединение = Новый HTTPСоединение(СтрЗаменить(Host,"https://",""),,,,,,ssl);
	
	// передадим данные на сервер 
	ЗаголовкиHTTP = Новый Соответствие();
		
	ЗаголовкиHTTP.Вставить("Content-Type" , "multipart/form-data;charset=UTF-8; boundary=" + Разделитель);
	ЗаголовкиHTTP.Вставить("Authorization",	"AccessToken " + ТокенАвторизации);
	ЗаголовкиHTTP.Вставить("X-User-Authorization",	"Basic "+ КлючАвторизацииПользователя);

	Запрос = Новый HTTPЗапрос("", ЗаголовкиHTTP);
	Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);
	
	Ответ = HTTPСоединение.ОтправитьДляОбработки(Запрос);
	
	Сообщить(Ответ.ПолучитьТелоКакСтроку());

КонецПроцедуры

Функция ПодготовитьФайл(Название, ИмяФайла,Type ="",ДвоичныеДанные)
	
	Поток = Новый ПотокВПамяти();
	
	ЗаписьДанных = Новый ЗаписьДанных(Поток);
	
	//устанавливаем заголовки
	ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=" + Название + "; filename=" + ИмяФайла);
	
	Если ЗначениеЗаполнено(Type) Тогда
		ЗаписьДанных.ЗаписатьСтроку("Content-Type: " + Type);
	КонецЕсли;
	
	ЗаписьДанных.ЗаписатьСтроку("");

	ЗаписьДанных.Записать(ДвоичныеДанные);
	
	ЗаписьДанных.Закрыть();
	
	Возврат Поток.ЗакрытьИПолучитьДвоичныеДанные();
	
КонецФункции

Функция СоздатьСтрокуBase64(Строка) Экспорт
	
	ВременныйФайл = ПолучитьИмяВременногоФайла();
	
	ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, "CESU-8");
	ЗаписьТекста.Записать(Строка);
	ЗаписьТекста.Закрыть();
	
	ДД_Файла = Новый ДвоичныеДанные(ВременныйФайл);
	СтрокаBase64 = Base64Строка(ДД_Файла);
	
	УдалитьФайлы(ВременныйФайл);
	
	Возврат СтрокаBase64;
	
КонецФункции // СоздатьСтрокуBase64()
Показать
RPGrigorev; +1 Ответить
14. RPGrigorev 695 23.11.22 13:06 Сейчас в теме
(13) У меня код ответа 406 при таком использовании...У Вас работает еще?
15. danil157 18 23.11.22 17:41 Сейчас в теме
16. RPGrigorev 695 23.11.22 18:13 Сейчас в теме
17. RPGrigorev 695 24.11.22 10:49 Сейчас в теме
У кого код ответа 406 при создании ЭЗП, пишите в поддержку, добавили разрешения, прислали новый токен, все заработало.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот