【发布时间】:2014-09-16 17:03:54
【问题描述】:
我们正在尝试测试联合包裹服务(UPS)“Quantum”接口测试获取订单状态信息。我们让跟踪号 API 正常工作,但 QVEvents 出现了问题。
UPS“出境订阅帐户”已设置、激活并与我的帐号相关联。用户访问 Quantum View 数据视图在用户设置屏幕中被选中。顺便说一句,我已经让 Tracking API 使用类似的代码,所以认为我可以排除用户名或密码问题。这两个 API 在操作上有什么不同吗? (例如:SSL 要求、HTTP 标头设置?)
以下是对我有用的跟踪 API(“Tack by Waybill”)代码:
<?php
// UPS Tracker API - track specfic Waybill
// DEV server
$access = '99999999399999999';
$userid = '9999999';
$passwd = '999999999999';
$endpointUrl = 'https://www.ups.com/ups.app/xml/Track';
$outFileName = './XOLTResult.xml';
// Note: you need at least a UPS DEV account to test this
$data ="<?xml version=\"1.0\"?><AccessRequest xml:lang='en-US'>
<AccessLicenseNumber>$access</AccessLicenseNumber>
<UserId>$userid</UserId>
<Password>$passwd</Password>
</AccessRequest>
<?xml version=\"1.0\"?>
<TrackRequest>
<Request>
<TransactionReference>
<CustomerContext>
<InternalKey>hello</InternalKey>
</CustomerContext>
<XpciVersion>1.0</XpciVersion>
</TransactionReference>
<RequestAction>Track</RequestAction>
</Request>
<TrackingNumber>9999999999999999</TrackingNumber>
</TrackRequest>";
$ch = curl_init("https://www.ups.com/ups.app/xml/Track");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_TIMEOUT, 60);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result=curl_exec ($ch);
$data = strstr($result, '<?');
$xml=simplexml_load_string($data);
echo "<pre>";
print_r($xml);
这里是给出错误消息的 Quantum API 代码...
<?php
// UPS Quantum API ("Show list of recent tracking information")
// DEV server
$access = '99999999399999999';
$userid = '9999999';
$passwd = '999999999999';
$endpointUrl = 'https://wwwcie.ups.com/ups.app/xml/QVEvents'; // URL for testing Quantum
$outFileName = './XOLTResult.xml';
try
{
$data ="<?xml version=\"1.0\"?>
<AccessRequest xml:lang=\"en-US\">
<AccessLicenseNumber>$access</AccessLicenseNumber>
<UserId>$userid</UserId>
<Password>$passwd</Password>
</AccessRequest>
<?xml version=\"1.0\"?>
<QuantumViewRequest xml:lang=\"en-US\">
<Request>
<TransactionReference>
<CustomerContext>Test XML</CustomerContext>
<XpciVersion>1.0007</XpciVersion>
</TransactionReference>
<RequestAction>QVEvents</RequestAction>
<IntegrationIndicator></IntegrationIndicator>
</Request>
</QuantumViewRequest>";
$postData = array
(
'content' => $data
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_URL,$endpointUrl);
curl_setopt($ch, CURLOPT_VERBOSE, 1 );
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // disable SSL verification if not installed
//curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSLVERSION, 3); // use Secure Socket v3 SSL3
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'SSLv3');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postData);
if( ! $result = curl_exec($ch))
{
trigger_error(curl_error($ch));
}
echo $result;
$data = strstr($result, '<?');
$xml=simplexml_load_string($data);
echo "<pre>";
print_r($xml);
}
catch(Exception $ex)
{
echo ($ex . "!");
}
curl_close($ch);
这是实际发送给 UPS 的 XML... [注意双 xml 标头是他们要求的,它适用于所有其他 API,所以不要怪我]
<?xml version="1.0"?>
<AccessRequest xml:lang="en-US">
<AccessLicenseNumber>999</AccessLicenseNumber>
<UserId>999</UserId>
<Password>999</Password>
</AccessRequest>
<?xml version="1.0"?>
<QuantumViewRequest xml:lang="en-US">
<Request>
<TransactionReference>
<CustomerContext>Test XML</CustomerContext>
<XpciVersion>1.0007</XpciVersion>
</TransactionReference>
<RequestAction>QVEvents</RequestAction>
<IntegrationIndicator></IntegrationIndicator>
</Request>
</QuantumViewRequest>
错误信息如下所示:
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Fri, 25 Jul 2014 22:50:57 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: application/xml
<QuantumViewResponse><Response><TransactionReference><XpciVersion>1.0</XpciVersion>
</TransactionReference><ResponseStatusCode>0</ResponseStatusCode>
<ResponseStatusDescription>Failure</ResponseStatusDescription><Error>
<ErrorSeverity>Hard</ErrorSeverity><ErrorCode>10001</ErrorCode>
<ErrorDescription>The XML document is not well formed</ErrorDescription></Error>
</Response></QuantumViewResponse><pre>
我没有使用 UPS SCA_SDO 库,因为它不会安装在我的 PC 上。也许我应该再看一遍,但我的程序员向我保证这不是必要的,也与这个问题无关。双重堆叠的 XML 看起来很可疑,但手册说这是 UPS 想要的方式。我猜 UPS 会根据请求运行预处理器。
【问题讨论】:
-
发送给 UPS 的 XML 是什么样的?你能把那个贴出来吗?不过我注意到一件事,你的
$data变量中有两次<?xml version=\"1.0\"?>。一次在开头,一次在您的AccessRequest节点之后。 -
将在 $data 中添加 XML.... 双 XML:这是标准的 UPS 愚蠢行为。他们似乎对它进行了预处理。见stackoverflow.com/questions/20294168/…
-
正如@Andy 指出的那样, $data =" 会给你一个格式错误的错误,因为你的引号搞砸了。格式错误基本上意味着你的开始和结束标签不匹配
标签: php xml web-services ups