Skip to content
// 0x
0x06 // 后端实践

WMS 与 Shopify 的数据交响:订单同步全链路解析

背景

这是一个真实的 WMS(仓储管理系统)与 Shopify 集成的案例。系统跑在 PHP 5.6 + MySQL 5.7 上,通过一个自建的 Shopify 模块完成订单同步和物流回传。

和大多数人的直觉不同,这个系统没有产品数据同步没有库存数量推送。Shopify 的产品库和 WMS 的库存表是独立维护的两套体系。本文将完整解析在这种模式下,订单如何从客户下单一路走到仓库发货。

整体架构:三个角色

整个系统由三部分组成:

Shopify 商店 (外部 API)         WMS 系统 (本地数据库)
        │                             │
        │  OAuth 2.0                  │  共享 MySQL 实例
        ▼                             ▼
   ┌────────────────────────────────────────┐
   │          Shopify 集成模块               │
   │  PHP 5.6 / 无框架 / 脚本驱动            │
   │  Services (API) → Repositories (DB)    │
   └────────────────────────────────────────┘

Shopify 模块是 WMS 与 Shopify 之间的翻译官——负责从 Shopify 拉订单写入 WMS,以及将 WMS 的物流单号回传给 Shopify。

库存管理的特殊性

WMS 的库存表和 Shopify 的产品库通过 SKU + 颜色 + 尺码 关联:

订单 SKU: "TSHIRT-BLK-M"


WMS 库存表:
  item_num     color   ratio   qty_onhand   lot_num
  TSHIRT-BLK   Black   M       42           LOT-001


匹配成功 → 分配批次 → 拣货发货

两套库存各自独立维护:

平台产品数据来源维护方式
Shopify运营上架商品Shopify 后台操作
WMS入库时建立档案仓库手动录入或文件导入

库存变动完全由 WMS 内部操作驱动,不依赖 Shopify:

入库(手动/文件导入)

  ├─ 收货 → 验货 → 上架
  └─ 过账 → 库存数量增加

出库(手动/外部订单)

  ├─ 释放 → 拣货 → 打包 → 发货
  └─ 过账 → 库存数量减少

没有任何代码向 Shopify 推送库存数量。

阶段一:订单同步(Shopify → WMS)

这是整个流程的起点。定时任务或手动触发订单同步脚本:

同步脚本启动

  ├─ 1. 从数据库读取店铺 access_token

  ├─ 2. 调用 Shopify GraphQL API → 获取订单数据

  ├─ 3. 写入 shopify_orders 表

  ├─ 4. 写入 shopify_lineitem(商品明细)

  ├─ 5. 创建 WMS 出库单(状态: 待处理)

  ├─ 6. 写入 WMS 拣货明细

  ├─ 7. 查库存表分配批次

  └─ 8. 记录同步统计

同步后仓库人员在 WMS 系统中看到一张新的出库单,可以开始拣货打包。

阶段二:仓库发货(WMS 内部操作)

仓库人员在 WMS 系统中完成拣货、打包、发货:

操作人员:
  ├─ 打印拣货单 → 去货架拿货
  ├─ 扫码确认 → 扣减库存
  ├─ 打包、称重
  └─ 点击 发货


  出库单状态: 待处理 → 已发货
  物流单号写入

此时 Shopify 仍显示订单未发货。

阶段三:物流回传(WMS → Shopify)

定时任务或手动触发物流回传脚本,将物流单号推回 Shopify:

物流回传脚本启动

  ├─ 1. 查 WMS 出库单
  │    "哪些已发货但还没推给 Shopify?"

  ├─ 2. 查订单明细

  ├─ 3. 调用 Shopify GraphQL mutation
  │    fulfillmentCreate(trackingNumber, carrier)

  ├─ 4. 成功 → 标记已同步
  │    失败 → 记录错误信息

  └─ 5. 更新同步统计

成功后 Shopify 订单状态变为 Fulfilled,客户收到物流通知邮件。

完整链路图

客户在 Shopify 下单

        ▼  订单同步脚本
Shopify 订单写入 WMS + 创建出库单

        ▼  WMS 仓库操作
拣货 → 打包 → 发货(出库单标为已发货)

        ▼  物流回传脚本
物流单号回传 Shopify(fulfillmentCreate)


客户收到物流通知

业务表职责划分

模块自有表:

用途
shopify_shops店铺注册 + OAuth token
shopify_orders从 Shopify 同步的订单快照
shopify_lineitem订单商品明细
shopify_logs统一操作日志
shopify_sync_stats同步统计
shopify_product_variants商品变体缓存
shopify_configApp 认证参数

WMS 业务表(模块操作的非自有表):

用途
shipping出库单 — WMS 核心单据
lineitem拣货明细
inventry库存表

局限性

当前模式依赖人工维护两边库存,在以下场景存在局限性:

场景后果
WMS 库存卖完了Shopify 仍显示可购买
多渠道销售各渠道库存互相不感知
Shopify 上新品WMS 不会自动建档
WMS 盘点调整Shopify 库存不更新

如果需要一盘货管理(一个库存池对多个销售渠道),需要补充库存推送能力:

WMS inventry → Shopify inventoryLevel API

总结

两条脚本 + 七张自有表 + 三张 WMS 业务表,构成了一个完整的订单双向同步链路。没有产品同步、没有库存推送,但系统依然能正常运转——因为核心链路依赖的是 SKU 匹配,而不是产品主数据同步。两套产品库各自独立维护,只要 SKU 对得上,订单就能正常流转。

这是一个务实的集成方案:承认人工环节的存在,而非强行自动化一切。在业务量可控、渠道单一的阶段,这种模式足以满足需求。


Share this post on:

Previous Post
从单体到管道:解耦订单同步与发货单创建
Next Post
本地开发 SSL 证书踩坑实录 — 通配符、SAN 与 Chrome 信任链