一期方案调整:采用线下支付
版本:v0.1 日期:2026-10-15 性质:架构决策记录
一、结论
一期不接微信支付,全流程走线下收款;系统只做订单记录与记账。 凡是无法用现有条件直接实现的能力,一律留空位(接口与数据结构预留),二期再填。
二、这个决定一次解决了四个问题
| 原问题 | 严重程度 | 现在 |
|---|---|---|
| 个人主体开不了微信支付 | 🔴 阻塞全部收费功能 | ✅ 绕开 |
| 需要甲方微信支付商户号(卡点 G3) | 🔴 阻塞上线 | ✅ 绕开 |
| 平台收款再分账=二清 | 🔴 违法风险 | ✅ 资金不经平台,不存在二清 |
| 分账比例 30% 上限需申请 | 🟡 时间不定 | ✅ 不涉及 |
| 甲方资质办理进度牵制开发 | 🟡 影响排期 | ✅ 大大缓解 |
最关键的一条:钱不经平台,平台就不是资金清算方。二清问题从架构上消失了。
三、一期收款流程(改造后)
图 1
一期收款流程(改造后)
起止
步骤
关键节点
分支
用户下单
用户浏览 → 选陪练 → 下单
平台生成订单,状态=待确认收款
用户线下付款(扫码/转账/现金)
陪练者确认已收款
平台状态=待派单,然后派单
陪练者服务进行
用户确认完成
状态=已完成:只记本地流水,不触发资金划转
四、订单状态机(改造后)
图 2
订单状态机(改造后)
根节点
一级
二级
更深
点节点可折叠/展开它的下级
- 待确认收款
- 已收款 ──→ 待派单
- 超时未收款 ──→ 已取消
- 待派单
- 抢单 / 指派成功 ──→ 待服务
- 超时无人接 ──→ 已取消
- 待服务 ──→ 进行中 ──→ 待确认 ──→ 已完成
- (以下与改造前一致)
- 已完成
- 记一条本地流水(不触发任何资金划转)
- 异常分支
- 售后退款 ──→ 管理员标记「已线下退款」+ 记流水
- 提现──→ 管理员线下打款 + 系统只记状态
改动点:原来的「待支付」变成「待确认收款」;原来「已完成 → 触发分账」改成「已完成 → 只记本地流水」。
五、占位清单:无法直接实现的,先空着
每一处都留了接口定义与数据结构,二期只填实现体,不动调用方。
| # | 占位项 | 空在哪 | 一期怎么办 | 二期补什么 |
|---|---|---|---|---|
| 1 | 微信支付下单 | pay.createOrder |
直接返回成功,订单进「待确认收款」 | 接统一下单,拿 prepay_id |
| 2 | 支付回调 | pay.notify |
函数体留空 + 注释说明用途 | 接微信回调、验签、改状态 |
| 3 | 资金分账 | pay.profitSharing |
函数体留空;只写 payments 记录 |
接分账接口,写入分账明细 |
| 4 | 退款 | pay.refund |
管理员手动标记已退款 + 记流水 | 接退款接口 |
| 5 | 提现打款 | wallet.transfer |
财务线下打款,系统只改状态 | 接商家转账到零钱 |
| 6 | 第三方实名认证 | user.verifyRealname |
人工审核证件照片 | 接第三方实名接口 |
| 7 | 定位能力 | 前端 getLocation 封装 |
用假坐标 / 手输地址;接口保留 | 换主体后启用(个人主体无定位权限) |
| 8 | 实时语音通话 | 不建 | 只留入口占位,点击提示「敬请期待」 | 需网络文化经营许可证 |
| 9 | 订阅消息推送 | notify.send |
函数体留空;先只在站内提醒 | 配模板后接入 |
| 10 | 官方内容安全接口 | audit.check |
本地关键词库过滤 + 人工复核 | 接微信内容安全接口 |
| 11 | 服务地址地图选点 | 前端地址组件 | 纯手输地址 | 换主体后接地图选点 |
| 12 | 优惠券 / 邀请有礼 | 不建 | 入口隐藏 | 二期整体做 |
占位写法约定
// 云函数 pay/index.js
exports.notify = async (event) => {
// TODO【二期】微信支付结果回调
// 1. 验签
// 2. 更新 orders.status
// 3. 写 payments 记录
// 4. 记录失败进入重试队列
return { ok: true, stub: true };
};
规则:占位函数必须能正常返回、不报错,这样调用方代码可以按最终形态写好,二期只删 stub 分支。
六、数据结构需要调整的地方
| 集合 | 调整 | 说明 |
|---|---|---|
orders |
status 枚举改:删「待支付」,加「待确认收款」 |
见下方新枚举 |
orders |
新增 pay_channel |
0线下 1微信支付(二期),一期恒为 0 |
orders |
新增 receipt_status |
0待确认 1已确认 2已驳回 |
orders |
新增 receipt_confirmer |
确认人(管理员 / 陪练者) |
orders |
新增 receipt_at |
确认收款时间 |
orders |
platform_fee / coach_income 保留字段 |
一期只做记账不划转,二期直接复用 |
payments |
保留,一期只写 pay_channel=0 的记录 |
分账相关字段(transaction_id 等)留空 |
wallets |
保留 | 一期只体现「应得」金额,不做真实提现 |
withdrawals |
保留 | 一期为「线下打款登记」,不接支付接口 |
新的订单状态枚举
0 待确认收款 ← 新
1 待派单
2 待服务
3 进行中
4 待确认
5 已完成
6 已取消
7 退款中 ← 一期为线下退款登记
8 已退款
9 售后中
七、对排期的影响
| 项 | 变化 |
|---|---|
| 卡点 G3(商户号+服务类目通过) | 不再阻塞支付联调,降级为「上线前必须完成」 |
| D21 支付联调 | 改为「线下收款流程测试 + 回归测试」,工作量减少 |
| D15 支付环节 | 改为「收款确认页 + 管理员确认流程」,比接支付简单 |
| 上线时间 | 不再取决于甲方资质办理进度,可控性大幅提升 |
释放出来的约 1 天,建议加到 D21 做全流程回归测试。
八、这个方案需要甲方确认的三件事
| # | 待确认 | 备选 |
|---|---|---|
| 1 | 用户把钱付给谁? | ① 付给陪练者,平台只记录;② 付给平台(收款码/转账),管理员手动确认;③ 先付定金给平台、尾款线下 |
| 2 | 谁确认已收款? | ① 平台管理员;② 陪练者自己确认,管理员可复核 |
| 3 | 平台抽成怎么执行? | ① 一期不抽成,纯试运营;② 月结对账,陪练者线下/转账回佣;③ 二期接支付后自动分账 |
第 3 条要特别说清楚:一期若平台真的向陪练者收佣金,属于「有偿提供信息服务」,合规上会多一层要求;如果一期只做内部试运营、不收费,这个问题不存在。 建议一期先不抽成。
九、必须提醒的一条:这个方案没有绕开所有问题
线下支付解决了资金链路的合规问题,但没解决:
| 仍是问题 | 说明 |
|---|---|
| 服务类目 | 微信类目库里没有「陪玩」类目,提审仍要过这一关 |
| 主体类型 | 上线仍需组织主体(个体工商户/企业);个人主体只能做测试 |
| 小程序备案 | 上线前必须完成,与支付无关 |
| 内容合规 | UGC、未成年人保护、内容审核要求不变 |
| 平台定性 | 陪练者若是自由入驻的第三方商家,仍可能被认定为交易平台(问卷第 15 题) |
但好消息是:这五条全都是「上线前」的要求,不再阻塞开发。 开发可以在个人主体测试号上完整跑通。
十、二期恢复清单
接微信支付时,按这个顺序填:
图 3
二期恢复清单
根节点
一级
二级
更深
点节点可折叠/展开它的下级
- 二期开工
- 1. 甲方的微信支付商户号到位并绑定小程序
- 2. 填 pay.createOrder 实现(统一下单)
- 3. 填 pay.notify 实现(回调验签 + 改状态)
- 4. 填 pay.refund 实现(退款)
- 5. 确认分账产品(直连商户分账 / 平台收付通)—— 需先问 95017-2
- 6. 申请提升分账比例(若抽佣 > 30%)
- 7. 填 pay.profitSharing 实现(分账)
- 8. 填 wallet.transfer 实现(提现打款)
- 9. 把 orders.pay_channel 允许值加上 1
- 10. 全流程联调 + 回归