API Почта России Создание отправлений (Заказные письма)
Добрый день! Реализуется создание отправления на сайте Почта России средствами 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"
Из спецификации;
Параметры запроса:
Локальный 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"
Найденные решения
Я чтобы отправить несколько файлов в запросе делал вот так:
относительно параметров "-F" можно в этом примере прописать и попробовать.
ПотокТело = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
ЗаписьДанных.ЗаписатьСтроку("--" + 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" можно в этом примере прописать и попробовать.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Я чтобы отправить несколько файлов в запросе делал вот так:
относительно параметров "-F" можно в этом примере прописать и попробовать.
ПотокТело = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
ЗаписьДанных.ЗаписатьСтроку("--" + 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" можно в этом примере прописать и попробовать.
У кого-то получилось с интеграцией этого метода?
Сейчас занимаюсь этой же интеграцией, от сервера приходят ошибки различной степени бесполезности:
Есть пример рабочего кода, как нужно отправлять? - Такая же ошибка происходит в т.ч. с примером консольного curl.
Сейчас занимаюсь этой же интеграцией, от сервера приходят ошибки различной степени бесполезности:
{
"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.
У вас получилось отправить из 1С через api? Я отправляю из 1С, приходит id письмо вижу на сайте с сообщением "ЭЦП невалидная или отсутствует". Тех поддержка говорит ошибка в отправляемом запросе. С ЭЦП все нормально (проверку проходит через постмант и из личного кабинета письма подписанные ей ошибок не выдают).
Выкладываю документацию к интеграции, которую прислали из службы поддержки ,возможно кому-то пригодится. На сайте почты инфа по отправке посылок, про письма ничего не нашел.
Прикрепленные файлы:
API_ЭЗП v1.02.pdf
Вот проверенный пример
&НаСервере
Процедура Команда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()
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот