Веб-сервис FedEx для печати нескольких транспортных этикеток

Я пытаюсь подключиться к веб-службе доставки FedEx v8.

Все работает нормально, когда у меня есть только один набор RequestedPackageLineItems. Когда я добавляю два элемента, я получаю следующую ошибку.

«Неверный счетчик пакетов или неверный порядковый номер пакета».

Мой код выглядит следующим образом

ProcessShipmentRequest request = CreatePendingShipmentRequest();
ShipService service = new ShipService();
ProcessShipmentReply reply = service.processShipment(request);
...

private static ProcessShipmentRequest CreatePendingShipmentRequest()
{
    ProcessShipmentRequest request = new ProcessShipmentRequest();

    request.WebAuthenticationDetail = new WebAuthenticationDetail();
    request.WebAuthenticationDetail.UserCredential = new WebAuthenticationCredential();
    request.WebAuthenticationDetail.UserCredential.Key = "XXX"; 
    request.WebAuthenticationDetail.UserCredential.Password = "XXX";            
    request.ClientDetail = new ClientDetail();
    request.ClientDetail.AccountNumber = "XXX";
    request.ClientDetail.MeterNumber = "XXX"; 

    request.TransactionDetail = new TransactionDetail();
    request.TransactionDetail.CustomerTransactionId = "*** Ground Domestic Shipping Request v8 using C# ***";
    request.Version = new VersionId();

    //Inside this method I set request.RequestedShipment.PackageCount = "2";
    SetShipmentDetails(request);
    SetPackageLineItems(request);

    return request;
}

private static void SetPackageLineItems(ProcessShipmentRequest request)
{                   
    request.RequestedShipment.RequestedPackageLineItems = new RequestedPackageLineItem[2];
    request.RequestedShipment.RequestedPackageLineItems[0] = new RequestedPackageLineItem();
    request.RequestedShipment.RequestedPackageLineItems[0].SequenceNumber = "1";
    request.RequestedShipment.RequestedPackageLineItems[0].Weight = new Weight();
    request.RequestedShipment.RequestedPackageLineItems[0].Weight.Value = 50.0M;
    request.RequestedShipment.RequestedPackageLineItems[0].Weight.Units = WeightUnits.LB;
    request.RequestedShipment.RequestedPackageLineItems[0].ItemDescription = "Item";
    request.RequestedShipment.RequestedPackageLineItems[0].Dimensions = new Dimensions();
    request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Length = "108";
    request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Width = "5";
    request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Height = "5";
    request.RequestedShipment.RequestedPackageLineItems[0].Dimensions.Units = LinearUnits.IN;

    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences = new CustomerReference[3];
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[0] = new CustomerReference();
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[0].CustomerReferenceType = CustomerReferenceType.CUSTOMER_REFERENCE;
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[0].Value = "[LOT NUMBER]";
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[1] = new CustomerReference();
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[1].CustomerReferenceType = CustomerReferenceType.INVOICE_NUMBER;
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[1].Value = "45646";
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[2] = new CustomerReference();
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[2].CustomerReferenceType = CustomerReferenceType.P_O_NUMBER;
    request.RequestedShipment.RequestedPackageLineItems[0].CustomerReferences[2].Value = "456446";

    request.RequestedShipment.RequestedPackageLineItems[1] = new RequestedPackageLineItem();
    request.RequestedShipment.RequestedPackageLineItems[1].SequenceNumber = "2";
    request.RequestedShipment.RequestedPackageLineItems[1].Weight = new Weight();
    request.RequestedShipment.RequestedPackageLineItems[1].Weight.Value = 50.0M;
    request.RequestedShipment.RequestedPackageLineItems[1].Weight.Units = WeightUnits.LB;
    request.RequestedShipment.RequestedPackageLineItems[1].ItemDescription = "Item";
    ....
}

person Michael Grassman    schedule 04.06.2010    source источник


Ответы (2)


Узнал как это сделать.

Чтобы получить несколько транспортных этикеток в один PDF-файл, выполните следующие действия.

  1. Создать запрос
  2. Заполните информацию о доставке
  3. Опубликовать и получить ответ.
  4. Сохраните этот повтор, массив байтов и MasterShippingID.
  5. Создайте новый запрос и назначьте ему основной идентификатор доставки.
  6. Добавлен вес и габариты доставки
  7. Опубликовать и получить ответ
  8. Сохранить массив байтов с другим
  9. Продолжайте до тех пор, пока не будут сгенерированы все отправления (максимум 200 на основной идентификатор доставки).
  10. Объедините все PDF-файлы, возвращенные FedEx, в один PDF-файл.
  11. Сделай счастливый танец.
person Michael Grassman    schedule 11.06.2010
comment
Михаил, я вижу ваш ответ. Разве это не становится липким, когда вы делаете много посылок в одной отправке? я имею в виду, если у вас есть 10 пакетов, значит ли это, что вам нужно 10 вызовов веб-сервиса? Нет ли способа собрать все вместе за один или два вызова? Спасибо - person ; 16.07.2010
comment
Если вы можете найти способ, который был бы потрясающим, код от fedex требует нескольких вызовов. Мне это тоже кажется странным. Я помечаю ваш ответ, потому что, на мой взгляд, это был бы лучший способ справиться с этим. - person Michael Grassman; 18.07.2010
comment
Если у вас 10 пакетов, то вам нужно 10 вызовов веб-сервиса, да. Я знаю, что API, кажется, имеет место для нескольких позиций, но он просто не работает, и документация советует вам делать отдельные запросы (передавая мастер-идентификатор для запросов 2-10). Это действительно так глупо, но я не думаю, что они изменят это в ближайшее время. Единственные улучшения, которые они вносят, — это случайная перестановка и переименование элементов в схеме каждые несколько месяцев. (Просто взгляните на V9 и рыдайте.) - person Nicholas Piasecki; 27.08.2010
comment
привет майкл, не могли бы вы добавить сюда пример кода, чтобы ответ стал более понятным - person Zia; 21.02.2014
comment
@MichaelGrassman, не могли бы вы добавить сюда пример кода, передавая основной идентификатор отслеживания? Я не знаю, куда передать эту информацию... - person Morris S; 22.03.2018

Более простой подход (хотя и стоит) — это Shiprush SDK. Он позволяет вам создать один блок XML и позволить ShipRush делать все забавные вещи с fedex (или кем-то еще).

Они также поддерживают свой инструмент.

person Jonesome Reinstate Monica    schedule 14.01.2015