API USPS — использование curl и codeigniter

Я пытаюсь разработать калькулятор ставок USPS для корзины, которую я создаю в codeigniter. У меня проблемы с получением успешных ответов от тестового сервера USPS и их API. Я позвонил со своими проблемами, и, по-видимому, они не хотят оказывать какую-либо поддержку любому, кто пытается создать собственное решение. Чтобы сделать это еще более запутанным, они сказали мне, что все, что мне нужно знать, можно найти в их Руководство по разработке v3.pdf, но в нем указано:

Шаг 3. Запустите «стандартный» тест с тестового сервера

Применимые API: все

Следующим шагом является тестирование интерфейсов API. Как зарегистрированный пользователь API вы получили доступ к тестовому серверу API доставки. Важное примечание: тестовый сервер настроен так, чтобы принимать только подмножество предопределенных транзакций XML и возвращать предопределенные ответы XML, указанные в этом документе.

Если вы уже успешно протестировали свой API и имеете доступ к рабочему серверу, пропустите этот шаг и перейдите к шагу 5. Запустите «образцы» с рабочего сервера.

Проблема здесь в том, что они не предоставляют ни одного из подмножеств предопределенных транзакций XML, как указано. Они предоставляют тестовые образцы, но, похоже, они предназначены для рабочего сервера, доступ к которому вы получаете только после успешного тестирования на тестовом сервере (в приведенном ниже сценарии у меня есть один из этих образцов, который я безуспешно пробовал). Поэтому я ссылаюсь на Калькуляторы тарифов USPS v1-5-1. pdf, где вам дадут образцы конкретных тестовых транзакций. В лучшем случае я бы получил сообщение об ошибке:

<Error>
<Number>80040b1a</Number>
<Description>Authorization failure. You are not authorized to connect to this server.    </Description>
<Source>UspsCom:: DoAuth</Source>
</Error>

Я знаю, что люди решили это, здесь есть несколько закрытых вопросов, подобных этому, но ни один из них не показывает решения. Мой код следует:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Usps_curl extends CI_Controller {

    public function index()
    {
        
        $devurl = "testing.shippingapis.com/ShippingAPITest.dll";
        $puburl = "https://secure.shippingapis.com/ShippingAPITest.dll";
        
        $service = "RateV4";

//      ALTHOUGH THE USPS DEV GUIDE V3 SAYS 

//      $xml = '<RateV4Request USERID="225XXXXX5943">
//      <Revision>2</Revision>
//      <Package ID="1">
//          <Service>PRIORITY</Service>
//          <Container>FLAT RATE BOX</Container>
//          <ZipOrigination>20012</ZipOrigination>
//          <ZipDestination>20007</ZipDestination>
//          <Pounds>1</Pounds>
//          <Ounces>0.0</Ounces> 
//          <Size>REGULAR</Size> 
//      </Package>
//      </RateV4Request>';

//  THIS IS AN EXACT EXAMPLE PROVIDED IN THE USPS DEV GUIDE V3 - BUT I BELIEVE IT IS ONE OF THE FOUR "CANNED" TEST FOR THE PRODUCTION SERVER

//$xml = '<AddressValidateRequest USERID="225XXXXX5943">
//          <Address ID="0">
//              <Address1></Address1>
//              <Address2>6406 Ivy Lane</Address2>
//              <City>Greenbelt</City>
//              <State>MD</State>
//              <Zip5></Zip5>
//              <Zip4></Zip4>
//              </Address>
//          </AddressValidateRequest>';


//      THIS IS THE SAMPLE CODE FROM USPS RATE CALCULATORS V1-5-1 PDF

        $xml = rawurlencode('<RateV4Request USERID="225XXXXX5943">
        <Revision>2</Revision>
        <Package ID="1ST">
        <Service>FIRST CLASS</Service>
        <FirstClassMailType>LETTER</FirstClassMailType>
        <ZipOrigination>44106</ZipOrigination>
        <ZipDestination>20770</ZipDestination>
        <Pounds>0</Pounds>
        <Ounces>3.5</Ounces>
        <Container/>
        <Size>REGULAR</Size>
        <Machinable>true</Machinable>
        </Package>
        <Package ID="2ND">
        <Service>PRIORITY</Service>
        <ZipOrigination>44106</ZipOrigination>
        <ZipDestination>20770</ZipDestination>
        <Pounds>1</Pounds>
        <Ounces>8</Ounces>
        <Container>NONRECTANGULAR</Container>
        <Size>LARGE</Size>
        <Width>15</Width>
        <Length>30</Length>
        <Height>15</Height>
        <Girth>55</Girth>
        <Value>1000</Value>
        <SpecialServices>
        <SpecialService>1</SpecialService>
        </SpecialServices>
        </Package>
        <Package ID="3RD">
        <Service>ALL</Service>
        <ZipOrigination>90210</ZipOrigination>
        <ZipDestination>96698</ZipDestination>
        <Pounds>8</Pounds>
        <Ounces>32</Ounces>
        <Container/>
        <Size>REGULAR</Size>
        <Machinable>true</Machinable>
        <ShipDate>13-Dec-2010</ShipDate>
        </Package>
        </RateV4Request>');

        
        $request = $devurl . "?API=" . $service . "&xml=" . $xml;

//      echo "<pre>";
//      print_r($request);
//      die;
                
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $request);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_HTTPGET, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        
        
        
        $response = curl_exec($ch);
        curl_close($ch);
        
//      echo "<pre>";
//      print_r($response);
//      echo "</pre>";
        
    }
}

