【问题标题】:USPS api - using curl and codeigniterUSPS api - 使用 curl 和 codeigniter
【发布时间】:2012-05-10 14:11:09
【问题描述】:

我正在尝试为我在 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 和未编码的方式尝试了每一个,但没有一个工作。任何帮助/建议将不胜感激!

我知道我必须很接近,因为我有时会收到正确的错误消息,但我一定在这里遗漏了一些东西!

【问题讨论】:

    标签: xml codeigniter curl shopping-cart usps


    【解决方案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> 
    

    (替换用户ID)

    <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。

    【讨论】:

    • stormdrain,你是大男人!谢谢你让我走上正确的道路!我发现 usps 的手册有些晦涩难懂,并在沮丧中迷失了方向!
    • 在添加额外的 curl 选项后,我能够从我尝试的所有 3 个测试(来自 Dev Guide v3)中获得成功的响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2011-08-21
    相关资源
    最近更新 更多