xml - USPS api - 使用curl和codeigniter

标签 xml codeigniter curl shopping-cart usps

我正在尝试为我在 codeigniter 中构建的购物车开发 USPS 费率计算器。我在从 USPS 测试服务器及其 API 获取成功响应时遇到问题。我已经打电话提出了我的问题,显然,他们不想为任何尝试创建自定义解决方案的人提供任何支持。更令人困惑的是,他们告诉我,我需要知道的一切都可以在他们的 Development Guide v3.pdf 中找到。 ,但他们在其中指出:

Step 3: Run “Canned” Test from Test Server

Applicable APIs: All

The next step is to test your API interfaces. As a registered API user you have been granted access to the Shipping API test server. An important note: the test server is set up to only accept a subset of pre-defined XML transactions and return the pre-defined XML responses provided in this document.

If you have already successfully tested your API and have access to the production server, skip this step and proceed to Step 5: Run “Samples” from Production Server.

这里的问题是它们不提供任何所述的“预定义 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 和未编码的方法,但都不起作用。任何帮助/建议将不胜感激!

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

最佳答案

该错误响应只是表明您未获得该 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 并让您的代码与您在浏览器中获得的输出相匹配。一旦成功,告诉他们您已经上线,然后您就可以访问生产 URL 和价格查找 API。

关于xml - USPS api - 使用curl和codeigniter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10391110/

相关文章:

java - Spring/NetBeans - java.io.FileNotFoundException : class path resource [beans. xml] 无法打开,因为它不存在

java - Java 中 XML JDOM 解析器中的 OutOfMemoryError

c# - 读取 XML 时出现异常 - "Namespace Manager or XsltContext needed"

mysql - 如何获取值列在codeigniter 3中的列

java - 加载curl php页面时如何获取java生成的元数据

amazon-web-services - 使用 key 凭证连接到 AWS 中的 elasticsearch

ssl - 通过 TLS 下载时,Curl 在 XP 上出错

xml - 为什么我应该使用 XmlType 而不是关系数据库?

codeigniter - 在 codeigniter 的多行中仅选择一列。如何以及这是否更有效?

php - 结果总数和事件记录中的限制