文档目录
订单处理API

简介

本文件面向电商平台开发者,提供订单处理流程的完整API参考。内容覆盖:

  • 订单创建接口的参数校验、业务规则(商品、收货地址、配送方式等)
  • 订单状态流转机制(待支付到已完成等)
  • 订单查询接口(按订单号、用户ID、时间范围等多维度)
  • 订单修改与取消流程(库存释放、优惠券回滚等业务规则)
  • 订单详情接口(商品明细、价格计算、优惠信息)
  • 订单列表分页查询与筛选
  • 数据一致性与异常处理机制

项目结构

订单相关API采用"路由 + 控制器 + 服务"的分层组织:

  • 路由层:集中声明订单域的所有端点及子模块(user/cart/checkout/cashier/work)
  • 控制器层:负责鉴权、参数校验、调用服务并返回统一响应
  • 服务层:封装结算、下单、支付、核销、购物车、我的订单等业务逻辑
  • 基础能力:订单状态枚举、金额格式化、附件上传、支付服务等
graph TB
A["客户端"] --> B["路由: api/route/order.php"]
B --> C["控制器: Order/Checkout/Cashier/User/Cart/Work"]
C --> D["服务: CheckoutService / CashierService / CartService / UserService / WorkOrderService"]
D --> E["核心能力: OrderStatus / PaymentService / Attachment / DB / Session"]

图表来源

  • api/route/order.php:39-87
  • api/controller/order/CheckoutController.php:49-53
  • api/controller/order/CashierController.php:53-60
  • api/controller/order/CartController.php:41-44
  • api/controller/order/UserController.php:41-44
  • api/controller/order/WorkController.php:51-58

章节来源

  • api/route/order.php:39-87

核心组件

  • 路由与分组:以 order 为根路径,通过 sub 前缀区分 user/cart/checkout/cashier/work 子模块
  • 控制器职责:
    • OrderController:承载购物车首页入口(获取当前用户购物车)
    • CartController:购物车数量、增删改
    • CheckoutController:结算页数据、下单提交、成功页、切换配送、使用优惠券重算
    • CashierController:收银台、离线支付、凭证上传
    • UserController:我的订单列表、详情、取消
    • WorkController:工作台订单列表、详情、取消、线下支付审核、发货/物流更新
  • 基础能力:
    • OrderStatus:订单状态常量与迁移校验
    • PaymentService:支付记录创建与查询
    • Attachment:凭证附件存储
    • DB/Session:数据与临时金额缓存

章节来源

  • api/route/order.php:39-87
  • core/foundation/Order/OrderStatus.php:21-67

架构总览

订单API遵循"请求进入路由 -> 控制器鉴权与入参校验 -> 调用服务完成业务 -> 返回统一ApiResponse"的流程。关键交互如下:

sequenceDiagram
participant U as "客户端"
participant R as "路由(order.php)"
participant C as "控制器(CheckoutController)"
participant S as "服务(CheckoutService)"
participant P as "支付服务(PaymentService)"
participant DB as "数据库"
U->>R : POST /api?route=order/checkout/checkout_post
R->>C : 解析参数/鉴权
C->>S : createOrder(用户, 收货, 配送, 优惠券, 邮编, 是否更新资料)
S->>DB : 校验库存/价格/优惠
S-->>C : {ok, order_sn, mode}
alt 在线支付
C->>P : 创建支付单(可选)
P-->>C : payment_sn
C-->>U : {cashier_url, order_sn, mode}
else 离线支付
C-->>U : {order_sn, mode}
end

图表来源

  • api/route/order.php:65-68
  • api/controller/order/CheckoutController.php:99-131
  • api/controller/order/CashierController.php:91-126

详细接口说明

