Partner API Спецификация веб-сервисов партнёрского API Hermes-DPD 2 Содержание Содержание ................................................................................................................................................................ 2 Версия документа ...................................................................................................................................................... 4 Краткое описание....................................................................................................................................................... 4 Описание терминов ................................................................................................................................................... 5 Расположение ............................................................................................................................................................ 6 Модуль Partner API..................................................................................................................................................... 7 Обработка статусов посылки................................................................................................................................. 7 Метод SendParcelStatuses.................................................................................................................................. 7 Обработка посылок................................................................................................................................................ 8 Метод GetParcels ................................................................................................................................................ 8 Объектная модель ................................................................................................................................................. 9 ParcelStatusData .................................................................................................................................................. 9 ParcelStatusDataResult ........................................................................................................................................ 9 ParcelDataResult .................................................................................................................................................. 9 ParcelData .......................................................................................................................................................... 10 Customer............................................................................................................................................................ 10 Address .............................................................................................................................................................. 11 Status ................................................................................................................................................................. 11 ParcelShopStatus : Status .................................................................................................................................. 13 ParcelShopSignStatus : ParcelShopStatus ......................................................................................................... 13 ParcelShopSignWithPaymentStatus : ParcelShopSignStatus............................................................................. 13 ExtraParam......................................................................................................................................................... 13 CurrencyCode .................................................................................................................................................... 14 PaymentCode ..................................................................................................................................................... 14 Список доступных статусов посылок для проставления............................................................................... 15 Обработка ошибок ................................................................................................................................................... 16 Коды ошибок ........................................................................................................................................................ 16 Обработка ошибок SOAP-сервисом.................................................................................................................... 17 Обработка ошибок REST-сервисом..................................................................................................................... 17 Контакты ................................................................................................................................................................... 19 Примеры подключения и вызова ........................................................................................................................... 20 Запросы для SOAP-сервиса.................................................................................................................................. 20 Консольное приложение на C# ....................................................................................................................... 20 Выполнение запросов через SoapUI............................................................................................................... 21 «Чистый» XML-запрос ...................................................................................................................................... 26 Запросы для REST-сервиса .................................................................................................................................. 31 3 Запросы (XML/JSON) на JavaScript (JQuery) .................................................................................................... 32 Приложение ............................................................................................................................................................. 33 4 Версия документа Версия 1.0 1.1 Дата 30.03.2015 05.05.2015 Автор Корзинин А. Корзинин А. 1.2 01.07.2015 Корзинин А. Комментарий Документ создан Примеры использования статусов пункта выдачи и статусов электронной подписи. Status абстрактный Расширение статуса и запроса на отправление статуса для использования ExtraParams Краткое описание В данном документе описаны спецификации веб-сервисов компании Hermes-DPD. Веб-сервисы компании Hermes-DPD позволяют клиентам осуществить интеграцию для выполнения основных операций. Для клиентов доступны два типа взаимодействия с веб-сервисами: REST и классический SOAP. 5 Описание терминов ПВЗ – Пункт выдачи заказов Штрих-код посылки – уникальный номер посылки, используемый для графического отображения на наклейке на посылке и для всех взаимодействий по посылке между клиентом, получателем и HermesDPD Бизнес-юнит – структурное подразделение клиента. Если у клиента есть несколько каталогов, сайтов или брендов, для которых на всех стадиях жизненного цикла доставки посылки должно быть явно известно, к которому из них она относится, то такие структуры клиента необходимо выделить в самостоятельные бизнес-юниты «Экспресс-возврат» - услуга возврата уже выкупленных сколько угодно давно получателем товаров в любом состоянии. Товары могут быть из разных посылок. В одном возврате могут быть не все товары из первоначальной посылки. Первоначальная посылка могла быть доставлена другой службой доставки. Предзаказ - Информация о еще не переданных на доставку посылках. 6 Расположение Веб-сервисы Hermes-DPD расположены по адресу: Тестовая версия: o Описание всех сервисов – https://test-api.hermes-dpd.ru o Partner API o SOAP https://test-api.hermes-dpd.ru/ps/soapservice.svc?wsdl https://test-api.hermes-dpd.ru/ps/soapservice.svc?singlewsdl o REST https://test-api.hermes-dpd.ru/ps/restservice.svc?wsdl https://test-api.hermes-dpd.ru/ps/restservice.svc?singlewsdl o Тестовая учетная запись пользователь – testlogin, пароль – testpassword через GetParcels доступны посылки до даты 2014-08-12 для проставления статусов используйте штрих-коды посылок, получив их через метод GetParcels Производственная версия: o Описание всех сервисов – https://api.hermes-dpd.ru o Partner API o SOAP https://api.hermes-dpd.ru/ps/soapservice.svc?wsdl https://api.hermes-dpd.ru/ps/soapservice.svc?singlewsdl o REST https://api.hermes-dpd.ru/ps/restservice.svc?wsdl https://api.hermes-dpd.ru/ps/restservice.svc?singlewsdl В качестве транспортного протокола используется https протокол. Авторизация пользователей производится по паре логин-пароль. Для получения логина и пароля необходимо обратиться в отдел продаж компании Hermes-DPD. Авторизация для всех сервисов идентична. 7 Модуль Partner API Обработка статусов посылки Метод SendParcelStatuses Описание Данный метод предназначен для изменения статусов посылки. Передаются посылки с массивом проставляемых статусов. Если установка статуса посылки неудачна, то остальные статусы по текущей посылке не будут проставлены. Входные параметры Параметр Описание Тип parcelStatusData Массив записей с ParcelStatusData[] информацией о статусах в посылках Выходные параметры Параметр ParcelStatusDataResult Обязательный Да Описание Тип Массив результатов. ParcelStatusDataResult Один результат по каждой посылке. Пример См. описание используемых типов данных Пример См. описание используемых типов данных 8 Обработка посылок Метод GetParcels Описание Данный метод предназначен для получения данных по посылкам, которые планируется передать партнеру по доставке и выдаче посылок. Алгоритм работы с методом 1. При первом вызове необходимо передать в параметре dateFrom текущую дату 2. Далее гарантируется передача всех посылок без потерь, при условии, что параметр dateFrom будет содержать значение, возвращенное в параметре NextRequestDateFrom из предыдущего вызова метода, а параметр dateTo будет пустым Входные параметры Параметр Описание dateFrom Дата и время, от которой необходимо получить данные. Крайне рекомендуется передавать полный формат даты с указанием UTC, здесь в примере + 3 часа 30 минут, подробнее о формате здесь partnerPointCodes Массив кодов партнёрских пунктов выдачи. Рекомендуется использовать для фильтрации результатов dateTo Дата и время окончания периода, за который необходимо вернуть данные. Обычно должно быть пустым. Необходимо заполнять, только если нужны данные за старые периоды из-за сбоя на стороне партнёра. Тип DateTime Обязательный Да String[] Нет Nullable DateTime Нет Пример 2014-0717T23:59:59.000+05:00 9 Выходные параметры Параметр ParcelDataResult Описание Тип Массив результатов. ParcelDataResult[] Один результат по каждой посылке. Пример См. описание используемых типов данных Объектная модель ParcelStatusData Параметр ParcelBarcode Описание Номер посылки в системе B2C Статусы посылки. Необходимо передавать статусы, которые наследуются от Status Зарезервированные дополнительные параметры для поддержки различных версий текущего API Тип String(1..40) Обязательный Да Status[] Да ExtraParam[] Нет Тип Status[] Обязательный Пример Нет Status Нет ErrorMessage OperationResult Описание Успешно проставленные статусы Статус, который вызвал ошибку Текст ошибки Результат операции String (0..1024) Integer Нет Да ParcelBarcode Штрих-код посылки String(1..40) Да Statuses ExtraParams Пример 12345678901234 ParcelStatusDataResult Параметр SuccessStatuses FailStatus См. список ошибок 0 - Success -1..n - ErrorCode 12345678901234 ParcelDataResult Параметр NextRequestDateFrom Описание Тип Дата окончания периода, за который DateTime переданы данные. Необходимо сохранять эту дату в системе партнёра и передавать в следующем запросе данных по посылкам в параметре dateFrom Пример 2014-03-17T21:49:19.000 10 ParcelData Массив записей с информацией о ParcelData[] посылках ParcelData Параметр CashOnDeliveryCurrency Описание Тип Валюта стоимости (Доступны только рубли) посылки String(1..3) Описание CurrencyCode RemainingCashOnDeliveryValue Остаток суммы, который Double необходимо внести получателю при получении посылки. Если посылка предоплачена полностью, значение будет равным 0, если частично, то будет указана сумма, которую необходимо внести покупателю при получении. CashOnDeliveryValue Стоимость, от которой вычисляется Double остаток RemainingCashOnDeliveryValue. Необходимо сохранять для последующей передачи в статусе «Выдана» Сustomer Данные о получателе Customer CustomStoragePeriod Количество дней хранения посылки Integer в ПВЗ. DeliveryAddress Адрес, по которому необходимо Address произвести выдачу посылки получателю TransitAddress Адрес, по которому происходит Address передача посылки партнеру ExtraParams Зарезервированные ExtraParam[] дополнительные параметры для поддержки различных версий текущего API InsuranceCurrency Валюта страховой стоимости String(1..3) посылки (Доступны только рубли) Описание CurrencyCode InsuranceValue Страховая стоимость посылки. Эту Double сумму должен вернуть партнер при утере посылки ParcelBarcode Штрих-код посылки String(1..40) ParcelHeight Высота посылки, см Integer ParcelLength Длина посылки, см Integer ParcelWeight Вес посылки, гр Integer ParcelWidth Ширина посылки, см Integer Пример RUB 1000.00 (Разделитель – всегда точка) 1000.00 (Разделитель – всегда точка) 14 RUB 1000.00 (Разделитель - всегда точка) 12345678901234 10 30 1000 15 Customer Параметр FirstName Описание Имя получателя Тип String(0..60) Пример Иван 11 MobilePhoneNumber Номер мобильного получателя. телефона String (0..20) +7-903-123-44-55 Address Параметр FullAddress Описание Полный адрес одной строкой Тип String(0..512) ApartmentNumber Номер квартиры или офиса получателя Номер дома или владения получателя Город получателя Строение дома получателя Код страны Корпуса дома получателя Номер адреса выдачи в системе Hermes-DPD Номер адреса выдачи в системе партнёра Регион получателя Название улицы получателя Тип улицы получателя Район получателя Индекс получателя String(0..10) Пример 190031, СанктПетербург, канала Грибоедова наб., д.42 102 String(0..10) String(0..60) String(0..10) String(3) String(0..10) String 15 Санкт-Петербург 3 RUS Б 901569 String GS-429R String(0..60) String(0..60) String(0..60) String(0..60) String(0..20) Московская обл. Тверская проспект Пушкинский район 170019 BuildingNumber City ConstructionNumber CountryCode FrameNumber PointCode PartnerPointCode Region Street StreetType Subregion ZipCode Status Абстрактный статус посылки. Не предназначен для передачи в запросе Параметр Описание ExtraParams Массив зарезервированных ExtraParam[] дополнительных параметров для поддержки различных версий текущего API и передачи вспомогательных данных от партнёра Системное наименование String (1..128) статуса Дата и время проставления DateTime статуса в ISO 8601 формате, крайне рекомендуется передавать полный формат даты с указанием UTC, здесь в примере + 3 часа 30 минут, подробнее о формате здесь StatusSystemName StatusTimestamp Тип Обязатель ный Нет Пример Да ARRIVED_AT_PARCEL_S HOP 2014-0717T23:59:59.000+03:30 Да 12 CarrierStatus : Status Статус доставки. Используется для передачи статусов во время транспортировки или доставки посылки. Параметр CarrierOrderNumber CarrierParcelNumber CarrierPickupDate CarrierOtherOrderNumber CarrierOtherParcelNumber PlanDeliveryDate ParcelPhysicalWeight ParcelVolume ParcelVolumeWeight ParcelPayWeight ParcelLength ParcelWidth ParcelHeight CarrierTerminalCode IncidentCode Consignee Описание Номер заказа в информационной системе доставщика Номер посылки в информационной системе доставщика Дата приёма груза в ISO 8601 формате Номер повторного заказа в системе доставщика. (заполняется в том случае, если по одному и тому же клиентскому номеру посылки в системе доставщика существует два заказа – например, при заказе на возврат посылки) Номер посылки при повторном заказе в системе доставщика (заполняется в том случае, если по одному и тому же клиентскому номеру посылки в системе доставщика существует два заказа – например, при заказе на возврат посылки) Планируемая дата доставки для контракта в ISO 8601 формате Физический вес (кг.) Объем (м3) Объемный вес (кг.) посылки Платный вес посылки(кг.) Длина (см.) посылки Ширина (см.) посылки Высота (см.) посылки Код сортировочного центра доставщика, на котором произошел переход Код инцидента, произошедшего при переходе состояния Фактический получатель посылки (передается только со статусом Delivered) Тип String (1..255) Обязательный Нет Пример String (1..255) Нет DateTime Нет String (1..255) Нет String (1..255) Нет DateTime Нет 2014-0717T23:59:59.000 int int int int int int int String (1..255) Нет Нет Нет Нет Нет Нет Нет Нет 2 String (1..255) Нет String (1..255) Нет 2014-0717T23:59:59.000 13 ParcelShopStatus : Status Статус посылки с пунктом выдачи, стандартный статус для передачи. Если этот статус не предназначен для передачи с наименованием статуса «принята в пункте выдачи» (RECEIVED). Параметр PartnerPointCode Описание Тип Номер пункта выдачи в системе String партнёра (1..255) Обязательный Да Пример MSC-045 ParcelShopSignStatus : ParcelShopStatus Статус посылки с электронной подписью покупателя. Используется при проставлении статусов отказа от посылки. Электронную подпись можно не указывать, если вы не можете ее передать. Параметр SignatureBytes Описание Тип Массив байтов Byte[] электронной подписи – изображение подписи получателя посылки Обязательный Пример Нет ParcelShopSignWithPaymentStatus : ParcelShopSignStatus Статус посылки с оплатой. Используется при проставлении статусов: принята в пункте выдачи (RECEIVED). Электронную подпись можно не указывать, если вы не можете ее передать. Параметр CashReceiptNumber Описание Номер чека оплаты PaymentCode Системное наименование оплаты CurrencyCode Системное наименование валюты оплаты Сумма оплаты, которую необходимо заплатить Значение, которое нужно взять из первоначальной переданной информации о посылке через GetParcels. Наименование полей совпадает. Массив байтов электронной подписи – изображение подписи получателя посылки PaymentValue CashOnDeliveryValue SignatureBytes Тип String (0..16) String Обязательный Пример Нет BILLXHF56643A Да COD String Да RUB Double Нет 150.45 (разделитель - точка!) Double Нет 1500 (разделитель - точка!) Byte[] Нет ExtraParam Параметр Name Value Описание Наименование параметра Значение параметра Тип String String Пример SomeExtraParam 9ABC000 14 CurrencyCode Код валюты, тип значения - строка Значение RUB Описание Рубли PaymentCode Тип оплаты, тип значения - строка Значение COD Описание Наложенный платёж 15 Список доступных статусов посылок для проставления Название на русском Принята в пункте выдачи Выдана Отправлена на терминал (возврат) Инвентаризирована Потеряна Отказ платить Посылка повреждена Повторная посылка Неверное содержимое Доставлена на терминал доставщика Название на английском ARRIVED_AT_PARCEL_SHOP RECEIVED UNDELIVERED INVENTORIED MISSING REFUSED_BY_CUSTOMER_REFUSED_TO_PAY REFUSED_BY_CUSTOMER_DAMAGED REFUSED_BY_CUSTOMER_DUPLICATE_PARCELS REFUSED_BY_CUSTOMER_WRONG_CONTENT ARRIVED_AT_TERMINAL_DELIVERY Тип статуса ParcelShopStatus ParcelShopSignWithPaymentStatus ParcelShopStatus ParcelShopStatus ParcelShopStatus ParcelShopSignStatus ParcelShopSignStatus ParcelShopSignStatus ParcelShopSignStatus CarrierStatus 16 Обработка ошибок В процессе работы с веб-сервисами возможно возникновение ошибок, по техническим причинам или причинам, продиктованных бизнес правилами. Коды ошибок, а также причины и действия по их устранению, описаны в следующем разделе. Коды ошибок Код ошибки Системное наименование Описание Причина InternalServiceFault Внутренняя ошибка сервера DeserializationFailed Внутренняя ошибка десериализации на сервере AuthenticationError Ошибка пользователя -1 CommonFail Ошибочный результат 0 Success Успешный результат 11 NoSufficientRights У текущего пользователя недостаточно прав. 14 ParcelBarcodeIsNotFound 20 StringLength 21 Required 28 Deserialization Штрих-код посылки [{ParcelBarcode}] не найден Поле {[StringField]} должно быть строкой с длиной от {[MinLength]} до {[MaxLength]} символов Поле [{RequiredField}] должно быть обязательно для заполнения Ошибка десериализации объекта 30 Range Возникает при неизвестных или неверных действиях процессов SOAP - сервиса Возникает при попытке передать запрос неверного формата, сервер не может десериализовать объект. Возникает, когда лоиг или пароль не верны, нет доступа к сервису, или возникают другие ошибки, запрещающие работу с сервисом Возникает при неизвестных ошибках, ошибках общего характера или внутренних ошибок сервера Данный код возвращается в параметре ErrorCode в случае успешного результата обработки запроса. Код не является ошибкой. Возникает при отправке посылок на доставку, в этом случае нужно связаться с техподдержкой Hermes-DPD, см. раздел Контакты Штрих-код посылки не найден в системе Возникает, если строковое значения поле не соответствует указанной длине Возникает, если не было заполнено обязательное для заполнения поле Проверьте ваш запрос на наличие ошибок, прочитайте рекомендации к запросам Значение поля находится вне допустимого диапазона авторизации Поле {[Field]} должно быть в диапазоне от {[MinRange]} до {[MaxRange]} 17 31 UnknownStatus Неизвестный статус 32 ManagementStatus Ошибка обработки статуса в системе 33 ApplyStatus Ошибка системного статуса 34 UnknownStatusPartnerPointCode Ошибка применения в статусе неизвестного номера адреса доставки применения наименования Возникает при попытке указать несуществующий статус Означает, что при обработке статуса возникла ошибка. При передаче статуса указан несопоставимое системное наименование статуса. Используйте таблицу Список доступных статусов посылок для проставления для решения ошибки Исправьте номер на корректный. Указанный номер не существует или недоступен. Обработка ошибок SOAP-сервисом 1) При возникновении исключительной ситуации сервер вернет стандартную ошибку с системным наименованием ошибки и описанием, например <s:Fault> <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:Deseri alizationFailed</faultcode> <faultstring xml:lang="ru-RU">The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter https://api.hermes-dpd.ru/WS/:{parameter}. The InnerException message was 'Invalid {parameter type} value '?' cannot be deserialized into type '{parameter type name}' ….</faultstring> </s:Fault> 2) При возникновении необработанной ошибки сервер вернет внутреннюю ошибку, например <s:Fault> <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:Int ernalServiceFault</faultcode> <faultstring xml:lang="ru-RU">The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the &lt;serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.</faultstring> </s:Fault> Обработка ошибок REST-сервисом 1) В зависимости от того, в каком формате передаются данные (xml/json), ошибки будут возвращены в том же формате. 18 2) В зависимости от типа возвращаемого значения вызываемого метода ошибка может содержаться внутри элемента массива возвращаемого типа, например, при вызове SendParcelStatuses сервер вернул результат без ошибки, но в объекте есть информация об ошибке a. XML <ArrayOfParcelStatusDataResult xmlns="http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <ParcelStatusDataResult><ErrorCode>ParcelBarcodeIsNotFound</ErrorCode><ErrorMessage>Штри х-код посылки 9900018544xxx не найден</ErrorMessage><OperationResult>1</OperationResult><FailStatus i:nil="true"/><ParcelBarcode>9900018544xxx</ParcelBarcode><SuccessStatuses i:nil="true"/></ParcelStatusDataResult> <ParcelStatusDataResult><ErrorCode>UnknownStatus</ErrorCode><ErrorMessage>Неизвестные статусы посылок: RECEIVxxxED</ErrorMessage><OperationResult>1</OperationResult><FailStatus i:nil="true"/><ParcelBarcode>99000185441555</ParcelBarcode><SuccessStatuses i:nil="true"/></ParcelStatusDataResult></ArrayOfParcelStatusDataResult> b. JSON [{"OperationResult":-1,"ErrorMessage":"Штрих-код посылки 9900018544xxx не найден","ErrorCode":14,"SuccessStatuses":null,"FailStatus":null,"ParcelBarcode":"9900018544xxx"} ,{"OperationResult":-1,"ErrorMessage":"Неизвестные статусы посылок: RECEIVxxxED","ErrorCode":31,"SuccessStatuses":null,"FailStatus":null,"ParcelBarcode":"990001854 41555"}] При возникновении исключительной ситуации сервер вернет следующие ошибки c. XML <Error><Status>500</Status><Name>DeserializationFailed</Name><Code>1</Code><Message>The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation '{method}'. Start element ' {badXmlNode}' does not match end element '{correctXmlNode}'. Line 1, position 2128.</Message></Error> d. JSON {"Code":28,"Message":"Deserialization object error, check your request ","Name":"Deserialization","Status":500} 3) При возникновении необработанной ошибки сервер вернет следующие ошибки a. XML <Error><Status>500</Status><Name>CommonFail</Name><Code>-1</Code><Message>Internal Server Error</Message></Error> b. JSON {"Code":-1,"Message":"Internal Server Error","Name":"CommonFail","Status":500} 19 Контакты Все вопросы: sales.B2C@hermes-dpd.ru Технические вопросы: it.integration@hermes-dpd.ru. 20 Примеры подключения и вызова Запросы для SOAP-сервиса Основные замечания при составлении и отправки JSON-запросов сервису Запрос должен содержать передаваемые свойства объекта в алфавитном порядке, начиная от базового типа, затем наследуемого. Иначе при десериализации часть значений будет утеряна или считаться пустой, за информацией обращайтесь к описанию сервиса по WSDL. К средам, которые автоматически формируют запрос, это не относится. Явный пример такого поведения можно получить в SoapUI или в чистом запросе. Консольное приложение на C# 1.1. Добавить Service Reference 1.2. Исходный код 1.2.1. Пример вызова методов сервиса using using using using System; System.Net; System.ServiceModel; PartnerAPIConsoleApplication.HermesPartnerApiSvc; namespace PartnerAPIConsoleApplication { class Program { static void Main(string[] args) 21 { //apply any server certificate ServicePointManager.ServerCertificateValidationCallback += delegate { return true; }; var client = new SoapServiceClient(); client.ClientCredentials.UserName.UserName = "testlogin"; client.ClientCredentials.UserName.Password = "testpassword"; //random sign var rnd = new Random(); var sampleSignature = new Byte[10000]; rnd.NextBytes(sampleSignature); //receive timeout set 3 min client.Endpoint.Binding.ReceiveTimeout = new TimeSpan(0,3,0); //set max receive data size ((BasicHttpBinding)client.ChannelFactory.Endpoint.Binding).MaxReceivedMessageSize = int.M axValue; ((BasicHttpBinding)client.ChannelFactory.Endpoint.Binding).MaxBufferSize = int.MaxValue; var resultGetParcels = client.GetParcels(new DateTime(2015, 05, 01), new[] { "soPS4" }, n ull); var data = new[] { new ParcelStatusData { ParcelBarcode = "10009900000326", Statuses = new Status[] { new ParcelShopStatus { PartnerPointCode = "soPS4", StatusSystemName = "ARRIVED_AT_PARCEL_SHOP", StatusTimestamp = "2015-03-02", ExtraParams = new[] { new ExtraParam { Name = "CellNo", Value = "CL354523" } }, }, new ParcelShopSignWithPaymentStatus { CurrencyCode = "RUB", PaymentCode = "COD", PaymentValue = 1000.5, CashOnDeliveryValue = 2000, CashReceiptNumber = "CASHBON1", PartnerPointCode = "soPS4", StatusSystemName = "RECEIVED", StatusTimestamp = "2015-03-04", SignatureBytes = sampleSignature } } } }; var resultSendParcelStatuses = client.SendParcelStatuses(data); client.Close(); } } } Выполнение запросов через SoapUI 1.1. Добавить SOAP проект 22 1.2. Чтобы выполнить запрос, нужно сделать следующее 1.2.1. указать входные параметра для метода запроса, 1.2.2. учетную запись в параметрах запроса (Username, Password) 1.2.3. Authentication Type = Preemtive 1.2.4. WSS-Password Type = PasswordText 1.2.5. Для корректной передачи ExtraParams убедитесь, что для каждого ExtraParam 1.2.6. Для корректной передачи статусов нужно использовать конкретное указание типа. 1.2.6.1. Добавить неймспейс xmlns:i=http://www.w3.org/2001/XMLSchema-instance 1.2.6.2. Добавить атрибут в элемент статуса 1.2.6.2.1. <b2c:ParcelShopSignStatus i:type="b2c:ParcelShopSignWithPaymentStatus"> 1.2.6.2.2. <b2c:ParcelShopSignStatus i:type="b2c:ParcelShopSignStatus"> 1.2.6.2.3. <b2c:ParcelShopStatus i:type="b2c:ParcelShopStatus"> Ниже запрос из SoapUI, обратите внимание, что сначала идут поля базовых типов по алфавиту, затем наследованные также в алфавитном порядке. 23 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:b2c="http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="https://api.hermes-dpd.ru/WS/"> <soapenv:Header /> <soapenv:Body> <ws:SendParcelStatuses> <ws:parcelStatusData> <b2c:ParcelStatusData> <b2c:ParcelBarcode>10009900000326</b2c:ParcelBarcode> <b2c:Statuses> <!--Zero or more repetitions:--> <b2c:Status i:type="b2c:ParcelShopSignStatus"> <!--Optional:--> <b2c:ExtraParams> <ExtraParam> <Name>CellNo</Name> <Value>CL987010</Value> </ExtraParam> </b2c:ExtraParams> <b2c:StatusSystemName>REFUSED_BY_CUSTOMER_WRONG_CONTENT</b2c:StatusSystemName> <b2c:StatusTimestamp>2015-08-23</b2c:StatusTimestamp> <!--ParcelShopStatus fields--> <b2c:PartnerPointCode>soPS4</b2c:PartnerPointCode> </b2c:Status> </b2c:Statuses> </b2c:ParcelStatusData> <b2c:ParcelStatusData> <b2c:ParcelBarcode>10009900000326</b2c:ParcelBarcode> <b2c:Statuses> <!--Zero or more repetitions:--> <b2c:Status i:type="b2c:ParcelShopStatus"> <!--Optional:--> <b2c:ExtraParams> <ExtraParam> <Name>CellNo</Name> <Value>CL354523</Value> </ExtraParam> </b2c:ExtraParams> <b2c:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</b2c:StatusSystemName> <b2c:StatusTimestamp>2015-08-27</b2c:StatusTimestamp> <!--ParcelShopStatus fields--> <b2c:PartnerPointCode>soPS4</b2c:PartnerPointCode> </b2c:Status> <b2c:Status i:type="b2c:ParcelShopSignWithPaymentStatus"> <b2c:ExtraParams i:nil="true" /> <b2c:StatusSystemName>RECEIVED</b2c:StatusSystemName> <b2c:StatusTimestamp>2015-03-04</b2c:StatusTimestamp> <!--ParcelShopStatus fields--> <b2c:PartnerPointCode>soPS4</b2c:PartnerPointCode> <!--ParcelShopSignStatus fields--> <b2c:CashOnDeliveryValue>2000</b2c:CashOnDeliveryValue> <b2c:CashReceiptNumber>CASHBON1</b2c:CashReceiptNumber> 24 <b2c:CurrencyCode>RUB</b2c:CurrencyCode> <b2c:PaymentCode>COD</b2c:PaymentCode> <b2c:PaymentValue>1000.5</b2c:PaymentValue> <!-- <b2c:SignatureBytes i:nil="true"/> --> <b2c:SignatureBytes>iVBORw0KGgoAAAANSUhEUgAAAOgAAABgCAIAAACYKKmaAAAAAXNSR0IArs4c6QAAAARnQU1BAACx jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABOVJREFUeF7tmlty5CAMRWf2v+hM ujrp8mAM4qUHnPwG0OXqoJax/359ff3hDwfCOfANLn84EM6BP+EUIxgHXm0CLuBARAcAN2LW0EzFhYGYDlBxY+bteNWAezwC MQ0A3Jh5O1414B6PQEwDADdm3o5XDbjHIxDTAMCNmbfjVQPuC4HrFybHIxHDAMBNP46LkbfjVQLuD7jHkxDMAMAF3GDIvuUC LuACbkgHADdk2qi4gAu4Dw58Xza59eZzEeZWIcKyDmgg9YbDZwI8a/PpmBNVGjy5hYNy64TCDhmAq+FAR2KYUnZAI23OKy6I RHQAcDUciEiGc80aaaPiOocgojzA1XAgIhnONSulzed1mNufAufQeJCnB+4Iu4vurQDXA4J9GgKAu+4rb8Dtg8bDLO/grqP2 9Wmc41d6HuDwrME1uIs6hE8+ANczmvYvIPpqmw61184bjgNx7LTirqY2e5YAF3BTB5qYUKD2Dq5O0EBkOJfqseI2Ud7tbxJF J2i3WiYmDrgDV63yAW7ow+ALXDVqn1qF0Lk8SrwjcDWpdQWu8sb34FsJ3OqNmH7yPLQK19crI6/E92CxaRcuwNWnNjlICgKy 52Rp3L0fN+3BXZq8ytuX31e+Cjm+hrgW2qYyIxx8QiE3BvdOrQJD91e+I0GFcz/DVh/UhNpdOxBLcLMplORVyEq1Po1XJjkl wliDW0vcG1ytaqDhAHfgfrrPQqmYlQ8JTIWDdP1X9de/OuANwX1rkpN8/w15Ws0QtbmhzcAt56OM5gpwn2zNAvdEYUGYkL/7 MOHEu/7uiXMJW7SaMbhVXLID7v1iUp6FZMtTmyz4tH4VXEkW7+2HXOd1faEJEkkOxzgFt3zvm01ta87kNGRHZrFYBG71Fvy0 cvsyRPMwNdWAKgRJ3U02Imk2hOzKGW3aYJPzrSu3jm8S42FwbHALjyDlX/N7s9HatNzXFx6Dvqx3gNgxpU+bySy/4BbsSBAp VMRr75s0GFfor8PuLUf2v7M6UXnWW0FsHS9X4mHktuAmfeGVs2xTkdCZpfxp4tJa+wnaCqKOKiuI9we3gGzCxFMRtcpNU9ee FbkxuyHBzVbTcuaemoGkYZBQbsVxa8UtPABYbWFi3B3AfXM80RSfSwHuf48fmknqs75QSjXFm8fqc69vlvlmqwK0C9Ws0rhr Pqp3KdWMCm9FmtZxOFgb3FkWAG7ZScmtyKxcmKwDuCa29wRtOqsb3yf8PHT2WOhgTlMWHeidI+HMXecfcuY4qr7KmSk8c9eA q368ZgcE3I+j9Liz4Vq5HuBuAu6sy7WVsM1cG3ABdyZPamsBLuCqwTYzEOAC7kye1NYC3PDgfm/gwCweuOWnohD1VkGtyLkK BLg7VFxXSOmIAVzA1SFtchTABdzJSI0vV4Vy++9mmjykx22ya+HgKpfVAQvF+VsacB3l5PoRbSILalNDHOUNKb93fMln4FB7 R4OK6/G4ZMH1KNROE+DaeU/kAQcAd8A8pto5ALh23hN5wAHAHTCPqXYOAK6d90QecABwB8xjqp0DgGvnPZEHHADcAfOYaucA 4Np5T+QBBwB3wDym2jkAuHbeE3nAAcAdMI+pdg4Arp33RB5wAHAHzGOqnQOAa+c9kQccANwB85hq5wDg2nlP5AEHAHfAPKba OQC4dt4TecCBf3O8H45vbEiGAAAAAElFTkSuQmCC</b2c:SignatureBytes> </b2c:Status> </b2c:Statuses> </b2c:ParcelStatusData> </ws:parcelStatusData> </ws:SendParcelStatuses> </soapenv:Body> </soapenv:Envelope> Ответ <?xml version="1.0" encoding="UTF-8"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <s:Header> <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="40e08ad9-1b02-48f8-ba3b-bd17d0ef91a0">eb46a7cc-4d91-4e65-b4ca7ca1abf88e63</ActivityId> <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecuritysecext-1.0.xsd" s:mustUnderstand="1"> <u:Timestamp u:Id="_0"> <u:Created>2015-08-31T11:42:40.744Z</u:Created> <u:Expires>2015-08-31T11:47:40.744Z</u:Expires> </u:Timestamp> </o:Security> </s:Header> <s:Body> <SendParcelStatusesResponse xmlns="https://api.hermes-dpd.ru/WS/"> 25 <SendParcelStatusesResult xmlns:a="http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:ParcelStatusDataResult> <a:ErrorCode>Success</a:ErrorCode> <a:ErrorMessage i:nil="true" /> <a:OperationResult>0</a:OperationResult> <a:FailStatus i:nil="true" /> <a:ParcelBarcode>10009900000326</a:ParcelBarcode> <a:SuccessStatuses> <a:Status i:type="a:ParcelShopSignStatus"> <a:ExtraParams> <ExtraParam xmlns=""> <Name>CellNo</Name> <Value>CL987010</Value> </ExtraParam> </a:ExtraParams> <a:StatusSystemName>REFUSED_BY_CUSTOMER_WRONG_CONTENT</a:StatusSystemName> <a:StatusTimestamp>2015-08-23T00:00:00</a:StatusTimestamp> <a:PartnerPointCode>soPS4</a:PartnerPointCode> <a:SignatureBytes i:nil="true" /> </a:Status> </a:SuccessStatuses> </a:ParcelStatusDataResult> <a:ParcelStatusDataResult> <a:ErrorCode>Success</a:ErrorCode> <a:ErrorMessage i:nil="true" /> <a:OperationResult>0</a:OperationResult> <a:FailStatus i:nil="true" /> <a:ParcelBarcode>10009900000326</a:ParcelBarcode> <a:SuccessStatuses> <a:Status i:type="a:ParcelShopSignWithPaymentStatus"> <a:ExtraParams i:nil="true" /> <a:StatusSystemName>RECEIVED</a:StatusSystemName> <a:StatusTimestamp>2015-03-04T00:00:00</a:StatusTimestamp> <a:PartnerPointCode>soPS4</a:PartnerPointCode> <a:SignatureBytes i:nil="true" /> <a:CashOnDeliveryValue>2000</a:CashOnDeliveryValue> <a:CashReceiptNumber>CASHBON1</a:CashReceiptNumber> <a:CurrencyCode>RUB</a:CurrencyCode> <a:PaymentCode>COD</a:PaymentCode> <a:PaymentValue>1000.5</a:PaymentValue> </a:Status> <a:Status i:type="a:ParcelShopStatus"> <a:ExtraParams> <ExtraParam xmlns=""> <Name>CellNo</Name> <Value>CL354523</Value> </ExtraParam> </a:ExtraParams> <a:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</a:StatusSystemName> <a:StatusTimestamp>2015-08-27T00:00:00</a:StatusTimestamp> <a:PartnerPointCode>soPS4</a:PartnerPointCode> </a:Status> </a:SuccessStatuses> 26 </a:ParcelStatusDataResult> </SendParcelStatusesResult> </SendParcelStatusesResponse> </s:Body> </s:Envelope> «Чистый» XML-запрос К xml-запросу нужно добавить заголовок с авторизацией, и актуализировать дату создания, текст запроса выглядит так Обратите внимание на выделенные неймспейсы <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO" xmlns:ns2="https://api.hermes-dpd.ru/WS/"> <SOAP-ENV:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1"> <wsse:Username>testlogin</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssusername-token-profile-1.0#PasswordText">testpassword</wsse:Password> <wsu:Created>2015-04-30T13:10:00.000Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns2:SendParcelStatuses> <ns2:parcelStatusData> <!-- good --> <ns1:ParcelStatusData> <ns1:ParcelBarcode>10009900000326</ns1:ParcelBarcode> <ns1:Statuses> <!--Zero or more repetitions:--> <ns1:Status i:type="ns1:ParcelShopStatus"> <!--Optional:--> <ns1:ExtraParams> <ExtraParam> <Name>CellNo</Name> <Value>CL354523</Value> </ExtraParam> </ns1:ExtraParams> <ns1:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</ns1:StatusSystemName> <ns1:StatusTimestamp>2015-08-27</ns1:StatusTimestamp> <!--ParcelShopStatus fields--> <ns1:PartnerPointCode>soPS4</ns1:PartnerPointCode> </ns1:Status> <ns1:Status i:type="ns1:ParcelShopSignWithPaymentStatus"> <ns1:ExtraParams i:nil="true" /> <ns1:StatusSystemName>RECEIVED</ns1:StatusSystemName> <ns1:StatusTimestamp>2015-03-04</ns1:StatusTimestamp> 27 <!--ParcelShopStatus fields--> <ns1:PartnerPointCode>soPS4</ns1:PartnerPointCode> <!--ParcelShopSignStatus fields--> <ns1:CashOnDeliveryValue>2000</ns1:CashOnDeliveryValue> <ns1:CashReceiptNumber>CASHBON1</ns1:CashReceiptNumber> <ns1:CurrencyCode>RUB</ns1:CurrencyCode> <ns1:PaymentCode>COD</ns1:PaymentCode> <ns1:PaymentValue>1000.5</ns1:PaymentValue> <!-- <b2c:SignatureBytes i:nil="true"/> --> <ns1:SignatureBytes>iVBORw0KGgoAAAANSUhEUgAAAOgAAABgCAIAAACYKKmaAAAAAXNSR0IArs4c6QAAAARn QU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABOVJREFUeF7tmlty5CAM RWf2v+hMujrp8mAM4qUHnPwG0OXqoJax/359ff3hDwfCOfANLn84EM6BP+EUIxgHXm0CLuBARAcAN2LW0EzFhYGYDlBxY+bt eNWAezwCMQ0A3Jh5O1414B6PQEwDADdm3o5XDbjHIxDTAMCNmbfjVQPuC4HrFybHIxHDAMBNP46LkbfjVQLuD7jHkxDMAMAF 3GDIvuUCLuACbkgHADdk2qi4gAu4Dw58Xza59eZzEeZWIcKyDmgg9YbDZwI8a/PpmBNVGjy5hYNy64TCDhmAq+FAR2KYUnZA I23OKy6IRHQAcDUciEiGc80aaaPiOocgojzA1XAgIhnONSulzed1mNufAufQeJCnB+4Iu4vurQDXA4J9GgKAu+4rb8Dtg8bD LO/grqP29Wmc41d6HuDwrME1uIs6hE8+ANczmvYvIPpqmw61184bjgNx7LTirqY2e5YAF3BTB5qYUKD2Dq5O0EBkOJfqseI2 Ud7tbxJFJ2i3WiYmDrgDV63yAW7ow+ALXDVqn1qF0Lk8SrwjcDWpdQWu8sb34FsJ3OqNmH7yPLQK19crI6/E92CxaRcuwNWn NjlICgKy52Rp3L0fN+3BXZq8ytuX31e+Cjm+hrgW2qYyIxx8QiE3BvdOrQJD91e+I0GFcz/DVh/UhNpdOxBLcLMplORVyEq1 Po1XJjklwliDW0vcG1ytaqDhAHfgfrrPQqmYlQ8JTIWDdP1X9de/OuANwX1rkpN8/w15Ws0QtbmhzcAt56OM5gpwn2zNAvdE YUGYkL/7MOHEu/7uiXMJW7SaMbhVXLID7v1iUp6FZMtTmyz4tH4VXEkW7+2HXOd1faEJEkkOxzgFt3zvm01ta87kNGRHZrFY BG71Fvy0cvsyRPMwNdWAKgRJ3U02Imk2hOzKGW3aYJPzrSu3jm8S42FwbHALjyDlX/N7s9HatNzXFx6Dvqx3gNgxpU+bySy/ 4BbsSBApVMRr75s0GFfor8PuLUf2v7M6UXnWW0FsHS9X4mHktuAmfeGVs2xTkdCZpfxp4tJa+wnaCqKOKiuI9we3gGzCxFMR tcpNU9eeFbkxuyHBzVbTcuaemoGkYZBQbsVxa8UtPABYbWFi3B3AfXM80RSfSwHuf48fmknqs75QSjXFm8fqc69vlvlmqwK0 C9Ws0rhrPqp3KdWMCm9FmtZxOFgb3FkWAG7ZScmtyKxcmKwDuCa29wRtOqsb3yf8PHT2WOhgTlMWHeidI+HMXecfcuY4qr7K mSk8c9eAq368ZgcE3I+j9Liz4Vq5HuBuAu6sy7WVsM1cG3ABdyZPamsBLuCqwTYzEOAC7kye1NYC3PDgfm/gwCweuOWnohD1 VkGtyLkKBLg7VFxXSOmIAVzA1SFtchTABdzJSI0vV4Vy++9mmjykx22ya+HgKpfVAQvF+VsacB3l5PoRbSILalNDHOUNKb93 fMln4FB7R4OK6/G4ZMH1KNROE+DaeU/kAQcAd8A8pto5ALh23hN5wAHAHTCPqXYOAK6d90QecABwB8xjqp0DgGvnPZEHHADc AfOYaucA4Np5T+QBBwB3wDym2jkAuHbeE3nAAcAdMI+pdg4Arp33RB5wAHAHzGOqnQOAa+c9kQccANwB85hq5wDg2nlP5AEH AHfAPKbaOQC4dt4TecCBf3O8H45vbEiGAAAAAElFTkSuQmCC</ns1:SignatureBytes> </ns1:Status> </ns1:Statuses> </ns1:ParcelStatusData> <!-- bad status data: 99000185417543 is not exist --> <ns1:ParcelStatusData> <ns1:ParcelBarcode>99000185417543</ns1:ParcelBarcode> <ns1:Statuses> <ns1:Status i:type="ns1:ParcelShopStatus"> <ns1:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</ns1:StatusSystemName> <ns1:StatusTimestamp>2015-04-28</ns1:StatusTimestamp> <ns1:PartnerPointCode>soPS4</ns1:PartnerPointCode> </ns1:Status> </ns1:Statuses> </ns1:ParcelStatusData> <!-- bad status data: fields required --> <ns1:ParcelStatusData> <ns1:ParcelBarcode>99000185441555</ns1:ParcelBarcode> <ns1:Statuses> <ns1:Status i:type="ns1:ParcelShopSignStatus"> <ns1:StatusSystemName>RECEIVExxD</ns1:StatusSystemName> <ns1:StatusTimestamp>2015-04-28</ns1:StatusTimestamp> </ns1:Status> <ns1:Status i:type="ns1:ParcelShopSignStatus"> <ns1:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</ns1:StatusSystemName> <ns1:StatusTimestamp>2015-04-28</ns1:StatusTimestamp> 28 </ns1:Status> </ns1:Statuses> </ns1:ParcelStatusData> <!-- bad status data: fields required --> <ns1:ParcelStatusData> <ns1:ParcelBarcode>9900018544xxx</ns1:ParcelBarcode> <ns1:Statuses> <ns1:Status i:type="ns1:ParcelShopSignStatus"> <ns1:StatusSystemName>RECEIVED</ns1:StatusSystemName> <ns1:StatusTimestamp>2015-04-28</ns1:StatusTimestamp> </ns1:Status> </ns1:Statuses> </ns1:ParcelStatusData> </ns2:parcelStatusData> </ns2:SendParcelStatuses> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Ответ <?xml version="1.0" encoding="UTF-8"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <s:Header> <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="07f73969-c185-465c-927f-999eb65a5854">a12c6201-10e9-43f8-9c03318648f0933c</ActivityId> <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecuritysecext-1.0.xsd" s:mustUnderstand="1"> <u:Timestamp u:Id="_0"> <u:Created>2015-08-27T12:59:56.917Z</u:Created> <u:Expires>2015-08-27T13:04:56.917Z</u:Expires> </u:Timestamp> </o:Security> </s:Header> <s:Body> <SendParcelStatusesResponse xmlns="https://api.hermes-dpd.ru/WS/"> <SendParcelStatusesResult xmlns:a="http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <a:ParcelStatusDataResult> <a:ErrorCode>Success</a:ErrorCode> <a:ErrorMessage i:nil="true" /> <a:OperationResult>0</a:OperationResult> <a:FailStatus i:nil="true" /> <a:ParcelBarcode>10009900000326</a:ParcelBarcode> <a:SuccessStatuses> <a:Status i:type="a:ParcelShopSignWithPaymentStatus"> <a:ExtraParams i:nil="true" /> <a:StatusSystemName>RECEIVED</a:StatusSystemName> <a:StatusTimestamp>2015-03-04T00:00:00</a:StatusTimestamp> <a:PartnerPointCode>soPS4</a:PartnerPointCode> <a:CashOnDeliveryValue>2000</a:CashOnDeliveryValue> <a:CashReceiptNumber>CASHBON1</a:CashReceiptNumber> <a:CurrencyCode>RUB</a:CurrencyCode> 29 <a:PaymentCode>COD</a:PaymentCode> <a:PaymentValue>1000.5</a:PaymentValue> <a:SignatureBytes>iVBORw0KGgoAAAANSUhEUgAAAOgAAABgCAIAAACYKKmaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw v8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAABOVJREFUeF7tmlty5CAMRWf2v+hMuj rp8mAM4qUHnPwG0OXqoJax/359ff3hDwfCOfANLn84EM6BP+EUIxgHXm0CLuBARAcAN2LW0EzFhYGYDlBxY+bteNWAezwCMQ 0A3Jh5O1414B6PQEwDADdm3o5XDbjHIxDTAMCNmbfjVQPuC4HrFybHIxHDAMBNP46LkbfjVQLuD7jHkxDMAMAF3GDIvuUCLu ACbkgHADdk2qi4gAu4Dw58Xza59eZzEeZWIcKyDmgg9YbDZwI8a/PpmBNVGjy5hYNy64TCDhmAq+FAR2KYUnZAI23OKy6IRH QAcDUciEiGc80aaaPiOocgojzA1XAgIhnONSulzed1mNufAufQeJCnB+4Iu4vurQDXA4J9GgKAu+4rb8Dtg8bDLO/grqP29W mc41d6HuDwrME1uIs6hE8+ANczmvYvIPpqmw61184bjgNx7LTirqY2e5YAF3BTB5qYUKD2Dq5O0EBkOJfqseI2Ud7tbxJFJ2 i3WiYmDrgDV63yAW7ow+ALXDVqn1qF0Lk8SrwjcDWpdQWu8sb34FsJ3OqNmH7yPLQK19crI6/E92CxaRcuwNWnNjlICgKy52 Rp3L0fN+3BXZq8ytuX31e+Cjm+hrgW2qYyIxx8QiE3BvdOrQJD91e+I0GFcz/DVh/UhNpdOxBLcLMplORVyEq1Po1XJjklwl iDW0vcG1ytaqDhAHfgfrrPQqmYlQ8JTIWDdP1X9de/OuANwX1rkpN8/w15Ws0QtbmhzcAt56OM5gpwn2zNAvdEYUGYkL/7MO HEu/7uiXMJW7SaMbhVXLID7v1iUp6FZMtTmyz4tH4VXEkW7+2HXOd1faEJEkkOxzgFt3zvm01ta87kNGRHZrFYBG71Fvy0cv syRPMwNdWAKgRJ3U02Imk2hOzKGW3aYJPzrSu3jm8S42FwbHALjyDlX/N7s9HatNzXFx6Dvqx3gNgxpU+bySy/4BbsSBApVM Rr75s0GFfor8PuLUf2v7M6UXnWW0FsHS9X4mHktuAmfeGVs2xTkdCZpfxp4tJa+wnaCqKOKiuI9we3gGzCxFMRtcpNU9eeFb kxuyHBzVbTcuaemoGkYZBQbsVxa8UtPABYbWFi3B3AfXM80RSfSwHuf48fmknqs75QSjXFm8fqc69vlvlmqwK0C9Ws0rhrPq p3KdWMCm9FmtZxOFgb3FkWAG7ZScmtyKxcmKwDuCa29wRtOqsb3yf8PHT2WOhgTlMWHeidI+HMXecfcuY4qr7KmSk8c9eAq3 68ZgcE3I+j9Liz4Vq5HuBuAu6sy7WVsM1cG3ABdyZPamsBLuCqwTYzEOAC7kye1NYC3PDgfm/gwCweuOWnohD1VkGtyLkKBL g7VFxXSOmIAVzA1SFtchTABdzJSI0vV4Vy++9mmjykx22ya+HgKpfVAQvF+VsacB3l5PoRbSILalNDHOUNKb93fMln4FB7R4 OK6/G4ZMH1KNROE+DaeU/kAQcAd8A8pto5ALh23hN5wAHAHTCPqXYOAK6d90QecABwB8xjqp0DgGvnPZEHHADcAfOYaucA4N p5T+QBBwB3wDym2jkAuHbeE3nAAcAdMI+pdg4Arp33RB5wAHAHzGOqnQOAa+c9kQccANwB85hq5wDg2nlP5AEHAHfAPKbaOQ C4dt4TecCBf3O8H45vbEiGAAAAAElFTkSuQmCC</a:SignatureBytes> </a:Status> <a:Status i:type="a:ParcelShopStatus"> <a:ExtraParams> <ExtraParam xmlns=""> <Name>CellNo</Name> <Value>CL354523</Value> </ExtraParam> </a:ExtraParams> <a:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</a:StatusSystemName> <a:StatusTimestamp>2015-08-27T00:00:00</a:StatusTimestamp> <a:PartnerPointCode>soPS4</a:PartnerPointCode> </a:Status> </a:SuccessStatuses> </a:ParcelStatusDataResult> <a:ParcelStatusDataResult> <a:ErrorCode>ManagementStatus</a:ErrorCode> <a:ErrorMessage>Посылка со штрих-кодом [99000185417543] отсутствует в системе.</a:ErrorMessage> <a:OperationResult>-1</a:OperationResult> <a:FailStatus i:type="a:ParcelShopStatus"> <a:ExtraParams i:nil="true" /> <a:StatusSystemName>ARRIVED_AT_PARCEL_SHOP</a:StatusSystemName> <a:StatusTimestamp>2015-04-28T00:00:00</a:StatusTimestamp> <a:PartnerPointCode>soPS4</a:PartnerPointCode> </a:FailStatus> <a:ParcelBarcode>99000185417543</a:ParcelBarcode> <a:SuccessStatuses /> </a:ParcelStatusDataResult> <a:ParcelStatusDataResult> <a:ErrorCode>ParcelBarcodeIsNotFound</a:ErrorCode> <a:ErrorMessage>Штрих-код посылки 9900018544xxx не найден</a:ErrorMessage> <a:OperationResult>-1</a:OperationResult> <a:FailStatus i:nil="true" /> 30 <a:ParcelBarcode>9900018544xxx</a:ParcelBarcode> <a:SuccessStatuses i:nil="true" /> </a:ParcelStatusDataResult> <a:ParcelStatusDataResult> <a:ErrorCode>ApplyStatus</a:ErrorCode> <a:ErrorMessage>Unknown status partner point code detected: RECEIVExxD — ;ARRIVED_AT_PARCEL_SHOP —</a:ErrorMessage> <a:OperationResult>-1</a:OperationResult> <a:FailStatus i:nil="true" /> <a:ParcelBarcode>99000185441555</a:ParcelBarcode> <a:SuccessStatuses i:nil="true" /> </a:ParcelStatusDataResult> <a:ParcelStatusDataResult> <a:ErrorCode>UnknownStatus</a:ErrorCode> <a:ErrorMessage>Неизвестные статусы посылок: RECEIVExxD</a:ErrorMessage> <a:OperationResult>-1</a:OperationResult> <a:FailStatus i:nil="true" /> <a:ParcelBarcode>99000185441555</a:ParcelBarcode> <a:SuccessStatuses i:nil="true" /> </a:ParcelStatusDataResult> <a:ParcelStatusDataResult> <a:ErrorCode>ApplyStatus</a:ErrorCode> <a:ErrorMessage>Ошибка применения системых имен статусов: ARRIVED_AT_PARCEL_SHOP</a:ErrorMessage> <a:OperationResult>-1</a:OperationResult> <a:FailStatus i:nil="true" /> <a:ParcelBarcode>99000185441555</a:ParcelBarcode> <a:SuccessStatuses i:nil="true" /> </a:ParcelStatusDataResult> </SendParcelStatusesResult> </SendParcelStatusesResponse> </s:Body> </s:Envelope> Запрос можно выполнить на любых онлайн-сервисах soap-клиентов, например, на http://wsdlbrowser.com 31 Запросы для REST-сервиса Пример всех запросов XML/JSON для основных типовых методов сервиса вы найдете в этом разделе. Основная рекомендация – используйте JSON, с запросами в XML слишком много ограничений и условий. Основные замечания при составлении и отправки JSON-запросов сервису 1. Запрос должен содержать все свойства объекта в алфавитном порядке (см пример запроса), иначе при десериализации часть значений будет утеряна, за информацией обращайтесь к описанию сервиса по WSDL. 2. При наследовании нужно указывать в объекте намёк на тип через свойство __type. Значение представляет собой строку JSON вида "DataContractName:DataContractNamespace" (все до первого двоеточия является именем), например { __type : “ParcelShopStatus:http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO”} Существует упрощенный вариант { __type : “ParcelShopStatus:#B2C.PartnerAPI.DTO”} Обратите внимание, что намек на тип объекта в JSON-представлении должен стоять на первом месте. Это единственный случай, когда порядок пар "ключ/значение" в обработке JSON имеет значение. Дополнительную информацию на эту тему можно найти на сайте MSDN. Основные замечания при составлении и отправки XML-запросов сервису 1. Все имена вызываемых методов должны быть указаны с учетом регистра, как они описаны в WSDL. 2. Запрос должен содержать все свойства объекта в алфавитном порядке (см пример запроса), иначе при десериализации часть значений будет утеряна, за информацией обращайтесь к описанию сервиса по WSDL 3. При формировании любого запроса нужно указывать неймспейс xmlns="https://api.hermesdpd.ru/WS/rest" в качестве атрибута элемента с именем = наименованию вызываемого метода 4. Дополнительный неймспейс i (наименование может быть любое) xmlns:i="http://www.w3.org/2001/XMLSchema-instance" необходим для простых атрибутов, например, для отметки пустых значений элементов, особенно для дат, в элементе нужно добавить атрибут i:nil="true" 5. Дополнительный неймспейс a (наименование может быть любое) xmlns:a=" http://schemas.microsoft.com/2003/10/Serialization/Arrays" в качестве атрибута нужен для передачи массива значений в качестве параметра 6. Для комплексных объектов, такие как Status, необходимо указать неймспейс B2C xmlns:b2c=http://schemas.datacontract.org/2004/07/B2C.PartnerAPI.DTO 32 Запросы (XML/JSON) на JavaScript (JQuery) Откройте файл, вложенный в документ. В нем описаны примеры вызовов REST-сервиса через JSON и через XML rest_partner.html Примеры доступны на сайте http://test-api.hermes-dpd.ru/rest_partner.html 33 Приложение