Структура массива для указания Fedex One Rate с помощью Fedex API RateService

У меня есть работающий запрос на получение расценок на мои отправления с использованием стандартных тарифов Fedex, но я хочу использовать специальную опцию Fedex One Rate, чтобы получить их фиксированные расценки.

К сожалению, их пример кода не показывает, как указать, что запрос на ставку должен использовать Fedex One Rate, и я совершенно не смог мысленно проанализировать xml-блевотину, которая является WSDL. Я пробовал несколько различных структур массива для передачи (что я предполагаю) являются правильными переменными, но ничего не работает.

Я сгенерировал две HTML-версии WSDL, используя сторонние генераторы (ни один из них не очень полезен, но, возможно, вы можете читать их лучше, чем я).

Первый включает непосредственно wsdl с типами данных, связанными с их определениями: http://inadaydevelopment.com/stackoverflow/fedex/RateService_v16.html

Второй более простой, он просто обеспечивает более линейную иерархию с допустимыми значениями на каждом уровне: http://inadaydevelopment.com/stackoverflow/fedex/RateService_v16_other.html

Насколько я могу судить, есть два способа/места, которыми я могу заявить, что я хочу, чтобы в моей котировке использовалась Единая ставка:

1) $request['VariableOptions'] = 'FEDEX_ONE_RATE';

а также

2) $request['RequestedShipment']['SpecialServicesRequested'] = array(
    'SpecialServiceTypes' => array('FEDEX_ONE_RATE')
);

Когда я использую (1), я получаю ответ об успехе, который включает в себя список цен, но это не цены One Rate. Это стандартные цены.

Когда я использую (2), я получаю ответ об ошибке:

stdClass Object
(
    [HighestSeverity] => WARNING
    [Notifications] => stdClass Object
        (
            [Severity] => WARNING
            [Source] => crs
            [Code] => 556
            [Message] => There are no valid services available. 
            [LocalizedMessage] => There are no valid services available. 
        )

    [TransactionDetail] => stdClass Object
        (
            [CustomerTransactionId] =>  *** Service Availability Request v5.1 using PHP ***
        )

    [Version] => stdClass Object
        (
            [ServiceId] => crs
            [Major] => 16
            [Intermediate] => 0
            [Minor] => 0
        )

)

Если я использую и (1), и (2), то я получаю сообщение об ошибке (2), а также дополнительное предупреждение о том, что я указал одну скорость двумя разными способами и что (2) собирается переопределить (1).

Вот мой полный массив запросов:

array (
  'WebAuthenticationDetail' => 
  array (
    'UserCredential' => 
    array (
      'Key' => 'xxx',
      'Password' => 'xxx',
    ),
  ),
  'ClientDetail' => 
  array (
    'AccountNumber' => 'xxx',
    'MeterNumber' => 'xxx',
  ),
  'TransactionDetail' => 
  array (
    'CustomerTransactionId' => ' *** Service Availability Request v5.1 using PHP ***',
  ),
  'Version' => 
  array (
    'ServiceId' => 'crs',
    'Major' => '16',
    'Intermediate' => '0',
    'Minor' => '0',
  ),
  'ReturnTransitAndCommit' => true,
  'RequestedShipment' => 
  array (
    'DropoffType' => 'STATION',
    'ShipTimestamp' => '2015-06-14T14:13:46-07:00',
    'Shipper' => 
    array (
      'Contact' => 
      array (
        'PersonName' => 'Kenny Wyland',
        'CompanyName' => 'K2 Cashflow',
        'PhoneNumber' => 'xxxxxxxxxx',
      ),
      'Address' => 
      array (
        'StreetLines' => 
        array (
          0 => 'xxxx E xxxxx St',
        ),
        'City' => 'Long Beach',
        'StateOrProvinceCode' => 'CA',
        'PostalCode' => '90805',
        'CountryCode' => 'US',
      ),
    ),
    'Recipient' => 
    array (
      'Contact' => 
      array (
        'PersonName' => 'Bob Smith',
        'PhoneNumber' => 'xxx-xxx-xxxx',
      ),
      'Address' => 
      array (
        'StreetLines' => 
        array (
          0 => 'xxxxx xxxxxxx Rd',
        ),
        'City' => 'Corona',
        'StateOrProvinceCode' => 'CA',
        'PostalCode' => '92883',
        'CountryCode' => 'US',
        'Residential' => true,
      ),
    ),
    'ShippingChargesPayment' => 
    array (
      'PaymentType' => 'SENDER',
      'Payor' => 
      array (
        'ResponsibleParty' => 
        array (
          'AccountNumber' => 'xxxx',
          'Contact' => NULL,
          'Address' => 
          array (
            'CountryCode' => 'US',
          ),
        ),
      ),
    ),
    'PackageCount' => '1',
    'RequestedPackageLineItems' => 
    array (
      0 => 
      array (
        'SequenceNumber' => 1,
        'GroupPackageCount' => 1,
        'Weight' => 
        array (
          'Value' => 0.01,
          'Units' => 'LB',
        ),
      ),
    ),
    'SpecialServicesRequested' => 
    array (
      'SpecialServiceTypes' => 
      array (
        0 => 'FEDEX_ONE_RATE',
      ),
    ),
  ),
)

person Kenny Wyland    schedule 12.06.2015    source источник
comment
Вы проверили следующий документ: fedex .com/templates/components/apps/wpor/secure/downloads/pdf/. В соответствии с ним (пункт 2.4.4) необходимо указать также вид упаковки и вид услуги.   -  person VolenD    schedule 15.06.2015
comment
Это, кажется, проблема. Если вы можете опубликовать это как ответ (в идеале с фрагментом кода), я бы наградил вас наградой.   -  person Kenny Wyland    schedule 17.06.2015
comment
Можете ли вы дать окончательный массив запросов?   -  person Amrish Prajapati    schedule 25.10.2018


Ответы (1)


Документ https://www.fedex.com/templates/components/apps/wpor/secure/downloads/pdf/201408/RateServicesWSDLGuide_v2014.pdf, в пункте 2.4.4 указано, что существует несколько требований для получения цены One Rate:

  1. Укажите «FEDEX_ONE_RATE» ShipmentSpecialService.

Который у вас уже есть (тот, который вы используете, указан в FedEx Freight Priority и FedEx Freight Economy, пункт 2.2.4.1).

Следующее требование:

  1. Укажите один из следующих типов упаковки:

FEDEX_SMALL_BOX

....

В коде должно быть:

$request['RequestedShipment']['PackagingType'] = 'FEDEX_SMALL_BOX';

После этого идет третье требование:

  1. Укажите пункт отправления в США и пункт назначения в США.

Который у вас уже есть в вашем коде.

И четвертое требование:

  1. Укажите одну из следующих услуг FedEx Express:

FIRST_OVERNIGHT

...

Что в коде:

$request['RequestedShipment']['ServiceType'] = 'FIRST_OVERNIGHT';

Также обратите внимание на примечание в конце:

*Примечание. Клиенты веб-сервисов могут запрашивать как тарифы One Rate, так и тарифы на основе веса (не One Rate) в одном RateRequest, указав «FEDEX_ONE_RATE» в качестве ServiceOptionType в RateRequest.variableOptions.

person VolenD    schedule 17.06.2015
comment
Как указать FEDEX_ONE_RATE ShipmentSpecialService. ? это $request['RequestedShipment']['ShipmentSpecialService'] = 'FEDEX_ONE_RATE'; - person Rahul PK; 20.03.2018