Краткое описание - Hermes

advertisement
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 <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
Приложение
Download