# 支付服务(Payment)设计文档 > **设计日期**: 2026-06-08 > **版本**: v1.0 > **状态**: 设计中 > **适用前端**: admin-ui(管理后台)、管理 APP(接口一致) > **后端服务**: rui-payment-api(端口 9401,网关路径 `/payment/**`) > **后端状态**: ⏳ 预留,API 细节待补充 --- ## 一、背景与目标 ### 1.1 现状 收银系统(rui-cashier)已完成基础订单流程(开台、结账、退款),支付环节目前使用占位接口。需要建立独立的支付服务(rui-payment-api),作为聚合支付网关,统一对接多种第三方支付通道。 ### 1.2 目标 1. **聚合支付网关**:统一下单,按支付方式(微信、支付宝、银行卡等)自动路由到对应通道 2. **多通道可配置**:支持同时配置多个第三方支付平台,按门店/场景灵活启用 3. **商户进件**:商户在我们平台提交进件申请 → 平台审核 → 向第三方(微信、支付宝)提交进件 → 状态跟踪 4. **多端一致**:管理后台(Web)和管理 APP 共享同一套后端接口,前端按各自框架实现 ### 1.3 不在范围内 - 团购券/优惠券核销 - 会员余额/储值卡支付 - 对账、清算(后续迭代) - 顾客端支付流程(由 cashier-customer 负责,调用本服务下单接口) --- ## 二、整体架构 ``` ┌───────────────────────────────────────────────────────┐ │ 前端层 │ ├─────────────────────┬─────────────────────────────────┤ │ 管理后台 (admin-ui)│ 管理 APP (uni-app) │ │ Vue3 + Element │ Vue3 语法 │ ├─────────────────────┴─────────────────────────────────┤ │ 共享同一套后端 API │ │ /payment/admin/** │ └────────────────────────┬──────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────┐ │ rui-gateway (:9300) │ │ 路由:/payment/** → rui-payment-api │ └────────────────────────┬───────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────┐ │ rui-payment-api (:9401) │ ├────────────┬──────────────┬──────────────┬─────────────┤ │ 商户管理 │ 商户进件 │ 支付通道管理 │ 交易管理 │ │ Merchant │ Onboarding │ Channel │ Transaction│ ├────────────┴──────────────┴──────────────┴─────────────┤ │ 统一下单引擎 │ │ 按 payType 路由到对应第三方支付通道 │ ├────────────────────────────────────────────────────────┤ │ 微信支付通道 │ 支付宝通道 │ 银行卡通道(预留) │ └────────────────────────────────────────────────────────┘ ``` --- ## 三、菜单与权限 ### 3.1 菜单结构 ```json { "name": "payment", "menus": [ { "code": "payment", "name": "支付管理", "type": 1, "icon": "tabler:credit-card", "sortNo": 110, "children": [ { "code": "payment-merchant", "name": "商户管理", "type": 2, "icon": "tabler:building-bank", "path": "/payment/merchant", "permission": "payment:merchant:list", "sortNo": 1, "buttons": [ { "code": "btn:add", "name": "新增", "permission": "payment:merchant:add" }, { "code": "btn:edit", "name": "编辑", "permission": "payment:merchant:edit" }, { "code": "btn:del", "name": "删除", "permission": "payment:merchant:delete" }, { "code": "btn:detail", "name": "详情", "permission": "payment:merchant:detail" } ] }, { "code": "payment-onboarding", "name": "商户进件", "type": 2, "icon": "tabler:clipboard-check", "path": "/payment/onboarding", "permission": "payment:onboarding:list", "sortNo": 2, "buttons": [ { "code": "btn:apply", "name": "提交进件", "permission": "payment:onboarding:apply" }, { "code": "btn:audit", "name": "审核", "permission": "payment:onboarding:audit" }, { "code": "btn:submit", "name": "提交第三方", "permission": "payment:onboarding:submit" }, { "code": "btn:detail", "name": "详情", "permission": "payment:onboarding:detail" } ] }, { "code": "payment-channel", "name": "支付通道", "type": 2, "icon": "tabler:route", "path": "/payment/channel", "permission": "payment:channel:list", "sortNo": 3, "buttons": [ { "code": "btn:add", "name": "新增", "permission": "payment:channel:add" }, { "code": "btn:edit", "name": "编辑", "permission": "payment:channel:edit" }, { "code": "btn:status", "name": "启停", "permission": "payment:channel:status" } ] }, { "code": "payment-transaction", "name": "交易记录", "type": 2, "icon": "tabler:receipt", "path": "/payment/transaction", "permission": "payment:transaction:list", "sortNo": 4 } ] } ] } ``` ### 3.2 权限标识汇总 | 模块 | 权限标识 | 说明 | |------|----------|------| | 商户 | `payment:merchant:list` | 查询商户列表 | | 商户 | `payment:merchant:add` | 新增商户 | | 商户 | `payment:merchant:edit` | 编辑商户 | | 商户 | `payment:merchant:delete` | 删除商户 | | 商户 | `payment:merchant:detail` | 查看商户详情 | | 进件 | `payment:onboarding:list` | 查询进件列表 | | 进件 | `payment:onboarding:apply` | 提交进件申请 | | 进件 | `payment:onboarding:audit` | 审核进件 | | 进件 | `payment:onboarding:submit` | 提交至第三方 | | 进件 | `payment:onboarding:detail` | 查看进件详情 | | 通道 | `payment:channel:list` | 查询支付通道 | | 通道 | `payment:channel:add` | 新增通道配置 | | 通道 | `payment:channel:edit` | 编辑通道配置 | | 通道 | `payment:channel:status` | 启用/禁用通道 | | 交易 | `payment:transaction:list` | 查询交易记录 | --- ## 四、商户管理 ### 4.1 页面结构 **列表页** `/payment/merchant` | 字段 | 类型 | 宽度 | 说明 | |------|------|------|------| | merchantNo | string | 150 | 商户编号(系统生成) | | merchantName | string | 150 | 商户名称 | | contactName | string | 120 | 联系人 | | contactPhone | string | 130 | 联系电话 | | channelCount | number | 100 | 已开通通道数 | | status | enum | 100 | 状态 | | createTime | datetime | 160 | 创建时间 | **查询条件**:商户编号、商户名称、状态 **操作按钮**:新增、编辑、详情、删除 **详情页/弹窗**:展示商户基础信息 + 已开通通道列表 + 进件记录 ### 4.2 字段定义 ```typescript interface MerchantDTO { id: number /** 商户编号(系统生成,如 M202606080001) */ merchantNo: string /** 商户名称 */ merchantName: string /** 商户简称 */ merchantShortName: string /** 联系人 */ contactName: string /** 联系电话 */ contactPhone: string /** 联系邮箱 */ contactEmail?: string /** 商户地址 */ address?: string /** 备注 */ remark?: string /** 状态:0-禁用 1-启用 */ status: number /** 已开通通道数(只读) */ channelCount?: number createTime: string updateTime: string } ``` ### 4.3 状态枚举 | 值 | 名称 | 说明 | |----|------|------| | 0 | 禁用 | 商户被禁用,无法交易 | | 1 | 启用 | 正常状态 | --- ## 五、商户进件 ### 5.1 业务流程 ``` 商户提交进件申请 │ ▼ 平台初审(内部审核) │ ┌───┴───┐ │ │ 驳回 通过 │ │ ▼ ▼ 退回 提交第三方 修改 │ ┌───┴───┐ │ │ 进件中 进件失败 │ │ ▼ ▼ 进件成功 查看原因 → 修改后重新提交 ``` ### 5.2 页面结构 **列表页** `/payment/onboarding` | 字段 | 类型 | 宽度 | 说明 | |------|------|------|------| | merchantName | string | 150 | 商户名称 | | channelName | string | 120 | 目标通道 | | submitterName | string | 120 | 提交人 | | status | enum | 120 | 进件状态 | | auditStatus | enum | 120 | 内部审核状态 | | thirdPartyStatus | enum | 120 | 第三方状态 | | submitTime | datetime | 160 | 提交时间 | | updateTime | datetime | 160 | 更新时间 | **查询条件**:商户名称、目标通道、进件状态、提交时间范围 **操作按钮**:提交进件、审核、提交第三方、查看详情 **进件申请弹窗/页面**: 分步表单,包含以下信息区域: #### 5.2.1 基础信息 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | merchantId | select | ✅ | 关联商户(下拉选择) | | channelType | select | ✅ | 目标通道(微信/支付宝/银行卡) | | merchantType | select | ✅ | 商户类型(企业/个体工商户/小微商户) | | merchantName | input | ✅ | 商户名称(营业执照上的名称) | | merchantShortName | input | ✅ | 商户简称(对外展示) | | licenseNo | input | ✅ | 营业执照号 | | licenseExpireDate | date | ✅ | 营业执照有效期 | | licensePhoto | upload | ✅ | 营业执照照片 | #### 5.2.2 法人信息 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | legalPersonName | input | ✅ | 法人姓名 | | legalPersonIdNo | input | ✅ | 法人身份证号 | | legalPersonIdFront | upload | ✅ | 身份证正面 | | legalPersonIdBack | upload | ✅ | 身份证反面 | | legalPersonIdExpire | date | ✅ | 身份证有效期 | #### 5.2.3 结算信息 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | settleType | select | ✅ | 结算方式(对公/对私) | | bankName | input | ✅ | 开户银行 | | bankBranch | input | ✅ | 开户支行 | | bankAccountNo | input | ✅ | 银行账号 | | bankAccountName | input | ✅ | 户名 | | bankLicensePhoto | upload | 条件 | 开户许可证(对公必填) | #### 5.2.4 其他材料 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | storePhotos | upload | ✅ | 门店照片(支持多张) | | extraMaterials | upload | ❌ | 补充材料(支持多张) | | remark | textarea | ❌ | 备注 | ### 5.3 字段定义 ```typescript interface MerchantOnboardingDTO { id: number /** 关联商户 ID */ merchantId: number /** 目标通道类型 */ channelType: ChannelType /** 商户类型:1-企业 2-个体工商户 3-小微商户 */ merchantType: number /** 商户名称(营业执照) */ merchantName: string /** 商户简称 */ merchantShortName: string /** 营业执照号 */ licenseNo: string /** 营业执照有效期 */ licenseExpireDate: string /** 营业执照照片(文件 ID) */ licensePhoto: number /** 法人姓名 */ legalPersonName: string /** 法人身份证号 */ legalPersonIdNo: string /** 身份证正面(文件 ID) */ legalPersonIdFront: number /** 身份证反面(文件 ID) */ legalPersonIdBack: number /** 身份证有效期 */ legalPersonIdExpire: string /** 结算方式:1-对公 2-对私 */ settleType: number /** 开户银行 */ bankName: string /** 开户支行 */ bankBranch: string /** 银行账号 */ bankAccountNo: string /** 户名 */ bankAccountName: string /** 开户许可证(文件 ID,对公必填) */ bankLicensePhoto?: number /** 门店照片(文件 ID 数组) */ storePhotos: number[] /** 补充材料(文件 ID 数组) */ extraMaterials?: number[] /** 内部审核状态 */ auditStatus: AuditStatus /** 第三方进件状态 */ thirdPartyStatus: ThirdPartyStatus /** 第三方返回的商户号 */ thirdPartyMerchantNo?: string /** 第三方返回原因(失败时) */ thirdPartyRejectReason?: string /** 审核人 */ auditorName?: string /** 审核时间 */ auditTime?: string /** 审核意见 */ auditRemark?: string /** 提交人 */ submitterName?: string /** 提交时间 */ submitTime?: string remark?: string createTime: string updateTime: string } ``` ### 5.4 状态枚举 **内部审核状态** `AuditStatus` | 值 | 名称 | 说明 | |----|------|------| | 0 | 待提交 | 草稿,尚未提交审核 | | 1 | 待审核 | 已提交,等待平台审核 | | 2 | 审核通过 | 平台审核通过 | | 3 | 审核驳回 | 平台审核驳回,可修改后重新提交 | **第三方进件状态** `ThirdPartyStatus` | 值 | 名称 | 说明 | |----|------|------| | 0 | 未提交 | 尚未提交至第三方 | | 1 | 审核中 | 第三方审核中 | | 2 | 进件成功 | 第三方审核通过,获得商户号 | | 3 | 进件失败 | 第三方审核驳回 | | 4 | 已冻结 | 第三方冻结商户 | ### 5.5 交互规则 1. **提交进件**:填写信息 → 提交内部审核(状态 → 待审核) 2. **内部审核**:审核通过 → 状态变为审核通过;驳回 → 填写原因,状态变为审核驳回 3. **提交第三方**:审核通过后,可提交至第三方(状态 → 审核中) 4. **状态同步**:第三方回调更新状态(成功/失败) 5. **重新提交**:审核驳回或第三方失败时,可修改后重新走流程 --- ## 六、支付通道管理 ### 6.1 页面结构 **列表页** `/payment/channel` | 字段 | 类型 | 宽度 | 说明 | |------|------|------|------| | channelName | string | 150 | 通道名称 | | channelType | enum | 120 | 通道类型 | | channelProvider | string | 150 | 通道提供方 | | merchantCount | number | 100 | 关联商户数 | | status | enum | 100 | 状态 | | createTime | datetime | 160 | 创建时间 | **查询条件**:通道名称、通道类型、状态 **操作按钮**:新增通道、编辑、启用/禁用 **通道配置弹窗**: | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | channelName | input | ✅ | 通道名称(如"微信支付-主通道") | | channelType | select | ✅ | 通道类型(见枚举) | | channelProvider | select | ✅ | 通道提供方(微信/支付宝/银联等) | | appId | input | ✅ | 应用 ID(AppId/MchId) | | merchantId | input | ✅ | 商户号 | | apiVersion | input | ❌ | API 版本 | | certFile | upload | 条件 | 证书文件(部分通道需要) | | notifyUrl | input | ✅ | 回调通知地址 | | remark | textarea | ❌ | 备注 | | status | radio | ✅ | 状态(启用/禁用) | ### 6.2 字段定义 ```typescript interface PayChannelDTO { id: number /** 通道名称 */ channelName: string /** 通道类型 */ channelType: ChannelType /** 通道提供方 */ channelProvider: string /** 应用 ID */ appId: string /** 商户号 */ merchantId: string /** API 版本 */ apiVersion?: string /** 证书文件(文件 ID) */ certFile?: number /** 回调通知地址 */ notifyUrl: string /** 关联商户数(只读) */ merchantCount?: number /** 状态:0-禁用 1-启用 */ status: number remark?: string createTime: string updateTime: string } ``` ### 6.3 状态枚举 **通道类型** `ChannelType` | 值 | 名称 | 说明 | |----|------|------| | WECHAT | 微信支付 | 微信 JSAPI / H5 / Native / APP | | ALIPAY | 支付宝 | 支付宝网页/APP/扫码 | | BANK_CARD | 银行卡 | 银行卡支付(预留) | **通道提供方** `ChannelProvider` | 值 | 名称 | 说明 | |----|------|------| | WECHAT_DIRECT | 微信直连 | 直接对接微信支付 | | ALIPAY_DIRECT | 支付宝直连 | 直接对接支付宝 | | LAKALA | 拉卡拉 | 聚合支付服务商 | | SHOULIANGBA | 收钱吧 | 聚合支付服务商 | | OTHER | 其他 | 其他聚合支付服务商 | > 通道提供方后续可扩展,前端建议做成可配置的字典。 --- ## 七、交易记录 ### 7.1 页面结构 **列表页** `/payment/transaction`(只读) | 字段 | 类型 | 宽度 | 说明 | |------|------|------|------| | transactionNo | string | 180 | 交易流水号 | | merchantName | string | 150 | 商户名称 | | channelName | string | 120 | 支付通道 | | payType | enum | 100 | 支付方式 | | amount | money | 120 | 交易金额 | | fee | money | 100 | 手续费 | | status | enum | 100 | 交易状态 | | payTime | datetime | 160 | 支付时间 | | createTime | datetime | 160 | 创建时间 | **查询条件**:交易流水号、商户名称、支付方式、交易状态、时间范围 **操作**:查看详情 ### 7.2 字段定义 ```typescript interface TransactionDTO { id: number /** 交易流水号 */ transactionNo: string /** 关联商户 ID */ merchantId: number /** 商户名称(冗余) */ merchantName: string /** 支付通道 ID */ channelId: number /** 通道名称(冗余) */ channelName: string /** 支付方式 */ payType: ChannelType /** 交易金额(元) */ amount: number /** 手续费(元) */ fee: number /** 交易状态 */ status: TransactionStatus /** 第三方交易号 */ thirdPartyTransactionNo?: string /** 支付时间 */ payTime?: string /** 关联的业务订单号 */ bizOrderNo?: string /** 退款金额(元) */ refundAmount?: number /** 备注 */ remark?: string createTime: string updateTime: string } ``` ### 7.3 状态枚举 **交易状态** `TransactionStatus` | 值 | 名称 | 说明 | |----|------|------| | 0 | 待支付 | 已创建,等待支付 | | 1 | 支付中 | 正在处理 | | 2 | 支付成功 | 支付完成 | | 3 | 支付失败 | 支付失败 | | 4 | 已关闭 | 超时关闭或手动关闭 | | 5 | 已退款 | 全额退款 | | 6 | 部分退款 | 部分退款 | --- ## 八、统一下单流程(前端视角) ``` 顾客端(cashier-customer) 支付服务(rui-payment-api) 第三方 │ │ │ │ 1. 发起支付 │ │ │ (payType, amount, │ │ │ merchantId, bizOrderNo) │ │ │ ──────────────────────────────► │ │ │ │ 2. 按 payType 路由通道 │ │ │ 3. 创建交易记录 │ │ │ ──────────────────────────► │ │ │ 4. 调用第三方下单 │ │ 5. 返回支付参数 │ │ │ (二维码/跳转URL/支付SDK参数) │ │ │ ◄────────────────────────────── │ │ │ │ │ │ 6. 顾客完成支付 │ │ │ │ ◄────────────────────────── │ │ │ 7. 第三方回调通知 │ │ │ 8. 更新交易状态 │ │ 9. 查询支付结果 │ │ │ ──────────────────────────────► │ │ │ 10. 返回支付结果 │ │ │ ◄────────────────────────────── │ │ ``` > 统一下单和支付回调的具体 API 定义待后端整理后补充。 --- ## 九、前端页面清单 | 页面 | 路由 | 说明 | |------|------|------| | 商户列表 | `/payment/merchant` | 商户 CRUD | | 商户详情 | `/payment/merchant/:id` | 商户信息 + 通道 + 进件记录 | | 进件列表 | `/payment/onboarding` | 进件记录查询 | | 进件申请 | `/payment/onboarding/apply` | 分步表单(新开页面) | | 进件详情 | `/payment/onboarding/:id` | 进件详情 + 状态跟踪 | | 支付通道列表 | `/payment/channel` | 通道配置管理 | | 通道配置 | `/payment/channel/:id?` | 新增/编辑通道 | | 交易记录 | `/payment/transaction` | 交易查询(只读) | | 交易详情 | `/payment/transaction/:id` | 交易详情 | --- ## 十、待补充项 以下内容由后端整理后补充,前端文档标记为占位: 1. **API 接口定义**:各模块的请求路径、请求参数、响应结构 2. **统一下单接口**:下单、查询、回调的完整 API 定义 3. **通道配置参数**:不同通道的特定配置字段(如微信的 v3 密钥、支付宝的私钥等) 4. **对账相关**:对账单查询、差异处理(后续迭代) 5. **文件上传**:进件材料的 bizType 定义(参考 `API设计规范.md` 第 13 节存储服务) --- > **下一步**: 后端整理 API 细节后,更新本文档的待补充项,然后前端可开始实现页面。