Ver Fonte

docs(乐收赢): 接入文档补 §5.8 收款链接 —— 那条腿与前七个接口的语义都不一样

开放 API 多了一个 `POST /payment/openapi/pay/checkout/link`,它和其余七个端点有一条
根本差别,文档必须自己说清楚,否则对接方一定会按 5.2 的直觉用错:
**金额不是调用方定的,单号也不来自调用方** —— 顾客在页面上输金额、单号由平台在那一刻生成。

写进文档的四条(都可复核):
- 幂等:同一商户反复调用返回**同一条** `url`。链接是要印出来贴出去的,换 token 等于让
  已经发出去的那些作废。所以本接口首次调用会**写**一行,与三个下单端点同形。
- 不产生订单、不接受金额 ⇒ 这条链接**不能**用来「收固定的 100 元」;要收指定金额用 5.2。
- 单号以 `CS` 开头、**不出现在响应里**,因此这条路收进来的钱**无法用调用方订单号对账**;
  这类订单在平台管理端订单列表里核对,成交通知走第 7 章(本接口不收 `notify_url`,
  走你方配置的默认回调地址 —— 对应 `LsyCallbackService` 回退到 `open_conf` 的那一级)。
- 一张对照表(谁定金额 / 单号从哪来 / 能用几次 / 谁来打开),把 5.2 与 5.8 并排放。

同时改了两处**会随这次新增而失真**的计数与清单(改文档最容易漏的就是这两处):
§1 的「共 10 个接口」→ 11,并把新端点加进那张能力表;§3.5 的 B 型信封清单加上 `checkout/link`。
§9 补一条 Q(「我这边什么都不知道,也没有订单号」),那会是这条腿最多人问的一句。

切片器验证:`collectionDoc.ts` 加一条侧边栏条目后,用真 md 跑 `buildSections` ——
11 条定义 == 11 条产出(一条都没静默消失),新条目正文 1326 字符且含接口路径;
正对照:在内存里把 md 那行标题改一个字,同一条立刻消失(`take()` 对不上是**静默**丢弃,
这条检查必须真的会红,否则「每条都在」只是「它从来不报错」)。
alphaH há 2 semanas atrás
pai
commit
3c47de8c82

+ 1 - 0
frontend/src/views/module_payment/apikey/collectionDoc.ts

