四种下单方式:标准 / 单页 / 渐进式 / COD

本文档说明前台 四种结账形态 的逻辑关系、共用基础设施、差异对比与主流程。优惠/活动/优惠券在各形态下的计价与落库,见 promotion-discount-checkout.md;API 逐步细节见 checkout-flows-detail.md

与实现冲突时以代码为准。

目录


1. 一句话区分

中文名代码常量URL 前缀交互形态
标准standard/checkouts/{token}多步 Liquid 页面,每步 GET 渲染 + POST 提交
单页one_page/one-page-checkouts/{token}单屏 SPA,REST API 批量落盘
渐进式single_page/single-page-checkouts/{token}分步 REST API(类似标准步骤,但无整页刷新)
CODcod/cod-checkouts/{token}货到付款专用,独立订单表,在线支付流程的平行线

另有 智能结账smart):店铺配置项,首次访问随机/按设备分配 standard / one_page / single_page 之一,Cookie 锁定 30 天。

COD 单页着陆(无 token 商品维下单)是 COD 的 子场景,见 cod-one-page-checkout.md,不在本文四种「带 checkout_token 主流程」之列。


2. 逻辑关系总图

flowchart TB
    subgraph entry [从购物车出发]
        Cart[CartService 加购 / buynow]
        Token[checkout_token 生成]
    end

    subgraph config [店铺配置 checkout_process]
        Std[standard]
        OP[one_page]
        SP[single_page]
        Smart[smart → Cookie 选其一]
    end

    subgraph codcfg [店铺配置 cod_checkout_type]
        OnlyOL[仅在线]
        OnlyCOD[仅 COD]
        FirstOL[在线首选 + COD 可选]
        FirstCOD[COD 首选 + 在线可选]
    end

    Cart --> Token
    Token --> config
    Token --> codcfg

    config --> StdFlow[标准 Liquid 多步]
    config --> OPFlow[单页 API]
    config --> SPFlow[渐进式 API]

    codcfg --> OLFlow[在线三形态之一]
    codcfg --> CODFlow[COD 页 + CodOrder]

    OLFlow -.->|共用| Shared[CartService.getList 计价]
    CODFlow -.->|平行| CodCart[CodCartService.getCartList]

核心关系

  1. 在线三种(标准 / 单页 / 渐进式)共用 o_orderCartService::getList 计价链、同一套 promotion/coupon/diy_offer 规则(细节见优惠文档)。
  2. COD 使用 CodOrderModel(COD 订单表)CodCartService不写 o_order_diy_offer,部分券逻辑与在线不一致。
  3. checkout_type 写入 o_order.checkout_type,创单后 URL 由订单类型决定(CheckoutService::generateCheckoutUrlByOrder),不再随店铺配置切换。
  4. COD 与在线cod_checkout_type 决定入口 URL 数组(是否同时提供两种链接),不是 checkout_process 的子项。

3. 常量与配置

3.1 OrderModel.checkout_type

定义:common/models/OrderModel.php

常量说明
CHECKOUT_PROCESS_STANDARDstandard标准多步
CHECKOUT_PROCESS_ONE_PAGEone_page单页
CHECKOUT_PROCESS_SINGLE_PAGEsingle_page渐进式
CHECKOUT_PROCESS_SMARTsmart仅配置层,不落订单
CHECKOUT_PROCESS_CODcodCOD 订单

3.2 店铺配置

配置键作用
checkout_process在线结账默认形态:standard / one_page / single_page / smart
checkout_process_smart_update_timesmart 模式下强制重新分配 Cookie
cod_checkout_type1 仅在线 / 2 仅 COD / 3 在线首选 / 4 COD 首选
cod_checkout_use_couponCOD 是否允许优惠券

URL 生成:CheckoutService::generateCheckoutUrlByConfig()(未创单)、generateCheckoutUrlByOrder()(已创单)。


4. 共用基础设施

4.1 checkout_token 与 Redis 购物车

生成、Cookie 关系、清理时机见 cart-checkout-token-visit-id.md。常见概念速查见 faq.md

4.2 分形态逐步链路(详细)

形态文档
标准 standardstandard-checkout-flow.md
单页 one_pageone-page-checkout-flow.md
渐进式 single_pagesingle-page-checkout-flow.md
COD 单页cod-one-page-checkout.md
COD 带 tokencod-checkout-flow.md

4.3 共用组件

组件作用
CartService::getList商品行价 + diy_offer + 满减 + 券 +(有订单时)税/运费/order_diy_offer
OrderService::saveProductso_order_product、行 discount_price
OrderService::renew重算 total_price
CouponHandlerService用券 / 预券 / 替换型券清满减
OrderDiyOfferHandleService订单级积分 / Seel / deliveryprotec

4.4 COD 独立

