Răsfoiți Sursa

App对接文档补充版本2入参变化:新增字段语义、取值来源变化与回传规则

qmj 4 zile în urmă
părinte
comite
26de700dbf
1 a modificat fișierele cu 21 adăugiri și 0 ștergeri
  1. 21 0
      specs/008-promotion-coupon/app-integration.md

+ 21 - 0
specs/008-promotion-coupon/app-integration.md

@@ -132,6 +132,27 @@
 }
 ```
 
+### 入参相对旧契约的变化(版本2)
+
+**结构上只多两个可选字段**,其余字段全部沿用:
+
+| 新字段 | 位置 | 作用 | 不传的后果 |
+|---|---|---|---|
+| `promotionPricingVersion` | `items[0]` | 传 `2` 显式接入新契约:服务端同事务重算并固化快照;不传则完全走旧流程(新旧 App 共存、灰度、回滚都靠它) | 旧流程处理:不算免运、不重算不核对、金额按客户端传入入库 |
+| `specValueIds` | `items[0].cartItems[m]` | 只报"选了哪些规格值",规格加价由服务端查数据库计算(旧 `specPrice` 是客户端自报金额,不采信) | 无规格商品可不传;有规格商品必传,缺失/伪造返回 `invalidSpec` |
+
+旧流程已有字段在版本2下的**取值来源变化**:
+
+| 字段 | 旧流程 | version=2 |
+|---|---|---|
+| `items[0].amount` | 客户端自算 | **必须 = 报价 `payableAmount`(A)**,服务端核对 |
+| `items[0].freight` | 客户端自算 | **必须 = 报价 `deliveryFee`(R)**,免运时也传 R 不传 0 |
+| `input.actualPayAmount` | 客户端传 | 必须等于 A |
+| `input.totalAmount` / `totalDiscount` | 客户端传什么存什么 | 传了也被服务端覆盖(O+R / (O+R)−A) |
+| `items[0].food` / `foodAmount` / `specPrice` | 客户端数据原样入库 | 服务端按数据库价格重写,客户端值不采信 |
+
+**报价返回字段的回传规则**:下单只需回传两个数——`payableAmount`(→ `amount` 和父级 `actualPayAmount`)与 `deliveryFee`(→ `freight`)。F/D、freeDeliveryActivityId、appliedCouponId 等其余扩展字段**一律不用传**(服务端重算后自行固化);`merchantPayToRider`/`riderPayToMerchant`/`customerCollectAmount` 是查询侧只读派生值,任何接口都不接收。
+
 **必须遵守:**
 - `items` 必须只有 1 个、父/子 `type` 都为 0(**版本2下单限外送**:平台骑手与商家自配送门店均可,自配送单免运快照 F=0);自取/堂食下单走旧流程不带 version=2;违反返回 `unsupportedOrder`。
 - `item.amount` = 报价的 `payableAmount`(A),`item.freight` = 报价的 `deliveryFee`(R)——**免运时 freight 也照传 30,不要改成 0**;父单 `actualPayAmount` = A。服务端会在同一事务内重新报价并逐项核对。