forecho 的独立博客

把生命浪费在美好的事物上

MWS 开发 - 订单篇

2019年07月08日

引言

最近这几个月都在帮一个朋友在开发亚马逊 ERP 系统,使用了 MWS 接口,自己一路摸索,花了不少时间和精力,现在想把这些经验记录分享出来,让大家少走一些弯路。

这将是一系列文章,本篇主要讲与订单相关的接口。

SDK

MWS 的接口文档在这里(中文文档不是最新的)查看,但是官方给的 PHP SDK 非常的老了,而且每个功能模块还是分散的,于是我就去 Github 找到了 Star 最多的一个,即 meertensm/amazon-mws,好用是好用,但是我使用之前没发现作者好像没维护了,有一些坑在里面。

好在这些坑我都帮你踩过了,你接着往下看就可以了。

订单相关的功能

同步订单

订单列表

文档地址:ListOrders

1
2
3
4
5
6
7
8
9
10
$client = new MCS\MWSClient([
    'Marketplace_Id' => '',
    'Seller_Id' => '',
    'Access_Key_ID' => '',
    'Secret_Access_Key' => '',
    'MWSAuthToken' => '' // Optional. Only use this key if you are a third party user/developer
]);
$fromDate = new DateTime('2016-01-01');
$states = ['Unshipped','PartiallyShipped','Shipped','PendingAvailability','Pending','InvoiceUnconfirmed','Canceled','Unfulfillable'];
$client->ListOrders($fromDate, false, $states);

SDK 的 ListOrders() 默认的 states 只有两个状态。

订单商品

要想获取订单里的商品信息要调用 ListOrderItems()

订单商品的属性和图片

要想获取订单商品里的属性和图片信息得调用 GetMatchingProductForId(),商品属性目前应该只有 SizeColor

注意:如果接口返回 Request is throttled,那你就要考虑接口频率问题了,详情就得查看文档《限制:针对提交请求频率的限制》了。

发货

思路

发货是一个异步接口,流程就是先创建一个类型为 _POST_ORDER_FULFILLMENT_DATA_SubmitFeed,获取到一个 FeedSubmissionId,然后稍候通过另外一个接口传 FeedSubmissionId 查询发货结果。

实践

坑的是前面提到的 meertensm/amazon-mws 库作者没有实现发货方法,提了 PR 作者也没时间管了,所以我自己实现了。

  • 先创建一个 core/replace/MWSClient.php 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
/**
 * author     : forecho <caizhenghai@gmail.com>
 * createTime : 2019/6/11 9:53 PM
 * description:
 */

namespace app\core\helpers;

use Exception;

class MWSClient extends \MCS\MWSClient
{
    /**
     * Sets the shipping status of an order
     * @param array $data required data
     * @return array feed submission result
     * @throws Exception
     */
    public function setDeliveryState(array $data)
    {
        if (!isset($data["shippingDate"])) {
            $data["shippingDate"] = date("c");
        }

        if (!isset($data["carrierCode"]) && !isset($data["carrierName"])) {
            throw new Exception('Missing required carrier data');
        }

        $feed = [
            'MessageType' => 'OrderFulfillment',
            'Message' => [
                'MessageID' => rand(),
                "OrderFulfillment" => [
                    "AmazonOrderID" => $data["orderId"],
                    "FulfillmentDate" => $data["shippingDate"]
                ]
            ]
        ];
        $fulfillmentData = [];


        if (isset($data["carrierCode"])) {
            $fulfillmentData["CarrierCode"] = $data["carrierCode"];
        } elseif (isset($data["carrierName"])) {
            $fulfillmentData["CarrierName"] = $data["carrierName"];
        }

        if (isset($data["shippingMethod"])) {
            $fulfillmentData["ShippingMethod"] = $data["shippingMethod"];
        }


        if (isset($data["trackingCode"])) {
            $fulfillmentData["ShipperTrackingNumber"] = $data["trackingCode"];
        }

        if (sizeof($fulfillmentData) > 0) {
            $feed["Message"]["OrderFulfillment"]["FulfillmentData"] = $fulfillmentData;
        }
        $feed = $this->SubmitFeed('_POST_ORDER_FULFILLMENT_DATA_', $feed);

        return $feed;
    }
}
  • 然后修改第一步调用 MWSClient 类的时候使用我们自己的类:
1
2
3
4
5
6
7
$client = new app\core\helpers\MWSClient([
    'Marketplace_Id' => '',
    'Seller_Id' => '',
    'Access_Key_ID' => '',
    'Secret_Access_Key' => '',
    'MWSAuthToken' => '' // Optional. Only use this key if you are a third party user/developer
]);
  • 这样之后我们就可以这样发货了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$client->setDeliveryState([
    "orderId" => 3456342,
    "carrierCode" => "UPS",
    "trackingCode" => "34JD943T6",
    "shippingMethod" => "1 Day",
]);

$client->setDeliveryState([
    "orderId" => 3456342,
    "carrierName" => "Mini transporters A.C.",
    "trackingCode" => "34JD943T6",
]);

$client->setDeliveryState([
    "orderId" => 3456342,
    "carrierName" => "Mini transporters A.C.",
    "trackingCode" => "34JD943T6",
    "shippingDate" => "2018-06-21T12:32:24+02:00"
]);

以上实践代码我是根据 Update order - set delivery state #55 这个 Issues 采坑而来的。

  • 查询发货结果

无论成功或者失败都可以通过 GetFeedSubmissionResult() 方法获取结果。

PS: 可以分享一下我发货采坑的过程:

MWS 对应的接口都会有对应的参数 XMLSchema,是专门用来校验接口传过去的参数,我们可以找一个在线 XML 校验的网站,校验我们要传过去的值是否正确。异步接口调试非常的麻烦,而且亚马逊返回的错误信息又不足够详细。

总结

发现国内使用 MWS 的文档和资料比较少,自己辛辛苦苦踩的坑,当然要分享出来,希望对你有用。

相关文章

扫码关注我的个人公众号