◀ 返回目录 04_设计 / 一期方案调整:采用线下支付 04_设计/一期方案_线下支付.md

一期方案调整:采用线下支付

版本:v0.1 日期:2026-10-15 性质:架构决策记录


一、结论

一期不接微信支付,全流程走线下收款;系统只做订单记录与记账。 凡是无法用现有条件直接实现的能力,一律留空位(接口与数据结构预留),二期再填。


二、这个决定一次解决了四个问题

原问题 严重程度 现在
个人主体开不了微信支付 🔴 阻塞全部收费功能 ✅ 绕开
需要甲方微信支付商户号(卡点 G3) 🔴 阻塞上线 ✅ 绕开
平台收款再分账=二清 🔴 违法风险 ✅ 资金不经平台,不存在二清
分账比例 30% 上限需申请 🟡 时间不定 ✅ 不涉及
甲方资质办理进度牵制开发 🟡 影响排期 ✅ 大大缓解

最关键的一条:钱不经平台,平台就不是资金清算方。二清问题从架构上消失了。


三、一期收款流程(改造后)

图 1 一期收款流程(改造后) 9 个环节
起止 步骤 关键节点 分支
用户下单
用户浏览 → 选陪练 → 下单
平台生成订单,状态=待确认收款
用户线下付款(扫码/转账/现金)
陪练者确认已收款
平台状态=待派单,然后派单
陪练者服务进行
用户确认完成
状态=已完成:只记本地流水,不触发资金划转

四、订单状态机(改造后)

图 2 订单状态机(改造后) 13 个节点 · 最深 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 二期恢复清单 11 个节点 · 最深 2 层
根节点 一级 二级 更深 点节点可折叠/展开它的下级
  • 二期开工
    • 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. 全流程联调 + 回归