Fedex网络服务(SOAP):取件服务

9

我正在尝试使用Pickup Service进行预定。首先发送Pickup Availability请求以获取截止时间,然后在Pickup Request中使用结果。但是之后我得到了错误提示“Ready Time after Cutoff Time”,尽管时间显然在截止时间之前。在我的例子中,返回的截止时间是16:00,但我能够安排取货的最晚时间是11:00。

Pickup可用性响应的部分内容:

<v3:ScheduleDay>SAME_DAY</v3:ScheduleDay>
<v3:Available>true</v3:Available>
<v3:PickupDate>2013-04-02</v3:PickupDate>
<v3:CutOffTime>16:00:00</v3:CutOffTime>

产生错误的日程安排获取请求的一部分:

<ns1:ReadyTimestamp>2013-04-02T13:00:00</ns1:ReadyTimestamp>
<ns1:CompanyCloseTime>20:00:00</ns1:CompanyCloseTime>

这里是两个请求的完整请求/响应代码:http://pastebin.com/jqtfsRFc 更新:根据评论中的讨论提供更多细节。

ReadyTimestamp必须不晚于CutOffTime,可通过PickupAvailabilityRequest查询。

因此,我发出了一个取件可用性请求并查看了回复:
<v3:ScheduleDay>SAME_DAY</v3:ScheduleDay>
<v3:Available>true</v3:Available>
<v3:PickupDate>2013-04-09</v3:PickupDate>
<v3:CutOffTime>16:00:00</v3:CutOffTime>

文件说明说,Pickup可用性的时间戳是根据本地时区(从邮政编码中获取)使用的。我们当地的时区是PST,与UTC相差-07:00小时。 Pickup可用性回复中还有一行表明我的Pickup可用性请求被处理的时间。我检查并发现它也在PST中,所以这一步看起来很正常: <v3:RequestTimestamp>2013-03-26T11:58:37</v3:RequestTimestamp> 那么我得到了16:00 PST的截止时间,下一步是使用创建Pickup请求安排实际的取件时间,使其不晚于截止时间。对于此请求,ReadyTimestamp应包含TZ信息,因此我尝试了不同的日期/时间格式。因此,如果我想在14:00 PST之前创建取件,我会尝试2013-04-09T21: 00: 002013-04-09T21:00:00.000Z,< code>2013-04-09T21:00:00+00:00 和2013-04-09T14:00:00-07:00。在所有这些情况下,我都会收到 Ready Time after Cutoff Time 错误。我尝试了许多不同的值,并发现它可以工作的最晚时间是PST 04:00(与UTC 11:00相同)。因此,04:00会给我success,而04:01会给出Ready Time after Cutoff Time,并且它以任何日期/时间格式工作方式都是如此。

1
你发送的请求中的时间格式是否正确?我看到 <ns1:ReadyTimestamp>2013-04-02T13:00:00</ns1:ReadyTimestamp>,这是他们想要接收的方式吗?抱歉,我从未使用过联邦快递的API,但我想深入了解一下,因为你在这个问题上没有得到太多的回应。 - zajd
@zjd 你好,感谢关注我的问题。我对SOAP没有太多经验,据我所见,日期时间字段应该按照这种方式格式化,也可以包含毫秒。首先,我认为毫秒在这种情况下是不相关的。而且他们还在回复中发送请求时间戳,并以相同的方式格式化。为了100%确定,我尝试了所有可能的组合,现在将尝试使用毫秒。 - yefrem
是的,同样的事情与日期“2013-04-02T14:00:00.000Z”。 - yefrem
@zjd 我不这么认为,根据文档,所有请求和回复中的日期都以取件地址的时区提供。因此,即使我的时区有误,请求和回复中的日期也应该相互匹配。 - yefrem
好的,PickupAvailability 请求中有两种 PickupRequestType 类型。请求类型的有效值为:SAME_DAYFUTURE_DAY。您是否尝试使用 FUTURE_DAY 值请求取件可用性?我认为 CutOffTime 可能会有所不同。 - fitheflow
显示剩余7条评论
4个回答

3

您是否注意到在第76页示例CreatePickupRequest中,ReadyTimestamp是什么意思?

<q0:ReadyTimestamp>2011-08-02T08:00:18.282Z</q0:ReadyTimestamp>
<q0:CompanyCloseTime>17:00:00</q0:CompanyCloseTime>

标明了时区代码

更新:您可以从github检查php fedex api wrapper或从phpclasses检查fedex api wrapper


不确定你的意思。在取件请求中我使用“OriginDetail/ReadyTimeStamp”,在取件可用性请求中使用“PackageReadyTime”。根据PDF文档看起来没问题。 - yefrem
你提到想要创建一个“Pickup Availability request” table 32,但是你正在使用“Pickup Availability request” table 26的元素。 - fitheflow
pastebin上检查了您的请求,是的,您是正确的- 您正在使用正确的元素。 - fitheflow
我尝试了不同的组合但仍然没有结果。 尝试过2013-04-08T15:00:00-07:00,也尝试了UTC的相同格式:2013-04-08T22:00:00+00:00,以及之前你提醒过我的PDF表格中的格式:2013-04-08T22:00:00.000Z。 所有的示例都是针对我们当地时区的PST 15:00(这是22:00 UTC)。 我还漏掉了什么吗? - yefrem
它是否仍然显示“截止时间后的准备时间”错误?请将2013-04-08T22:00:00.000Z示例的请求和响应粘贴到pastebin上。 - fitheflow
显示剩余10条评论

2

createPickup请求中的ReadyTimestamp需要使用时间戳作为值

例如:'ReadyTimestamp': '1404891463'

这样就可以正常工作了。


1
如果您想在 WebService 请求中传递日期,WSDL 中的数据类型为 DateTime
class DateTime2 extends DateTime {
    function __toString() { 
        return $this->format("Y-m-d\TH:i:s.000\Z");
    }
}

$date = new DateTime2();

$client = new SoapClient(
    "http://www.myos.it/sp/smartphonelayer.asmx?wsdl", 
    array("trace" => 1)
);

$result = $client->SetReservation(array("RDescription"=>"Giuseppe Silvestri",
                                        "RNumber"=>2,
                                        "RPhoneNumber"=>"3286026817",
                                        "RDate"=>$date.""));

echo "REQUEST:".$client->__getLastRequest()."<br>"; 

print_r($result);

0

你必须区分以下三个时间: a- 包裹准备好的时间 b- 截止时间 c- 公司关门时间。

因此,如果您的邮政编码的截止时间为16:00,则您的包裹必须在该时间之前准备好,并且您的公司必须在之后开放几个小时。

我的建议是把公司关门时间设置为19:00,联邦快递所有邮政编码的最晚取件时间通常为17点。这两个小时是因为当你要求取件时,货车快递员需要2个小时到达那个地方,如果您的公司关门时间距离取件请求仅有1小时,您将会遇到问题。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接