2

codeigniter で構築しているカートの USPS レート計算機を開発しようとしています。USPS テスト サーバーとその API から成功の応答を取得する際に問題が発生しています。私は自分の問題について電話をかけましたが、明らかに、彼らはカスタム ソリューションを作成しようとしている人にサポートを提供したくないようです。さらに混乱させるために、彼らは私が知る必要があることはすべて開発ガイド v3.pdfに記載されていると言いましたが、その中で次のように述べています。

ステップ 3: テスト サーバーから「定型」テストを実行する

該当する API: すべて

次のステップは、API インターフェイスをテストすることです。登録済みの API ユーザーとして、Shipping API テスト サーバーへのアクセスが許可されています。重要な注意: テスト サーバーは、事前定義された XML トランザクションのサブセットのみを受け入れ、このドキュメントで提供されている事前定義された XML 応答を返すように設定されています。

API のテストが完了し、運用サーバーにアクセスできる場合は、この手順をスキップして、手順 5: 運用サーバーから「サンプル」を実行するに進みます。

ここでの問題は、前述の「事前定義された XML トランザクションのサブセット」が提供されないことです。彼らはテストサンプルを提供していますが、テストサーバーでテストに成功したホエイにのみアクセスできる本番サーバー用に設計されているようです(以下のスクリプトでは、失敗したサンプルの1つがあります). そのため、 USPS Rate Calculators 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、およびエンコードされていないもので試しましたが、どれも機能しません。どんな助け/提案も大歓迎です!

ときどき適切なエラー メッセージが表示されるので、近くにいる必要があることはわかっていますが、ここで何かが欠けているに違いありません。

4

1 に答える 1

2

そのエラー応答は、その API に対して認証されていないことを示しているだけです。

彼らが提供するテスト例を使用してテストする必要があると思います。それらが機能すると、API が機能し、本番 API にアクセスできるようになります。

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

また、証明書エラーを無視するためにも重要です (USPS は、サンプル コードで基本的に同じことを行います。ActiveX オブジェクトを証明書エラーを無視するように設定します)。

PDF には、クライアントが機能していない場合はブラウザーを使用するようにも記載されています。これを行うと、何が返されると期待できるかを確認できます。

これをテストするために登録したところです...少なくとも1つの例が壊れているようです。しかし、この例は私のブラウザで動作します:

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

(ユーザー ID を置き換えます)

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

問題は例にあります。SSL API であるかどうかに応じて、適切なテスト サーバーを使用する必要があります。SSL を使用するには、アドレスが含まれているものはすべて必須です。そのため、登録メールで USPS から提供されたテスト URL とサンプルを融合する必要があります。

とにかく、上記の URL を確認して、ブラウザで得られる出力と一致するコードを取得してください。これが機能したら、ライブであることを伝えると、本番 URL と価格検索 API にアクセスできるようになります。

于 2012-05-01T18:01:03.933 に答える