一、购物车接口(order/cart/*)

  • GET /api?route=order/cart/cart_number
    • 功能:获取当前登录用户的购物车商品总数;未登录时返回 cart_number=0
    • 鉴权:非必须(未登录静默返回)
    • 返回:cart_number
  • POST /api?route=order/cart
    • 功能:添加商品到购物车
    • 必填参数:module(默认 product)、item_id、item_number(默认1)、mode(money/point,默认 money)、action(默认 addtocart)
    • 规格参数:att_* 键值对收集
    • 返回:mode
  • PUT /api?route=order/cart/{id}
    • 功能:更新购物车项数量
    • 参数:action(plus/minus/input),input 时需附带 item_number
    • 返回:更新后的购物车项或空对象
  • DELETE /api?route=order/cart/{id}
    • 功能:删除购物车项
    • 返回:空对象

章节来源

  • api/controller/order/CartController.php:53-63
  • api/controller/order/CartController.php:71-92
  • api/controller/order/CartController.php:100-129
  • api/controller/order/CartController.php:137-183

二、结算与下单接口(order/checkout/*)

  • GET /api?route=order/checkout
    • 功能:获取结算页数据(购物车、配送方式、可用优惠券、初始金额)
    • 鉴权:必须登录
    • 返回:cart、shipping_list、shipping_id、coupon_list、coupon_id、order、amount(含运费、优惠券金额、订单金额格式化)
  • POST /api?route=order/checkout/checkout_post
    • 功能:提交下单
    • 必填参数:contact_id、shipping_id(合法字符)、mode(money/point)、coupon_id、postcode
    • 可选参数:update_user_information(布尔)、user_update_data(phone/contact/address/postcode)
    • 返回:cashier_url(在线支付跳转)、order_sn、mode
  • GET /api?route=order/checkout/success
    • 功能:下单成功页数据
    • 鉴权:必须登录
    • 返回:order(包含 order_amount_format)
  • POST /api?route=order/checkout/change_shipping
    • 功能:切换配送方式并重算金额
    • 参数:shipping_id、coupon_amount
    • 返回:amount(运费、优惠券金额、订单金额格式化)
  • POST /api?route=order/checkout/use_coupon
    • 功能:使用优惠券并重算金额
    • 参数:coupon_id、shipping_fee
    • 返回:amount(运费、优惠券金额、订单金额格式化)

更新 结账服务增强了用户地址获取逻辑,增加了user对象和用户联系信息的存在性检查,防止空引用错误并提高结账流程的健壮性。在createOrder方法中,对用户联系信息的处理增加了更严格的验证:

// 收货人信息
$userContact = DB::table('user_contact')
    ->where('id', $contactId)
    ->where('user_id', $userId)
    ->find();
$contact = isset($userContact['name']) ? $userContact['name'] : '';
$phone = isset($userContact['phone']) ? $userContact['phone'] : '';
$address = (user() && !empty($userContact)) ? user()->addressFull($userContact) : '';
flowchart TD
Start(["开始"]) --> Auth["校验登录态"]
Auth --> CheckCart{"购物车是否为空?"}
CheckCart -- 否 --> BuildData["构建结算数据<br/>cart/shipping/coupon/amount"]
BuildData --> Submit["提交下单<br/>createOrder(...)"]
Submit --> ValidateUser{"用户和联系信息验证"}
ValidateUser -- 通过 --> Result{"下单成功?"}
ValidateUser -- 失败 --> Err["返回业务错误 422"]
Result -- 否 --> Err
Result -- 是 --> Mode{"mode=online?"}
Mode -- 是 --> PayUrl["生成支付链接 casher_url"]
Mode -- 否 --> Offline["返回 order_sn/mode"]
PayUrl --> End(["结束"])
Offline --> End
Err --> End

图表来源

  • api/controller/order/CheckoutController.php:61-91
  • api/controller/order/CheckoutController.php:99-131
  • api/controller/order/CheckoutController.php:139-153
  • api/controller/order/CheckoutController.php:161-207
  • front/service/order/CheckoutService.php:329-337

章节来源

  • api/controller/order/CheckoutController.php:61-91
  • api/controller/order/CheckoutController.php:99-131
  • api/controller/order/CheckoutController.php:139-153
  • api/controller/order/CheckoutController.php:161-207

三、收银台与支付接口(order/cashier/*)

  • GET /api?route=order/cashier
    • 功能:获取收银台订单信息
    • 鉴权:必须登录
    • 返回:order、payment(默认支付方式)
  • GET /api?route=order/cashier/pay
    • 功能:离线支付页(幂等创建 pending offlinepay 支付记录)
    • 鉴权:必须登录
    • 返回:order(含 payment_sn)
  • POST /api?route=order/cashier/pay_evidence
    • 功能:上传付款凭证
    • 鉴权:必须登录
    • 必填参数:order_sn、payment_sn、文件 pay_evidence
    • 返回:空对象
sequenceDiagram
participant U as "客户端"
participant W as "CashierController"
participant OS as "OrderService"
participant PS as "PaymentService"
participant ATT as "Attachment"
U->>W : GET /cashier/pay?order_sn=...
W->>OS : writePayId(order_sn, 'offlinepay')
W->>PS : findActivePending(order_id)
alt 存在有效记录
PS-->>W : payment_sn
else 不存在
W->>PS : createForOrder(order_id, order_sn, 'offlinepay', amount, timeout)
PS-->>W : payment_sn
end
W-->>U : {order, payment_sn}
U->>W : POST /cashier/pay_evidence (order_sn, payment_sn, 文件)
W->>ATT : store('order', order_sn, file, ...)
W->>W : savePayEvidence(...)
W-->>U : {}

图表来源

  • api/controller/order/CashierController.php:69-80
  • api/controller/order/CashierController.php:91-126
  • api/controller/order/CashierController.php:134-161

章节来源

  • api/controller/order/CashierController.php:69-80
  • api/controller/order/CashierController.php:91-126
  • api/controller/order/CashierController.php:134-161

四、我的订单接口(order/user/*)

  • GET /api?route=order/user
    • 功能:我的订单列表(分页、按状态筛选)
    • 鉴权:必须登录
    • 参数:page(默认1)、status(all 或合法状态值)
    • 返回:title、order_list、status_list、payment
  • GET /api?route=order/user/show/{order_sn}
    • 功能:订单详情
    • 鉴权:必须登录
    • 参数:order_sn(数字)
    • 返回:title、order、payment
  • POST /api?route=order/user/cancel
    • 功能:取消订单
    • 鉴权:必须登录
    • 参数:order_sn(数字)
    • 返回:{ok: true}
sequenceDiagram
participant U as "客户端"
participant UC as "UserController"
participant US as "UserService"
U->>UC : GET /user?page=&status=
UC->>US : buildOrderListData(user_id, page, '', status)
US-->>UC : {list, status_list}
UC-->>U : {title, order_list, status_list, payment}
U->>UC : GET /user/show/{order_sn}
UC->>US : buildOrderShowData(user_id, order_sn)
US-->>UC : order
UC-->>U : {title, order, payment}
U->>UC : POST /user/cancel (order_sn)
UC->>US : cancelOrder(user_id, order_sn)
US-->>UC : {ok}
UC-->>U : {ok : true}

图表来源

  • api/controller/order/UserController.php:52-81
  • api/controller/order/UserController.php:89-108
  • api/controller/order/UserController.php:116-129

章节来源

  • api/controller/order/UserController.php:52-81
  • api/controller/order/UserController.php:89-108
  • api/controller/order/UserController.php:116-129

五、工作台接口(order/work/*)

  • GET /api?route=order/work
    • 功能:工作台订单列表(支持按状态筛选、分页)
    • 鉴权:必须登录且具备工作端权限
    • 参数:status(all 或合法状态值)、page(默认1)
    • 返回:title、列表数据
  • GET /api?route=order/work/{order_sn}
    • 功能:工作台订单详情
    • 鉴权:必须登录且具备工作端权限
    • 返回:order_sn、title、order、payment、shipping_list、need_pay_check(仅当 pay_id=offlinepay 且状态为等待确认时为真)
  • POST /api?route=order/work/order_cancel
    • 功能:取消订单(工作端)
    • 鉴权:必须登录且具备工作端权限
    • 参数:order_sn(数字)
    • 返回:空对象
  • POST /api?route=order/work/pay_check
    • 功能:线下支付审核通过
    • 鉴权:必须登录且具备工作端权限
    • 参数:order_id(数字)
    • 返回:空对象
  • POST /api?route=order/work/tracking
    • 功能:发货/更新物流
    • 鉴权:必须登录且具备工作端权限
    • 参数:order_id(数字)、shipping_id、tracking_no
    • 返回:空对象

章节来源

  • api/controller/order/WorkController.php:67-77
  • api/controller/order/WorkController.php:85-102
  • api/controller/order/WorkController.php:110-121
  • api/controller/order/WorkController.php:129-142
  • api/controller/order/WorkController.php:150-165

六、订单状态流转

  • 状态定义与语义:
    • pending:下单成功,等待付款
    • awaiting_confirmation:离线付款已上传凭证,等待管理员审核
    • paid:已付款
    • completed:已完成(无物流从 paid 直接到 completed;有物流在发货完成后到 completed)
    • cancelled:已取消(含自动取消未付款超时订单)
    • refunding:退款中
    • refunded:已全额退款(终态)
    • partial_refunded:已部分退款(仍可继续退至 refunded)
  • 迁移规则(表驱动校验):
    • pending → awaiting_confirmation | paid | cancelled
    • awaiting_confirmation → paid | pending | cancelled
    • paid → completed | refunding
    • completed → refunding
    • refunding → refunded | partial_refunded | paid
    • partial_refunded → refunding
    • refunded / cancelled 为终态,不可再迁移
stateDiagram-v2
[*] --> pending
pending --> awaiting_confirmation : "上传离线凭证"
pending --> paid : "在线支付成功"
pending --> cancelled : "超时/主动取消"
awaiting_confirmation --> paid : "审核通过"
awaiting_confirmation --> pending : "审核驳回"
awaiting_confirmation --> cancelled : "取消"
paid --> completed : "发货完成/无物流"
paid --> refunding : "发起售后"
completed --> refunding : "发起售后"
refunding --> refunded : "全额退款"
refunding --> partial_refunded : "部分退款"
refunding --> paid : "退款驳回"
partial_refunded --> refunding : "继续退款"

图表来源

  • core/foundation/Order/OrderStatus.php:21-67
  • core/foundation/Order/OrderStatus.php:76-84

章节来源

  • core/foundation/Order/OrderStatus.php:21-67
  • core/foundation/Order/OrderStatus.php:76-84

依赖关系分析

  • 控制器依赖服务:
    • CheckoutController 依赖 CheckoutService、OrderCore
    • CashierController 依赖 CashierService、OrderCore、PaymentService
    • CartController 依赖 CartService
    • UserController 依赖 UserService
    • WorkController 依赖 WorkService、WorkOrderService、OrderCore
  • 公共能力:
    • ApiResponse:统一响应封装
    • Request:参数读取与校验
    • DB/Session:数据访问与临时金额缓存
    • Module:模块开关判断(如 order/coupon)
    • Plugin:默认支付方式获取
graph LR
CCtl["CheckoutController"] --> CSvc["CheckoutService"]
CCtl --> OCore["OrderCore"]
KCtl["CashierController"] --> KSvc["CashierService"]
KCtl --> OCore
KCtl --> PSvc["PaymentService"]
CTl["CartController"] --> CS["CartService"]
UTl["UserController"] --> US["UserService"]
WTl["WorkController"] --> WS["WorkService"]
WTl --> WOS["WorkOrderService"]
WTl --> OCore

图表来源

  • api/controller/order/CheckoutController.php:49-53
  • api/controller/order/CashierController.php:53-60
  • api/controller/order/CartController.php:41-44
  • api/controller/order/UserController.php:41-44
  • api/controller/order/WorkController.php:51-58

章节来源

  • api/controller/order/CheckoutController.php:49-53
  • api/controller/order/CashierController.php:53-60
  • api/controller/order/CartController.php:41-44
  • api/controller/order/UserController.php:41-44
  • api/controller/order/WorkController.php:51-58

性能与一致性

  • 参数校验与类型安全:
    • 使用 Request 的类型化读取方法(digits/integer/alpha/postcode/alpha)确保输入合法性
    • 正则校验 shipping_id 防止非法字符注入
  • 会话与缓存:
    • 运费与优惠券金额通过 Session 暂存,减少重复计算开销
  • 幂等性:
    • 离线支付页幂等创建 pending 支付记录,避免重复创建
  • 数据一致性:
    • 下单与支付流程由服务层保证事务边界(具体实现位于服务层)
    • 订单状态迁移通过 OrderStatus 表驱动校验,防止非法状态跳变
  • 用户数据安全性增强:
    • 结账服务中增加了user对象和用户联系信息的存在性检查,防止空引用错误
    • 用户联系人数据处理采用防御性编程,确保即使数据缺失也不会导致系统崩溃
    • UserContactQuery服务提供了标准化的默认联系人快照获取方法,保证数据格式一致性

故障排查指南

  • 常见错误码与场景:
    • 401 UNAUTHORIZED:未登录或登录过期(多个控制器 mustLoginUserId)
    • 403 FORBIDDEN:工作端无权限(WorkController mustLoginAndPermission)
    • 400 INVALID_PARAMS:参数缺失或格式错误(如缺少 order_id、文件为空)
    • 404 NOT_FOUND:订单不存在(详情页校验)
    • 422 BUSINESS_RULE_VIOLATION:业务规则不满足(如购物车为空、取消失败、支付凭证提示)
  • 新增的用户数据相关错误:
    • 用户联系信息缺失:当用户没有有效的收货地址时,系统会返回相应的错误提示
    • 用户对象为空:在结账流程中,如果用户对象验证失败,会阻止订单创建
  • 定位建议:
    • 检查路由是否正确映射到对应控制器动作
    • 核对请求参数类型与命名(如 digits/integer/alpha)
    • 查看 Session 中的金额字段是否与预期一致
    • 关注订单状态是否符合迁移规则
    • 离线支付流程需确认 payment_sn 是否正确回传与落库
    • 检查用户联系信息是否存在:确保用户有有效的收货地址信息

章节来源

  • api/controller/order/CheckoutController.php:67-69
  • api/controller/order/CheckoutController.php:118-120
  • api/controller/order/CashierController.php:140-155
  • api/controller/order/UserController.php:124-126
  • api/controller/order/WorkController.php:180-187

结论

本API文档基于仓库实际代码梳理出订单全链路接口与状态流转,覆盖购物车、结算下单、支付、我的订单与工作台的完整闭环。最新的更新增强了结账服务的健壮性,通过增加用户对象和用户联系信息的存在性检查,有效防止了空引用错误,提高了系统的稳定性。 开发者可据此快速集成前端小程序或第三方系统,并结合服务层扩展实现更复杂的促销、库存与售后策略。建议在接入时重点关注参数校验、状态迁移与幂等设计,以及用户数据的安全性保障,以确保交易的一致性与稳定性。

添加日期:2026-10-05