【问题标题】:Fedex Web Services (SOAP): Pickup ServiceFedex 网络服务 (SOAP):取件服务
【发布时间】:2013-03-27 21:48:30
【问题描述】:

我正在尝试使用取件服务安排取件。首先我发送 Pickup Availability 请求以获取截止时间,然后使用我在 Pickup Request 中获得的结果。但在那之后,我收到错误“截止时间后的就绪时间”,显然是在截止时间之前。在我的示例中,返回的截止时间是 16:00,但我可以安排取件的最晚时间是 11:00。 部分取件可用性响应:

<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

UPD:更多细节根据cmets中的讨论

这就是写的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>

文档说取件可用性的时间戳是根据当地 TZ 使用的(取自邮政编码)。本地 TZ 是 PST,与 UTC 有 -07:00 的偏移量。取件可用性回复中还有一行指示处理我的取件可用性请求的时间。我检查并看到它也在 PST 中,所以这一步看起来工作正常: &lt;v3:RequestTimestamp&gt;2013-03-26T11:58:37&lt;/v3:RequestTimestamp&gt;

所以我得到了太平洋标准时间 16:00 的截止时间,下一步是使用创建取件请求将实际取件时间安排在不迟于截止时间的时间。对于这个请求ReadyTimestamp 应该包含 TZ 信息,所以我尝试了不同的日期/时间格式。因此,如果我想为太平洋标准时间 14:00 创建取件,我会尝试 2013-04-09T21:00:002013-04-09T21:00:00.000Z2013-04-09T21:00:00+00:002013-04-09T14:00:00-07:00。在所有这些情况下,我都会收到错误Ready Time after Cutoff Time。我尝试了许多不同的值,发现它的最新工作时间是 04:00 PST(与 11:00 UTC 相同)。所以 04:00 给了我success 和 04:01 给了Ready Time after Cutoff Time 并且它适用于任何日期/时间格式。

【问题讨论】:

  • 您在请求中发送的时间格式是否正确?我看到了&lt;ns1:ReadyTimestamp&gt;2013-04-02T13:00:00&lt;/ns1:ReadyTimestamp&gt;,他们想这样接收吗?抱歉,我从未使用过 FedEx 的 API,但我想我会做一些挖掘工作,因为您在这个问题上没有采取太多行动。
  • @zjd 您好,感谢您关注我的问题。我对 SOAP 没有太多经验,据我所知,日期时间字段应该以这种方式格式化,或者也可以包含毫秒。首先,我认为毫秒在这种情况下是无关紧要的。他们还在回复中发送请求时间戳,并且格式相同。为了 100% 确定我尝试了所有可能的组合,我现在将尝试以毫秒为单位。
  • 是的,与日期“2013-04-02T14:00:00.000Z”相同
  • 可能是时区问题?
  • @zjd 我不这么认为,根据文档,请求和回复中的所有日期都以取货地址的时区提供。因此,即使我的时区有问题,请求和回复中的日期也应该相互匹配。

标签: php soap fedex


【解决方案1】:

您是否注意到page 76上的示例 CreatePickupRequest 中的ReadyTimestamp

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

timezone code 一起给出。

UPD。您可以在 github 中查看 php fedex api wrapper 或从 phpclasses 中查看 fedex api wrapper

【讨论】:

  • 不确定您的意思。我在取件请求中使用OriginDetail/ReadyTimeStamp,在取件可用性请求中使用PackageReadyTime。根据 PDF 文档看起来不错。
  • 您提到要发出Pickup Availability 请求 table 32,但您正在使用Pickup Availability 请求 table 26中的元素/跨度>
  • pastebin 上检查了您的请求,是的,您是对的——您使用了正确的元素
  • 刚刚看到您关于时区代码的评论。我以前在那里见过 TZD,但你让我更专注地看着它。所以首先我注意到可用性请求不应该包含任何 TZ 信息,并且日期应该在本地 TZ 中。所以我在两个请求中都这样做了。现在我检查并发现它是不对的,因为取货请求指令没有此注释并且包含 TZD。因此,与在本地 TZ 中具有日期的可用性请求不同,看起来取货请求应包含 UTC 日期。本地 TZ 是 PST,所以我可能应该再检查一次。谢谢。
  • 由于某种原因,它没有为ReadyTimestamp 明确指定,但所有其他时间戳都被指定为包含 TZ 信息。 发货时间戳 The date format must be YYYY-MM-DDTHH:MM:SS-xx:xx. The time must be in the format: HH:MM:SS using a 24-hour clock. The date and time are separated by the letter T, such as 2009-06-26T17:00:00. The UTC offset indicates the number of hours/minutes, for example xx:xx from UTC, such as 2009-06-26T17:00:00-05:00 is defined as June 26, 2009 5:00 p.m. Eastern Time. See Appendix L: “Time Zones” for more information about time zones
【解决方案2】:

createPickup 请求中的ReadyTimestamp 以时间戳为值

示例:“ReadyTimestamp”:“1404891463”

这会起作用

【讨论】:

    【解决方案3】:

    如果你想在WebService请求中传递Date,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);
    

    【讨论】:

      【解决方案4】:

      您必须有以下区别: a- 包裹准备好时 b-截止时间 c- 公司关门时间。

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

      我的建议。公司关门时间为 19:00,fedex 最迟取件时间通常为所有邮政编码的 17hs。那两个是因为当您要求取件时,面包车快递员有 2 小时去那个地方,如果您的公司关闭时间距离取件请求只有 1 小时,您会遇到问题。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多