2

我正在尝试为我在 codeigniter 中构建的购物车开发一个 USPS 费率计算器。我在从 USPS 测试服务器及其 api 获得成功响应时遇到问题。我已经打电话给我的问题,显然,他们不想为任何试图创建自定义解决方案的人提供任何支持。为了让它更加混乱,他们告诉我,我需要知道的所有内容都可以在他们的Development Guide v3.pdf中找到,但他们在其中声明:

第 3 步:从测试服务器运行“预制”测试

适用

的 API:全部 下一步是测试您的 API 接口。作为注册的 API 用户,您已被授予访问 Shipping API 测试服务器的权限。重要说明:测试服务器设置为仅接受预定义 XML 事务的子集,并返回本文档中提供的预定义 XML 响应。

如果您已经成功测试了您的 API 并且可以访问生产服务器,请跳过此步骤并继续执行第 5 步:从生产服务器运行“示例”。

这里的问题是它们没有提供任何“预定义 XML 事务的子集”,如所述。他们确实提供了测试样本,但它们似乎是为生产服务器设计的,您只能访问您在测试服务器上成功测试的乳清(在下面的脚本中,我有一个我尝试失败的样本)。因此,我参考了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 还说使用您的浏览器。您可以执行此操作以查看您可以期望返回的内容。

我刚刚注册测试这个......似乎至少有一个例子被打破了。但是这个例子适用于我的浏览器:

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。因此,您必须将示例与 USPS 在注册电子邮件中提供的测试 URL 融合在一起。

无论如何,请查看上面的 URL 并让您的代码与您在浏览器中获得的输出相匹配。一旦这工作,告诉他们你是 LIVE,然后你将可以访问生产 URL 和价格查询 API。

于 2012-05-01T18:01:03.933 回答