我正在尝试为我在 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 和未编码的方式尝试了每一个,但没有一个工作。任何帮助/建议将不胜感激!
我知道我必须接近,因为我有时会收到正确的错误消息,但我一定在这里遗漏了一些东西!