@@ -24,6 +24,7 @@ const SECTIONS: DocSectionDef[] = [
   { key: "collection_close", title: "撤销关单", parts: ["### 5.5 撤销 / 关单"] },
   { key: "collection_refund", title: "发起退款", parts: ["### 5.6 退款"] },
   { key: "collection_refund_query", title: "退款查询", parts: ["### 5.7 退款查询"] },
+  { key: "collection_checkout_link", title: "收款链接", parts: ["### 5.8 收款链接(顾客自填金额)"] },
   {
     key: "collection_status",
     title: "状态与通知",

+ 64 - 2
frontend/src/views/module_payment/apikey/docs/collection-openapi.md

@@ -9,7 +9,7 @@
 
 ## 1. 概述
 
-平台提供五类能力,共 10 个接口,分属**两条通道**。
+平台提供五类能力,共 11 个接口,分属**两条通道**。
 
 **收付款通道 —— 路径前缀 `/payment/openapi/pay`(详解见 5)**
 
@@ -22,6 +22,7 @@
 | 撤销 | 撤销 / 关单 | `POST /payment/openapi/pay/order/close` |
 | 退款 | 发起退款 | `POST /payment/openapi/pay/refund` |
 | 退款 | 退款查询 | `POST /payment/openapi/pay/refund/query` |
+| 收款 | 收款链接 —— 生成一条**顾客自填金额**的收款页链接(桌牌 / 菜单用) | `POST /payment/openapi/pay/checkout/link` |
 
 **门店与订单通道 —— 路径前缀 `/payment/openapi/har`(详解见 10)**
 
@@ -249,7 +250,7 @@ f6b153e6c542461ea27ab291c30a5737bdaea8bbf3c7bf03ccdbfe7132bf6a11
 }
 ```
 
-**B 型 —— 其余接口**(`order/query`、`order/close`、`refund`、`refund/query`,以及 10 章的 3 个接口)用统一信封:
+**B 型 —— 其余接口**(`order/query`、`order/close`、`refund`、`refund/query`、`checkout/link`,以及 10 章的 3 个接口)用统一信封:
 
 ```json
 {
@@ -581,6 +582,61 @@ POST /payment/openapi/pay/refund/query
 
 ---
 
+### 5.8 收款链接(顾客自填金额)
+
+生成一条**长期有效、可反复使用**的收款链接。打开它的是平台托管的收款页:顶部显示商户名,
+顾客**自己输入金额**,确认后平台按该商户发起一笔真实主扫,并把顾客送到支付页。
+
+适合固定门店 / 固定收款人的场景:打印成桌牌、放进公众号菜单、贴在电子发票页。
+典型的用法是把返回的 `url` **渲染成二维码**印出来。
+
+```
+POST /payment/openapi/pay/checkout/link
+```
+
+**请求**
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `merchant_code` | string | 否 | 这条链接收到哪个商户名下,规则同 5.1 |
+| `enterprise_id` | string | 否 | 已停用,传了会被拒绝(同 2 章) |
+
+**响应**(B 型,`data` 内)
+
+| 字段 | 说明 |
+|---|---|
+| `mch_no` | 乐收赢商户号 |
+| `merchant_name` | 打开链接时顾客看到的商户名(**生成当时的快照**,商户改名后重新取一次即可刷新) |
+| `url` | 完整收款链接,形如 `https://<域名>/#/checkout/<token>` |
+
+> **幂等**:同一个商户反复调用返回**同一条** `url`。链接是要印出来贴出去的,
+> 每取一次换一个 token 等于让已经发出去的那些作废。本接口首次调用会**建立一条记录**,
+> 之后每次都返回它。
+
+**它和你自己的订单号没有关系**
+
+- 本接口**不产生订单**,也不接受金额 —— 金额由顾客在页面上输入(最低 1 元)。
+  所以这条链接**不能**用来「收固定的 100 元」;要收指定金额请用 5.2。
+- 订单在顾客按下确认的那一刻才创建,单号由平台生成(以 `CS` 开头),
+  **不会**出现在本接口的响应里,也不来自你方。
+- 因此这条路收进来的钱**无法用你方订单号对账**。本接口也不接受 `notify_url`:
+  这类订单的成交通知按第 7 章投递到你方配置的默认回调地址。
+  它们同时会出现在平台管理端的订单列表里,可按商户号与时间核对。
+
+> ⚠️ **事先想清楚这一点再用**:拿到链接的**任何人**都能发起一笔支付,金额由发起人自己填。
+> 它适合「谁都可以往这个商户付钱、付多少自己定」的场景,不适合「这笔订单该收多少钱」。
+
+**与 5.2 二维码支付的区别**
+
+| | 5.2 二维码支付 | 5.8 收款链接 |
+|---|---|---|
+| 谁决定金额 | 你(接口参数 `total_amount`) | 顾客(在页面上输入) |
+| 单号从哪来 | 你传的 `out_trade_no` | 平台生成,`CS` 开头 |
+| 一张能用几次 | 一次,默认 15 分钟过期 | 长期有效,无限次 |
+| 谁来打开 | 顾客扫你做出来的码 | 顾客点开链接(或扫你把 `url` 做出来的码) |
+
+---
+
 ## 6. 状态说明
 
 ### 订单状态
@@ -743,6 +799,12 @@ Content-Type: application/x-www-form-urlencoded
 **Q:一笔订单能退几次?**
 不限次数,但同一时刻只允许一笔在途退款,且累计退款金额不得超过订单金额。
 
+**Q:我用 5.8 取了收款链接,但顾客付完款我这边什么都不知道,也没有订单号?**
+正常。链接里的金额是顾客自己填的,单号由平台在顾客按下确认时才生成,两者都不经过你。
+这类收款请按「商户号 + 时间」在平台管理端的订单列表里核对(单号以 `CS` 开头),
+并把第 7 章的回调当成通知手段 —— 它不会带上你自己的订单号。
+需要「我心里有个号、收款能对上」的场景,用 5.2(主扫)或 5.1(被扫)。
+
 **Q:回调丢了怎么办?**
 平台最多重试 8 次。之后请主动调用 5.4 订单查询。建议你在自己的系统里对长时间处于 `CREATED` / `PAYING` 的订单做轮询兜底。