背景
这是一个真实的 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_config | App 认证参数 |
WMS 业务表(模块操作的非自有表):
| 表 | 用途 |
|---|---|
| shipping | 出库单 — WMS 核心单据 |
| lineitem | 拣货明细 |
| inventry | 库存表 |
局限性
当前模式依赖人工维护两边库存,在以下场景存在局限性:
| 场景 | 后果 |
|---|---|
| WMS 库存卖完了 | Shopify 仍显示可购买 |
| 多渠道销售 | 各渠道库存互相不感知 |
| Shopify 上新品 | WMS 不会自动建档 |
| WMS 盘点调整 | Shopify 库存不更新 |
如果需要一盘货管理(一个库存池对多个销售渠道),需要补充库存推送能力:
WMS inventry → Shopify inventoryLevel API
总结
两条脚本 + 七张自有表 + 三张 WMS 业务表,构成了一个完整的订单双向同步链路。没有产品同步、没有库存推送,但系统依然能正常运转——因为核心链路依赖的是 SKU 匹配,而不是产品主数据同步。两套产品库各自独立维护,只要 SKU 对得上,订单就能正常流转。
这是一个务实的集成方案:承认人工环节的存在,而非强行自动化一切。在业务量可控、渠道单一的阶段,这种模式足以满足需求。