/* End of file usps_curl.php */
/* Location: ./application/controllers/usps_curl.php */

Как видите, я прокомментировал и закомментировал различные строки. Я пробовал каждый из них с rawurlencode, urlencode и без кодировки, но ничего не работает. Будем признательны за любую помощь/предложения!

Я знаю, что я должен быть близок, потому что иногда я получаю правильное сообщение об ошибке, но я должен что-то упустить здесь!


person docMojoman    schedule 30.04.2012    source источник


Ответы (1)


Этот ответ об ошибке просто сообщает, что вы не авторизованы для этого API.

Я думаю, вам нужно протестировать, используя тестовые примеры, которые они предоставляют. Как только они заработают, ваш API заработает, и вы сможете получить доступ к производственным API.

curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER , false );
curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST , false );

также будет важно, чтобы игнорировать ошибки сертификата (USPS делает то же самое в своем примере кода - они устанавливают объект ActiveX для игнорирования ошибок сертификата).

В PDF также говорится, что нужно использовать браузер, если клиент не работает. Вы можете сделать это, чтобы увидеть, что вы можете ожидать в качестве возврата.

Я только что зарегистрировался, чтобы проверить это... Кажется, по крайней мере один пример не работает. Но этот пример работает в моем браузере:

http://testing.shippingapis.com/ShippingAPITest.dll?API=CityStateLookup&XML=<CityStateLookupRequest USERID="xxxxxxx"><ZipCode ID= "0"><Zip5>90210</Zip5></ZipCode></CityStateLookupRequest> 

(заменить идентификатор пользователя)

<CityStateLookupResponse>
<ZipCode ID="0">
<Zip5>90210</Zip5>
<City>BEVERLY HILLS</City>
<State>CA</State>
</ZipCode>
</CityStateLookupResponse>

Дело в примерах: вы должны использовать соответствующий тестовый сервер в зависимости от того, является ли он SSL API. Все, что содержит адрес, должно использовать SSL. Таким образом, вы должны объединить примеры с тестовым URL-адресом, предоставленным USPS в регистрационном письме.

В любом случае, проверьте приведенный выше URL-адрес и сделайте так, чтобы ваш код соответствовал выводу, который вы получаете в браузере. Как только это сработает, скажите им, что вы в РЕЖИМЕ, и тогда вы получите доступ к производственным URL-адресам и API поиска цен.

person stormdrain    schedule 01.05.2012
comment
ливневая канализация, ты молодец! Спасибо, что поставили меня на правильный путь! Я нашел руководство USPS несколько загадочным и растерялся! - person docMojoman; 01.05.2012
comment
Я смог получить успешные ответы во всех трех тестах, которые я пробовал (из Dev Guide v3), после добавления дополнительных параметров curl. - person docMojoman; 01.05.2012