我正在尝试为我在codeigniter中构建的购物车开发USPS费率计算器。我在从USPS测试服务器及其api获得成功响应时遇到问题。我已经调用了我的问题,显然,他们不想为试图创建自定义解决方案的任何人提供任何支持。为了让它更加混乱,他们告诉我,我需要知道的所有内容都可以在他们的Development Guide v3.pdf中找到,但在其中他们说:
步骤3:从测试服务器
运行“预制”测试适用的API:所有
下一步是测试您的API接口。作为已注册的API用户,您已被授予对Shipping API测试服务器的访问权限。 重要提示:测试服务器设置为仅接受预定义XML事务的子集,并返回本文档中提供的预定义XML响应。
如果您已成功测试API并可以访问生产服务器,请跳过此步骤并继续执行步骤5:从Production Server运行“Samples”。
这里的问题是它们没有提供所述的任何“预定义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&amp;没有编码,但没有工作。任何帮助/建议将不胜感激!
我知道我必须亲近,因为我有时会收到正确的错误信息,但我必须在这里遗漏一些东西!
答案 0 :(得分: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>
(替换用户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。