组件作用
CodCartService::getCartList仅 Redis cart,不读 o_order
CodOrderHandlerService::saveOrder写 COD 订单
CodCouponServiceCOD 用券(checkCouponUseWithPromotionStatus

5. 四形态对比总表

维度标准 standard单页 one_page渐进式 single_pageCOD
前端Liquid 多模板单页 JS分步 JS(API 驱动)Liquid checkout 模板
Controllerhome/Order::checkouthomeapi/OrderOnePagehomeapi/OrderSinglePagehome/OrderCodPage + homeapi/OrderCodPage
ServiceOrderService 各 save*CheckoutOnePageServiceCheckoutSinglePageServiceCodOrderHandlerService
创单时机contact_information POSTpresave 邮箱失焦 / completeemail POSTsaveOrder POST(可未先创在线单)
checkout_typestandard(默认)one_pagesingle_pagecod(COD 表)
计价CartService::getListgetCart + calCart*CartService::getListCodCartService
用券GET /coupon/use/{token}trans_info.coupon_codePOST use-couponPOST use-coupon
order_diy_offer 写入shipping_method POSTcomplete/preCompleteshipping-method POST
支付payment_gateway 步complete 后 paymentformgateway POST无在线支付(货到付款)
事件OrderCreate 等complete 触发各步 save 触发COD 成功事件

6. 标准结账(standard)

入口GET|POST /{store}-{rand}/checkouts/{checkout_token}?step=...
实现app/home/controller/Order.php::checkout

6.1 主流程

sequenceDiagram
    participant U as 用户
    participant L as Liquid 页面
    participant O as Order.php
    participant CS as CartService
    participant OS as OrderService

    U->>L: GET contact_information
    L->>CS: getList
    U->>O: POST 联系信息
    O->>OS: saveContactInformation / createOrder
    Note over OS: savePreCoupon + saveProducts

    U->>L: GET shipping_method
    U->>O: POST 配送 + offer_from_name
    O->>OS: saveShippingMethod + saveOtherInformation
    O->>OS: OrderDiyOfferHandleService.saveDiyOffer

    U->>L: GET payment_method
    U->>O: POST 支付方式
    O->>OS: savePaymentMethod

    U->>L: GET payment_gateway
    U->>O: 跳转支付 / 0 元单

6.2 步骤与 URL

step模板POST 持久化
contact_informationorder/contact_information创单、地址、savePreCoupon
shipping_methodorder/shipping_method运费、小费/保险、order_diy_offer
payment_methodorder/payment_methodpayment_id、手续费
payment_gateway支付网关第三方支付

步骤跳转由 OrderService::getCheckoutStep() 根据 has_contact_information / has_shipping_method / has_payment_method 决定。

6.3 特点

  • 唯一在 shipping 步通过 Liquid POSToffer_from_name 写积分/Seel 的典型路径。
  • 快捷支付(express)可能 强制 走标准 URL 的 payment_gateway(CheckoutService::isExpressPayment)。
  • 优惠券:结账前 GET /coupon/use/{token};创单时 savePreCoupon 从 Cookie 绑定。

7. 单页结账(one_page)

入口POST /{store}/one-page-checkouts/{token}/*
实现CheckoutOnePageService + homeapi/OrderOnePage

7.1 主流程

sequenceDiagram
    participant FE as 单页前端
    participant API as OrderOnePage
    participant S as CheckoutOnePageService
    participant CS as CartService

    FE->>API: POST presave(邮箱失焦)
    API->>S: preSave → 创/更新单

    FE->>API: POST price
    API->>S: getCart(纯算价,不写 diy offer DB)

    FE->>API: POST shippings / payments / insurance

    FE->>API: POST complete 或 preComplete
    API->>S: saveOrder + saveProducts + handlerOrderDiyOffer
    Note over S: offer_from_name 在 complete 最后写入
    API->>S: savePaymentMethod → 支付表单 / 0 元

7.2 关键 API

端点作用是否落库
presave邮箱、地址预写、创单
price返回计价 cart(仅内存)
shippings / payments选项列表
precomplete全量落盘,不触发部分事件
complete全量落盘 + 事件 + 支付

7.3 计价链

getCart() 内部:

  1. CartService::getList
  2. calCartCouponPriceCouponHandlerService::useCouponHandler
  3. calCartTaxPrice / calCartShippingPrice / calCartTipPrice / calCartPaymentPrice
  4. calCartTotalPrice

orderPreData() 把 cart 各 current_* 映射到 o_order(含 checkout_type=one_page)。

7.4 与标准的差异

单页标准
order_diy_offercomplete 时 trans_info.offer_from_nameshipping POST
页面无 step URL四步 Liquid
价格刷新频繁调 price每步 getList
preSave 锁OnePageCheckoutPresaveLockKey 防并发创单

8. 渐进式结账(single_page)

路由注释:渐进式结账app/homeapi/route/route.php 145 行)。
入口/{store}/single-page-checkouts/{token}/*
实现CheckoutSinglePageService + homeapi/OrderSinglePage

8.1 主流程

sequenceDiagram
    participant FE as 渐进式前端
    participant API as OrderSinglePage
    participant S as CheckoutSinglePageService
    participant CS as CartService

    FE->>API: POST email
    API->>S: saveEmail → createOrder
    Note over S: checkout_type=single_page

    FE->>API: POST contact-information
    FE->>API: POST shipping-method
    API->>S: saveShippingMethod + saveDiyOffer

    FE->>API: POST use-coupon(可选)
    FE->>API: POST payment-method
    FE->>API: POST gateway → 支付 URL

8.2 与标准 / 单页的异同

渐进式标准单页
交互API 分步,前端控 UI服务端渲染分步单屏一次提交
创单emailcontact_informationpresave
diy_offershipping-method(同标准)shipping_methodcomplete
用券POST use-couponGET coupon/usetrans_info
GET 辅助接口shippings/payments/diy-offer 等合并在 Liquid 渲染POST 为主

渐进式在业务步骤上 最接近标准多步,但技术栈是 REST + 前端路由,无 ?step= 整页跳转。


9. COD 结账(cod)

页面GET /{store}/cod-checkouts/{token}OrderCodPage::index(Liquid checkout 模板)
APIPOST /{store}/cod-checkouts/{token}OrderCodPage::saveOrder

9.1 主流程

sequenceDiagram
    participant U as 用户
    participant P as OrderCodPage Liquid
    participant API as homeapi/OrderCodPage
    participant CC as CodCartService
    participant H as CodOrderHandlerService

    U->>P: GET cod-checkouts
    P->>CC: getCartList(无 o_order)
    U->>API: POST 地址/物流/提交
    API->>H: saveOrder
    Note over H: CodOrderModel,checkout_type=cod

9.2 与在线的本质差异

COD在线
订单表COD 订单(CodOrderModelo_order
购物车服务CodCartServiceCartService
读已创单(getCartList 不 hydrate order)getList 读 o_order
order_diy_offer
替换型优惠券可能 不清满减(见优惠文档 §6.7)有 checkCouponUseWithPromotionStatus
支付货到付款,无 gateway 步在线支付

9.3 COD 与在线入口并存

CheckoutService::generateCheckoutUrlArrayByCodConfig() 根据 cod_checkout_type 返回:

  • online_checkout_url — 由 checkout_process 决定三种在线之一
  • cod_checkout_url/cod-checkouts/{token}

模板可在页内切换「在线付 / 货到付款」(配置 3、4 时)。

9.4 COD 单页(扩展)

商品维着陆、无 checkout_token 的 COD 下单见 cod-one-page-checkout.md,API 前缀 cod-one-page-checkouts,仍走 CodOrderHandlerService,但与本文「购物车 token 主流程」分离。


10. 智能结账(smart)

配置 checkout_process=smart 时:

  1. 首次访问 getCurrentRequestCheckoutProcessType() 随机 分配 one_page / standard / single_page 之一(array_rand)。
  2. 写入 Cookie COOKIE_CHECKOUT_PROCESS_SMART(30 天)。
  3. 若后台更新 checkout_process_smart_update_time 晚于 Cookie,重新分配。

注意:smart 只影响 未创单前 的 URL;订单创建后以 order.checkout_type 为准。


11. 优惠体系在各形态下的落点(摘要)

完整规则见 promotion-discount-checkout.md。此处只强调 与结账形态相关 的差异。

能力标准单页渐进式COD
Cart diy_offer + 满减getListgetListgetListCodCartService
优惠券Cookie + useCouponuseCouponHandleruse-coupon APICodCouponService
order_diy_offershipping POSTcompleteshipping-method POST
getList 回写 order

持久化时机详表checkout-flows-detail.md §3


12. 如何选择阅读路径

你的问题去看
四种方式有什么区别本文 §5 对比表
标准 Liquid 每一步写什么库本文 §6 + detail §2.1
单页 complete 里调用顺序本文 §7 + detail §2.2
渐进式 API 列表detail §2.3
COD 为何没有积分落库本文 §9.2 + 优惠文档 §3
活动谁先谁后、能否叠加promotion-discount-checkout.md
COD 单页商品着陆cod-one-page-checkout.md

13. 文档拆分说明

文件内容
checkout-flows.md(本文)关系、对比、各形态主流程
checkout-flows-detail.mdAPI 逐步、落库表、Service 方法索引
promotion-discount-checkout.md优惠四体系、互斥、type 细拆

文档版本:与 OrderModel checkout_type、app/homeapi/route/route.php 路由注释一致。