[PHP] 完整的SPAPI订单下载流程

205 阅读9分钟
一.设计数据表
  • amazon_order(订单表), amazon_order_items(订单商品表)
# 1.订单表
CREATE TABLE `cc_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `amazon_order_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Amazon订单ID',
  `seller_order_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '卖家订单ID',
  `purchase_date` timestamp NULL DEFAULT NULL COMMENT '购买日期',
  `last_update_date` timestamp NULL DEFAULT NULL COMMENT '最后更新日期',
  `order_status` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单状态',
  `fulfillment_channel` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '履行渠道',
  `sales_channel` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '销售渠道',
  `order_channel` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单渠道',
  `ship_service_level` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '配送服务级别',
  `order_total_currency_code` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单总额货币代码',
  `order_total_amount` decimal(10,2) DEFAULT NULL COMMENT '订单总额金额',
  `number_of_items_shipped` int(11) DEFAULT NULL COMMENT '已发货商品数量',
  `number_of_items_unshipped` int(11) DEFAULT NULL COMMENT '未发货商品数量',
  `payment_execution_detail` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '付款执行细节',
  `payment_method` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '付款方法',
  `payment_method_details` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '付款方法详细信息',
  `marketplace_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '市场ID',
  `shipment_service_level_category` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '配送服务级别类别',
  `easy_ship_shipment_status` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Easy Ship配送状态',
  `cba_displayable_shipping_label` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'CBA可显示的配送标签',
  `order_type` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单类型',
  `earliest_ship_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最早发货日期',
  `latest_ship_date` timestamp NULL DEFAULT NULL COMMENT '最晚发货日期',
  `earliest_delivery_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最早交货日期',
  `latest_delivery_date` timestamp NULL DEFAULT NULL COMMENT '最晚交货日期',
  `is_business_order` tinyint(1) DEFAULT NULL COMMENT '是否商业订单',
  `is_prime` tinyint(1) DEFAULT NULL COMMENT '是否Prime会员订单',
  `is_premium_order` tinyint(1) DEFAULT NULL COMMENT '是否高级订单',
  `is_global_express_enabled` tinyint(1) DEFAULT NULL COMMENT '是否启用全球快递',
  `replaced_order_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '替换的订单ID',
  `is_replacement_order` tinyint(1) DEFAULT NULL COMMENT '是否替换订单',
  `promise_response_due_date` timestamp NULL DEFAULT NULL COMMENT '承诺响应截止日期',
  `is_estimated_ship_date_set` tinyint(1) DEFAULT NULL COMMENT '是否设置了预计发货日期',
  `is_sold_by_ab` tinyint(1) DEFAULT NULL COMMENT '是否由AB出售',
  `is_iba` tinyint(1) DEFAULT NULL COMMENT '是否IBA',
  `default_ship_from_location_address` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '默认发货地址',
  `buyer_invoice_preference` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家发票偏好',
  `buyer_tax_information` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家税务信息',
  `fulfillment_instruction` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '履行指示',
  `is_ispu` tinyint(1) DEFAULT NULL COMMENT '是否ISPU',
  `is_access_point_order` tinyint(1) DEFAULT NULL COMMENT '是否Access Point订单',
  `marketplace_tax_info` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '市场税务信息',
  `seller_display_name` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '卖家显示名称',
  `shipping_address_name` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-姓名',
  `shipping_address_line1` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-街道地址行1',
  `shipping_address_line2` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-街道地址行2',
  `shipping_address_line3` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-街道地址行3',
  `shipping_address_city` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-城市',
  `shipping_address_county` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-县',
  `shipping_address_district` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-区',
  `shipping_address_state_or_region` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-州/省/地区',
  `shipping_address_municipality` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-市',
  `shipping_address_postal_code` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-邮政编码',
  `shipping_address_country_code` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-国家代码',
  `shipping_address_phone` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-电话号码',
  `shipping_address_type` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货地址-地址类型',
  `buyer_email` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家电子邮件',
  `buyer_name` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家姓名',
  `buyer_county` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家县',
  `buyer_tax_info` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家税务信息',
  `purchase_order_number` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '采购订单号',
  `automated_shipping_settings` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '自动化配送设置',
  `has_regulated_items` tinyint(1) DEFAULT NULL COMMENT '是否有受管制物品',
  `electronic_invoice_status` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '电子发票状态',
  `item_approval_types` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品批准类型',
  `item_approval_status` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品批准状态',
  `create_time` timestamp NULL DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_sn` (`amazon_order_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
# 2.订单商品
CREATE TABLE `cc_order_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `order_id` int(11) DEFAULT '0' COMMENT '订单ID',
  `order_sn` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单号',
  `asin` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'ASIN(亚马逊标准识别号)',
  `seller_sku` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '卖家SKU',
  `order_item_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单项ID',
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '商品标题',
  `quantity_ordered` int(11) DEFAULT NULL COMMENT '订购数量',
  `quantity_shipped` int(11) DEFAULT NULL COMMENT '发货数量',
  `product_info_number_of_items` int(11) DEFAULT NULL COMMENT '商品数量',
  `points_granted` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '授予的积分',
  `item_price_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品价格的货币代码',
  `item_price_amount` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品价格的金额',
  `shipping_price_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运费价格',
  `shipping_price_amount` decimal(10,2) DEFAULT NULL,
  `item_tax_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品税金的货币代码',
  `item_tax_amount` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品税金的金额',
  `shipping_tax_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运费税金',
  `shipping_tax_amount` decimal(10,2) DEFAULT NULL,
  `shipping_discount_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运费折扣',
  `shipping_discount_amount` decimal(10,2) DEFAULT NULL,
  `shipping_discount_tax_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运费折扣税金',
  `shipping_discount_tax_amount` decimal(10,2) DEFAULT NULL,
  `promotion_discount_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '促销折扣的货币代码',
  `promotion_discount_amount` decimal(10,2) DEFAULT NULL COMMENT '促销折扣的金额',
  `promotion_discount_tax_currency_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '促销折扣税金的货币代码',
  `promotion_discount_tax_amount` decimal(10,2) DEFAULT NULL COMMENT '促销折扣税金的金额',
  `promotion_ids` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '促销ID',
  `cod_fee` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '货到付款费用',
  `cod_fee_discount` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '货到付款费用折扣',
  `is_gift` tinyint(1) DEFAULT NULL COMMENT '是否为礼品',
  `condition_note` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品状况说明',
  `condition_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品状况ID',
  `condition_subtype_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品状况子类型ID',
  `scheduled_delivery_start_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '预计交付开始日期',
  `scheduled_delivery_end_date` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '预计交付结束日期',
  `price_designation` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '价格指定',
  `tax_collection` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '税收信息',
  `serial_number_required` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '是否需要序列号',
  `is_transparency` tinyint(1) DEFAULT NULL COMMENT '是否支持透明度',
  `ioss_number` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'IOSS编号',
  `store_chain_store_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '店铺连锁店ID',
  `deemed_reseller_category` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '认定为转售商类别',
  `buyer_info_buyer_customized_info` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家定制信息',
  `buyer_info_gift_wrap_price` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '礼品包装价格',
  `buyer_info_gift_wrap_tax` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '礼品包装税金',
  `buyer_info_gift_message_text` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '礼品留言文本',
  `buyer_info_gift_wrap_level` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '礼品包装级别',
  `buyer_requested_cancel` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '买家请求取消订单',
  `item_approval_context` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品审批上下文',
  `serial_numbers` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '序列号列表',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

二.数据格式

{
    "amazon_order_id": "123-1234567-1234567",
    "seller_order_id": "123-1234567-1234567",
    "purchase_date": "2022-01-01T21:00:24Z",
    "last_update_date": "2022-01-04T02:44:13Z",
    "order_status": "Shipped",
    "fulfillment_channel": "AFN",
    "sales_channel": "Amazon.de",
    "order_channel": null,
    "ship_service_level": "Standard",
    "order_total": {
        "currency_code": "EUR",
        "amount": "99.99"
    },
    "number_of_items_shipped": 1,
    "number_of_items_unshipped": 0,
    "payment_execution_detail": null,
    "payment_method": "Other",
    "payment_method_details": [
        "Standard"
    ],
    "marketplace_id": "A1PA6795UKMFR9",
    "shipment_service_level_category": "Standard",
    "easy_ship_shipment_status": null,
    "cba_displayable_shipping_label": null,
    "order_type": "StandardOrder",
    "earliest_ship_date": "2022-01-02T22:59:59Z",
    "latest_ship_date": "2022-01-02T22:59:59Z",
    "earliest_delivery_date": null,
    "latest_delivery_date": null,
    "is_business_order": false,
    "is_prime": false,
    "is_premium_order": false,
    "is_global_express_enabled": false,
    "replaced_order_id": null,
    "is_replacement_order": false,
    "promise_response_due_date": null,
    "is_estimated_ship_date_set": null,
    "is_sold_by_ab": false,
    "is_iba": null,
    "default_ship_from_location_address": null,
    "buyer_invoice_preference": null,
    "buyer_tax_information": null,
    "fulfillment_instruction": null,
    "is_ispu": false,
    "is_access_point_order": false,
    "marketplace_tax_info": null,
    "seller_display_name": null,
    "shipping_address": {
        "name": null,
        "address_line1": null,
        "address_line2": null,
        "address_line3": null,
        "city": "Lörrace",
        "county": null,
        "district": null,
        "state_or_region": null,
        "municipality": null,
        "postal_code": "79538",
        "country_code": "DE",
        "phone": null,
        "address_type": null
    },
    "buyer_info": {
        "buyer_email": "admin@marketplace.amazon.de",
        "buyer_name": null,
        "buyer_county": null,
        "buyer_tax_info": null,
        "purchase_order_number": null
    },
    "automated_shipping_settings": null,
    "has_regulated_items": false,
    "electronic_invoice_status": null,
    "item_approval_types": null,
    "item_approval_status": null,
    "order_items": {
        "asin": "ASIN0001",
        "seller_sku": "SKU-SKU-SKU",
        "order_item_id": "441234567812",
        "title": "DASDJASLDJALSDASD DASJDASJDK UODOS12D AJSDLASJDLASD JDOAJSDLJASDJL DJOASJDOAJSODJOASJDOJASODJ 123JDAS 123JDLASJDLAJSDLJJDALS",
        "quantity_ordered": 1,
        "quantity_shipped": 1,
        "product_info": {
            "number_of_items": 1
        },
        "points_granted": null,
        "item_price": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "shipping_price": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "item_tax": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "shipping_tax": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "shipping_discount": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "shipping_discount_tax": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "promotion_discount": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "promotion_discount_tax": {
            "currency_code": "EUR",
            "amount": "99.99"
        },
        "promotion_ids": [
            "XXXXXXXXX 2022/01/01 00-00-00"
        ],
        "cod_fee": null,
        "cod_fee_discount": null,
        "is_gift": false,
        "condition_note": null,
        "condition_id": null,
        "condition_subtype_id": null,
        "scheduled_delivery_start_date": null,
        "scheduled_delivery_end_date": null,
        "price_designation": null,
        "tax_collection": null,
        "serial_number_required": null,
        "is_transparency": false,
        "ioss_number": null,
        "store_chain_store_id": null,
        "deemed_reseller_category": "UOSS",
        "buyer_info": {
            "buyer_customized_info": null,
            "gift_wrap_price": null,
            "gift_wrap_tax": null,
            "gift_message_text": null,
            "gift_wrap_level": null
        },
        "buyer_requested_cancel": null,
        "item_approval_context": null,
        "serial_numbers": null
    }
}
三.下载代码
<?php

namespace app\admin\controller;

use app\admin\model\Order;
use app\admin\model\OrderItems;
use app\common\controller\Backend;
use app\admin\model\Store as StoreModel;
use SellingPartnerApi\Api\CatalogItemsV0Api;
use SellingPartnerApi\Configuration;
use SellingPartnerApi\Endpoint;
use SellingPartnerApi\Api\SellersV1Api as SellersApi;
use SellingPartnerApi\Api\OrdersV0Api;
use SellingPartnerApi\Api\TokensV20210301Api;
use SellingPartnerApi\Model\TokensV20210301\CreateRestrictedDataTokenRequest;

// 店铺管理
class Store extends Backend
{

    protected $model = null;
    protected $preExcludeFields = ['id', 'create_time', 'update_time'];
    protected $quickSearchField = ['id', 'title'];

    public function initialize()
    {
        parent::initialize();
        $this->model = new \app\admin\model\Store;
    }

    /**
     * 下载订单
     */
    public function getOrder()
    {
        $storeName = 'TEST';
        $storeModel = new StoreModel();
        $store = $storeModel->where("title", $storeName)->find()->toArray();
        
        $conf = [
            'access_key'    => $store['spapi_amazon_access_key'], 
            'access_secret' => $store['spapi_amazon_access_secret'],
            'role_arn'      => $store['spapi_amazon_role_arn'], 
            'refresh_token' => $store['spapi_amazon_refresh_token'],
            'client_id'     => $store['spapi_amazon_client_id'], 
            'client_secret' => $store['spapi_amazon_client_secret'],
            
            'endpoint'      => $store['spapi_amazon_endpoint'],
            'marketplaceId' => $store['api_marketplaceid'],
            'asin'          => 'ASIN00001',  
            'order_id'      => '123-1234567-1234567', 
        ];

        switch ($conf['endpoint']) {
            case 'NA':
                $endpoint = Endpoint::NA;
                break;
            case 'EU':
                $endpoint = Endpoint::EU;
                break;
            case 'FE':
                $endpoint = Endpoint::FE;
                break;
        }

        $connect = new Configuration([
            "lwaClientId" => $conf['client_id'],
            "lwaClientSecret" => $conf['client_secret'],
            "lwaRefreshToken" => $conf['refresh_token'],
            "awsAccessKeyId" => $conf['access_key'],
            "awsSecretAccessKey" => $conf['access_secret'],
            "endpoint" => $endpoint,
            "roleArn" => $conf['role_arn'],
        ]);

        $list = $this->getOrders($connect, $conf, false,  '2023-01-01 00:00:00');
    }

    // 2.获取订单列表
    public function getOrders($connect, $conf,  $is_fbm = true,  $stime)
    {
        $apiInstance = new OrdersV0Api($connect);
        // $apiInstance = new \SellingPartnerApi\Api\OrdersApi($connect);

        $marketplace_ids = [$conf['marketplaceId']]; 
        $format = "Y-m-d\TH:i:s.\\0\\0\\0\\Z";
        $created_after = gmdate($format, strtotime($stime));
        
        try {
            if ($is_fbm) {
                $data_elements = ['buyerInfo', 'shippingAddress'];
                $fulfillment_channels = 'MFN';
            } else {
                $data_elements = null;
                $fulfillment_channels = 'AFN';
            }

            $limit = 3;
            $fulfillment_channels = 'AFN';
            $result = $apiInstance->getOrders($marketplace_ids, $created_after, null, null, null, null, $fulfillment_channels, null, null, null, $limit, null, null, null, null, null, null, $data_elements);

            $result = $result['payload']['orders'];

            $list = [];
            foreach ($result as $key=>$item) {

                $orderData = $this->objectToArray($item); // 订单对象转数组
                $orderData = $this->formatOrder(end($orderData)); // 格式化订单数组
   
                $orderItem = $apiInstance->getOrderItems($item['amazon_order_id']);
                $orderItem = $this->objectToArray($orderItem['payload']['order_items']);

                foreach ($orderItem as $vo) {
                    $orderData['order_items'] = $this->formatOrder(end($vo));
                }
                
                $list[] = $orderData;

                if ($orderData['amazon_order_id']  == '123-1234567-1234567') {
                    dd(json_encode($orderData)); //此处可调试打印数据
                }
            }

            // 保存到数据库中
            $orderModel = new Order();
            $itemModel = new OrderItems();
            $time = date('Y-m-d H:i:s');

            foreach ($list as $order) {

                $isExists = $orderModel->where('amazon_order_id', $order['amazon_order_id'])->count();
                if ($isExists) {
                    echo "订单已存在: {$order['amazon_order_id']} <br>";
                    continue;
                }

                // 创建要插入的数据数组
                $insertData = [];
                $insertData['amazon_order_id'] = $order['amazon_order_id'];
                $insertData['seller_order_id'] = $order['seller_order_id'];
                $insertData['purchase_date'] = $order['purchase_date'];
                $insertData['last_update_date'] = $order['last_update_date'];
                $insertData['order_status'] = $order['order_status'];
                $insertData['fulfillment_channel'] = $order['fulfillment_channel'];
                $insertData['sales_channel'] = $order['sales_channel'];
                $insertData['order_channel'] = $order['order_channel'];
                $insertData['ship_service_level'] = $order['ship_service_level'];
                $insertData['order_total_currency_code'] = $order['order_total']['currency_code'];
                $insertData['order_total_amount'] = $order['order_total']['amount'];
                $insertData['number_of_items_shipped'] = $order['number_of_items_shipped'];
                $insertData['number_of_items_unshipped'] = $order['number_of_items_unshipped'];
                $insertData['payment_execution_detail'] = $order['payment_execution_detail'];
                $insertData['payment_method'] = $order['payment_method'];
                $insertData['payment_method_details'] = implode(', ', $order['payment_method_details']);
                $insertData['marketplace_id'] = $order['marketplace_id'];
                $insertData['shipment_service_level_category'] = $order['shipment_service_level_category'];
                $insertData['easy_ship_shipment_status'] = $order['easy_ship_shipment_status'];
                $insertData['cba_displayable_shipping_label'] = $order['cba_displayable_shipping_label'];
                $insertData['order_type'] = $order['order_type'];
                $insertData['earliest_ship_date'] = $order['earliest_ship_date'];
                $insertData['latest_ship_date'] = $order['latest_ship_date'];
                $insertData['earliest_delivery_date'] = $order['earliest_delivery_date'];
                $insertData['latest_delivery_date'] = $order['latest_delivery_date'];
                $insertData['is_business_order'] = $order['is_business_order'];
                $insertData['is_prime'] = $order['is_prime'];
                $insertData['is_premium_order'] = $order['is_premium_order'];
                $insertData['is_global_express_enabled'] = $order['is_global_express_enabled'];
                $insertData['replaced_order_id'] = $order['replaced_order_id'];
                $insertData['is_replacement_order'] = $order['is_replacement_order'];
                $insertData['promise_response_due_date'] = $order['promise_response_due_date'];
                $insertData['is_estimated_ship_date_set'] = $order['is_estimated_ship_date_set'];
                $insertData['is_sold_by_ab'] = $order['is_sold_by_ab'];
                $insertData['is_iba'] = $order['is_iba'];
                $insertData['default_ship_from_location_address'] = $order['default_ship_from_location_address'];
                $insertData['buyer_invoice_preference'] = $order['buyer_invoice_preference'];
                $insertData['buyer_tax_information'] = $order['buyer_tax_information'];
                $insertData['fulfillment_instruction'] = $order['fulfillment_instruction'];
                $insertData['is_ispu'] = $order['is_ispu'];
                $insertData['is_access_point_order'] = $order['is_access_point_order'];
                $insertData['marketplace_tax_info'] = $order['marketplace_tax_info'];
                $insertData['seller_display_name'] = $order['seller_display_name'];
                $insertData['shipping_address_name'] = $order['shipping_address']['name'];
                $insertData['shipping_address_line1'] = $order['shipping_address']['address_line1'];
                $insertData['shipping_address_line2'] = $order['shipping_address']['address_line2'];
                $insertData['shipping_address_line3'] = $order['shipping_address']['address_line3'];
                $insertData['shipping_address_city'] = $order['shipping_address']['city'];
                $insertData['shipping_address_county'] = $order['shipping_address']['county'];
                $insertData['shipping_address_district'] = $order['shipping_address']['district'];
                $insertData['shipping_address_state_or_region'] = $order['shipping_address']['state_or_region'];
                $insertData['shipping_address_municipality'] = $order['shipping_address']['municipality'];
                $insertData['shipping_address_postal_code'] = $order['shipping_address']['postal_code'];
                $insertData['shipping_address_country_code'] = $order['shipping_address']['country_code'];
                $insertData['shipping_address_phone'] = $order['shipping_address']['phone'];
                $insertData['shipping_address_type'] = $order['shipping_address']['address_type'];
                $insertData['buyer_email'] = $order['buyer_info']['buyer_email'];
                $insertData['buyer_name'] = $order['buyer_info']['buyer_name'];
                $insertData['buyer_county'] = $order['buyer_info']['buyer_county'];
                $insertData['buyer_tax_info'] = $order['buyer_info']['buyer_tax_info'];
                $insertData['purchase_order_number'] = $order['buyer_info']['purchase_order_number'];
                $insertData['automated_shipping_settings'] = $order['automated_shipping_settings'];
                $insertData['has_regulated_items'] = $order['has_regulated_items'];
                $insertData['electronic_invoice_status'] = $order['electronic_invoice_status'];
                $insertData['item_approval_types'] = $order['item_approval_types'];
                $insertData['item_approval_status'] = $order['item_approval_status'];

                $orderId = $orderModel->create($insertData);

                // 插入订单商品
                if ($orderId->id) {
                    
                    $items = $order['order_items'];
                    $items = $this->formatNull($items);

                    $data = [];
                    $data['order_id'] = $orderId->id;
                    $data['order_sn'] = $order['amazon_order_id']; // 来自订单
                    $data['asin'] = $items['asin'];
                    $data['seller_sku'] = $items['seller_sku'];
                    $data['order_item_id'] = $items['order_item_id'];
                    $data['title'] = $items['title'];
                    $data['quantity_ordered'] = $items['quantity_ordered'];
                    $data['quantity_shipped'] = $items['quantity_shipped'];
                    $data['product_info_number_of_items'] = $items['product_info']['number_of_items'];
                    $data['points_granted'] = $items['points_granted'];
                    $data['item_price_currency_code'] = $items['item_price']['currency_code'];
                    $data['item_price_amount'] = $items['item_price']['amount'];

                    $data['shipping_price_currency_code'] = $data['shipping_price_amount'] = '';
                    if ($items['shipping_price']) {
                        $data['shipping_price_currency_code'] = $items['shipping_price']['currency_code'];
                        $data['shipping_price_amount'] = $items['shipping_price']['amount'];
                    } 

                    $data['item_tax_currency_code'] = $items['item_tax']['currency_code'];
                    $data['item_tax_amount'] = $items['item_tax']['amount'];

                    $data['shipping_tax_currency_code'] = $data['shipping_tax_amount'] = '';
                    if ($items['shipping_tax']) {
                        $data['shipping_tax_currency_code'] = $items['shipping_tax']['currency_code'];
                        $data['shipping_tax_amount'] = $items['shipping_tax']['amount'];
                    } 

                    $data['shipping_discount_currency_code'] = $data['shipping_discount_amount'] = '';
                    if ($items['shipping_discount']) {
                        $data['shipping_discount_currency_code'] = $items['shipping_discount']['currency_code'];
                        $data['shipping_discount_amount'] = $items['shipping_discount']['amount'];
                    }

                    $data['shipping_discount_tax_currency_code'] = $data['shipping_discount_tax_amount'] = '';
                    if ($items['shipping_discount_tax']) {
                        $data['shipping_discount_tax_currency_code'] = $items['shipping_discount_tax']['currency_code'];
                        $data['shipping_discount_tax_amount'] = $items['shipping_discount_tax']['amount'];
                    }

                    $data['promotion_discount_currency_code'] = $items['promotion_discount']['currency_code'];
                    $data['promotion_discount_amount'] = $items['promotion_discount']['amount'];
                    $data['promotion_discount_tax_currency_code'] = $items['promotion_discount_tax']['currency_code'];
                    $data['promotion_discount_tax_amount'] = $items['promotion_discount_tax']['amount'];

                    $data['promotion_ids'] = '';
                    if ($data['promotion_ids']) {
                        $data['promotion_ids'] = implode(',', $items['promotion_ids']);
                    }

                    $data['cod_fee'] = $items['cod_fee'];
                    $data['cod_fee_discount'] = $items['cod_fee_discount'];
                    $data['is_gift'] = $items['is_gift'];
                    $data['condition_note'] = $items['condition_note'];
                    $data['condition_id'] = $items['condition_id'];
                    $data['condition_subtype_id'] = $items['condition_subtype_id'];
                    $data['scheduled_delivery_start_date'] = $items['scheduled_delivery_start_date'];
                    $data['scheduled_delivery_end_date'] = $items['scheduled_delivery_end_date'];
                    $data['price_designation'] = $items['price_designation'];
                    $data['tax_collection'] = $items['tax_collection'];
                    $data['serial_number_required'] = $items['serial_number_required'];
                    $data['is_transparency'] = $items['is_transparency'];
                    $data['ioss_number'] = $items['ioss_number'];
                    $data['store_chain_store_id'] = $items['store_chain_store_id'];
                    $data['deemed_reseller_category'] = $items['deemed_reseller_category'];
                    $data['buyer_info_buyer_customized_info'] = $items['buyer_info']['buyer_customized_info'];
                    $data['buyer_info_gift_wrap_price'] = $items['buyer_info']['gift_wrap_price'];
                    $data['buyer_info_gift_wrap_tax'] = $items['buyer_info']['gift_wrap_tax'];
                    $data['buyer_info_gift_message_text'] = $items['buyer_info']['gift_message_text'];
                    $data['buyer_info_gift_wrap_level'] = $items['buyer_info']['gift_wrap_level'];
                    $data['buyer_requested_cancel'] = $items['buyer_requested_cancel'];
                    $data['item_approval_context'] = $items['item_approval_context'];
                    $data['serial_numbers'] = $items['serial_numbers'];
                    $data['create_time'] = $time;
                    $data = $this->checkItems($data);
                    $itemId = $itemModel->create($data);
                }
            }
            
        } catch (\Exception $e) {
            echo '错误: ', $e->getFile(), $e->getLine(), $e->getMessage(), PHP_EOL;
            dd($data);
        }

        dd("完毕");
    }


    /**
     * 特殊的对象转数组方法
     */
    function objectToArray($obj) {
        $obj = (array)$obj;
        $result = [];
        foreach ($obj as $key => $value) {
            if (gettype($value) == 'object' || gettype($value) == 'array') {
                $result[$key] = $this->objectToArray($value); // 递归调用
            } else {
                $result[$key] = $value;
            }
        }
        return $result;
    }

   // 格式化订单结果(包括订单和订单商品)
    function formatOrder($items, $test = 0) {
        $list = [];
        foreach ($items as $key=>$item) {
            if ($test && preg_match('/container/', $key)) {
                return $item;
            }
            if (is_array($item)) {
                $list[$key] = $this->formatOrder($item, 1);
            } else {
                if (preg_match('/container/', $key)) {
                    $list[$key] = end($item);
                } else {
                    $list[$key] = $item;
                }
            }
        }
        return $list;
    }
    
    // 将null改为空白
    public function formatNull($array, $replacement = '')
    {
        foreach ($array as &$value) {
            if (is_array($value)) {
                $value = $this->formatNull($value, $replacement);
            } elseif ($value === null) {
                $value = $replacement;
            }
        }
        return $array;
    }

    // 检查插入的数据中, 是否有数组, 如果有, 设为空白
    public function checkItems($data)
    {
        foreach ($data as &$item) {
            if (is_array($item)) {
                $item = '';
            }
        }
        return $data;
    }
    
}