Skip to content

钱包管理 PRD

文档信息

项目内容
产品名称PMForge - 钱包管理
文档版本v2.0
创建日期2026-09-20
最后更新2026-09-24
文档状态评审中
优先级P1
所属模块支付模块(pmforge-module-pay)

修订记录

版本日期修订人修订内容
v1.02026-09-24PMForge 产品团队初稿
v2.02026-09-19PMForge 产品团队增强业务场景、验收标准、跨模块联动、名词解释

一、功能概述

1.1 功能定位

钱包管理是 PMForge 支付模块的核心子模块,相当于每个用户在平台里的"零钱账户"

如果把应用管理(04-01)比作"收银台",那钱包管理就是用户的"口袋"——用户先把钱装进口袋(充值),然后在平台消费时直接从口袋里掏钱(余额支付),平台给发钱时也是直接往口袋里放(转账/退款)。

核心能力包括:

能力通俗解释
余额管理用户的"口袋里有多少钱",支持查看、调整、冻结
充值用户从银行卡/微信/支付宝往"口袋"里装钱,充值套餐有赠送
余额消费用户在平台买东西时直接用"口袋里的钱"付款
交易流水"口袋"的每一笔进出都有记录,像银行流水一样
充值套餐运营配置的"充100送20"等促销方案
转账平台主动给用户打钱(佣金、奖学金等)

钱包模块与应用管理(04-01)深度联动:充值时走应用管理的支付渠道,消费时作为应用管理的一种支付渠道(钱包支付),转账也复用应用管理的渠道配置。

1.2 目标用户

用户角色核心诉求使用频率
C端会员用户便捷充值、安全消费、账单清晰每日
平台运营人员快速调账、灵活配置套餐、处理异常每日
平台财务人员流水准确、可导出对账、转账可控每周
企业租户管理员了解租户内用户钱包状况、管理企业充值每周
系统管理员转账渠道配置、资金安全保障按需

1.3 业务价值

  • 降低交易成本:用户预充值后消费走内部余额扣减,不再每次调用第三方支付,省掉每笔交易的手续费
  • 提升用户留存:用户钱包里有余额,天然增加回访和消费频次;充值赠送进一步刺激充值意愿
  • 资金透明可追溯:每一分钱的变动都有流水记录,用户能查账单,财务能查对账,运营能排查问题
  • 运营工具齐全:后台提供手动调账、冻结钱包、流水导出、套餐管理等工具,减少开发介入
  • 转账打款能力:支持企业向用户打款,覆盖佣金结算、奖学金发放、推广奖励等场景

1.4 功能范围

功能分类后台管理端前台用户端
钱包列表与详情✅(仅本人)
余额调整(调增/调减)
钱包冻结/解冻
钱包流水查询✅(仅本人)
流水导出
流水按月汇总
充值套餐管理(CRUD)查看(仅上架套餐)
充值下单✅(代充)
充值退款✅(发起退款)
转账订单管理查看(仅本人)
转账审核
转账渠道配置✅(复用应用管理)

二、用户场景

2.1 用户角色

角色典型人物描述核心诉求
C端会员学员小张平台消费用户充值方便、到账快、账单看得懂
运营人员李姐平台运营管理员调账高效、套餐灵活、问题定位快
财务人员老张资金对账负责人流水准确、导出规范、转账可控
企业管理员王总租户侧管理者了解企业内用户充值情况
系统管理员小陈平台技术管理者转账渠道配置、资金安全保障

2.2 使用场景

场景1:学员小张充值消费全流程

用户:学员小张(C端会员)

场景:小张在平台学习课程,想充值一些余额方便后续消费。他进入"我的钱包"看到当前余额为 0 元,点击"充值"进入充值页面。页面上展示了几个充值套餐,他选择了"充100送20"套餐。点击"立即充值"后跳转到微信支付,完成支付后页面提示"充值成功,到账120元(含赠送20元)"。回到钱包页面,余额显示 120.00 元。之后小张购买一门课程时选择"余额支付",系统扣除 50 元,余额变为 70.00 元。他进入"交易记录"页面,能清晰看到充值 120 元和消费 50 元的记录。

期望:充值简单、到账快速、消费记录清晰、月度汇总一目了然。

场景2:运营李姐手动调账

用户:运营李姐

场景:学员反馈充值 100 元但余额只增加了 100 元(应该按套餐赠送 20 元共 120 元)。李姐在后台搜索该用户钱包,查看流水发现确实只有 100 元的充值流水,缺少赠送的 20 元。李姐点击"调整余额",选择"调增",输入 20 元,填写原因"充值套餐赠送金额未到账,手动补发"。提交后余额立即增加 20 元,系统自动生成一条"余额调整"流水。李姐通知用户已修复,用户在交易记录中能看到这笔调整。

期望:调账操作简单、有审批痕迹、流水可追溯。

场景3:财务老张月度对账

用户:财务老张

场景:月底老张需要核对钱包资金流水。他进入"钱包流水管理"页面,选择时间范围为本月,流水类型选择"充值",点击查询。列表展示本月所有充值流水,共 2350 条。老张点击"导出"按钮,下载 Excel 文件。打开 Excel 后核对充值总额与支付渠道账单是否一致,发现差了 0.5 元。通过流水号搜索定位到差异记录,确认是一笔退款导致的时差。核对完成后在报表上签字确认。

期望:数据准确、导出格式规范、支持多维度筛选。

场景4:财务小王发放推广佣金

用户:财务小王

场景:平台推广活动结束,需要给 30 位推广员发放佣金。小王在后台"转账管理"页面批量创建转账订单,选择转账渠道为"微信企业付款",填写每位推广员的收款账号和金额。提交后订单状态为"等待转账"。小王提交审核,审核通过后系统自动调用微信转账接口。几分钟后陆续收到回调,大部分转账成功,有 1 位推广员因微信账号异常转账失败。小王在转账详情里看到错误信息,联系推广员更新账号后重新发起。

期望:转账可批量、状态可追踪、失败可重试。

场景5:学员小陈查月度账单

用户:学员小陈(C端会员)

场景:小陈想了解自己上个月在平台花了多少钱。他进入"交易记录"页面,选择上个月的时间段。页面顶部显示"本月收入 200.00 元,支出 156.00 元"。下方流水列表展示了每笔交易:充值 100 元、赠送 20 元、购买课程 -50 元、购买课程 -36 元、退款 +30 元……小陈又切换到"只看消费"筛选,清楚看到本月共消费了 3 笔。

期望:数据直观、分类清晰、支持按月份和类型切换。

场景6:运营李姐冻结异常钱包

用户:运营李姐

场景:系统风控告警提示用户 A 的钱包存在异常大额充值。李姐在后台查看该用户钱包,确认存在可疑行为后,点击"冻结"按钮。系统弹出确认框提示"冻结后该用户将无法使用余额消费,但退款仍可入账"。李姐确认后钱包状态变为"冻结"。该用户后续尝试余额支付时,系统提示"钱包已冻结,请联系客服"。调查完毕后,李姐点击"解冻"恢复正常。

期望:冻结操作简单、影响范围明确、解冻即时恢复。

2.3 用户故事与验收标准

US-01:钱包查看

作为 C端会员用户,我希望 在"我的钱包"页面看到我的可用余额、冻结金额、累计充值和累计消费,以便 我了解自己的资金状况。

验收标准

  1. 首次访问钱包页面时,系统自动创建钱包,初始余额为 0,页面正常展示
  2. 金额展示单位为"元",保留 2 位小数(如 120.00)
  3. 冻结金额单独展示,与可用余额区分
  4. 页面加载时间 < 200ms

US-02:充值套餐选择与充值

作为 C端会员用户,我希望 选择充值套餐进行充值并享受赠送,以便 获得更多余额。

验收标准

  1. 充值页面仅展示状态为"启用"的套餐,按充值金额从小到大排列
  2. 每个套餐展示名称、充值金额、赠送金额(如"充100送20")
  3. 支付成功后,余额增加 = 充值金额 + 赠送金额
  4. 充值到账延迟 < 2 秒(从支付成功回调算起)
  5. 交易记录中生成一条"充值"流水,金额显示为到账总额

US-03:余额支付

作为 C端会员用户,我希望 在消费时选择余额支付,以便 快速完成付款。

验收标准

  1. 余额充足时"余额支付"选项可用,不足时置灰并提示"余额不足"
  2. 钱包冻结时"余额支付"不可用,提示"钱包已冻结"
  3. 支付成功后余额实时扣减,交易记录中生成一条"消费"流水
  4. 同一钱包的并发支付操作通过分布式锁保证不超扣

US-04:后台手动调账

作为 运营人员,我希望 手动调整用户钱包余额并记录原因,以便 处理充值异常等特殊情况。

验收标准

  1. 支持调增和调减两种操作
  2. 调整原因必填,最长 200 字
  3. 调减时余额不足则拒绝操作,不允许出现负余额
  4. 调整后自动生成"余额调整"类型流水
  5. 调整操作记录操作日志(操作人、时间、金额、原因)

US-05:流水查询与导出

作为 财务人员,我希望 按条件查询钱包流水并导出 Excel,以便 进行月度对账。

验收标准

  1. 支持按用户ID、流水类型、时间范围、金额范围筛选
  2. 流水类型包含:充值、充值退款、支付、支付退款、余额调整、转账
  3. 导出 Excel 包含:流水号、用户ID、业务类型、变动金额、变动后余额、关联业务ID、说明、创建时间
  4. 单次导出不超过 10 万条,超出提示缩小范围
  5. 导出文件名格式:钱包流水_YYYYMMDD_HHmmss.xls

US-06:转账管理

作为 财务人员,我希望 创建转账订单并跟踪转账状态,以便 向用户发放佣金或奖学金。

验收标准

  1. 转账订单创建后状态为"等待转账"
  2. 审核通过后系统自动调用渠道发起转账
  3. 转账状态实时更新:等待 → 进行中 → 成功/关闭
  4. 转账失败时记录错误码和错误信息,支持人工重试
  5. 支持导出转账订单 Excel

US-07:月度收支汇总

作为 C端会员用户,我希望 查看每月的收入和支出汇总,以便 了解自己的消费情况。

验收标准

  1. 选择月份后展示该月收入合计和支出合计
  2. 月份选择范围:最近 12 个月
  3. 汇总数据实时计算,与流水明细一致
  4. 支持按交易类型筛选(全部/充值/消费/退款/转账/其他)

三、功能需求

3.1 后台管理端 - 钱包管理

3.1.1 钱包列表

描述:展示平台所有用户的钱包信息,支持分页查询和条件筛选。

页面原型

钱包列表

业务规则

规则编号规则描述设计原因
WAL-001金额展示单位为"元",保留 2 位小数;数据库存储单位为"分"避免浮点精度问题,前端负责转换
WAL-002用户类型:会员(member)、管理员(admin)区分不同用户体系的钱包
WAL-003钱包状态:正常(normal)、冻结(frozen)支持风控冻结异常钱包
WAL-004冻结钱包不允许消费,但可以接收退款入账冻结是限制用户主动消费,不影响平台退款
WAL-005新用户首次访问钱包页面时自动创建钱包,初始余额为 0懒加载模式,避免为未使用钱包功能的用户创建无用数据
WAL-006钱包数据按租户隔离多租户架构要求

接口列表

接口名称请求方式路径说明
钱包分页查询GET/pay/wallet/page按条件查询钱包列表
钱包详情查询GET/pay/wallet/get根据用户ID获取钱包详情

3.1.2 钱包详情

描述:查看指定用户的钱包详情,包括余额变动明细和冻结记录。

页面原型

钱包详情

业务规则

规则编号规则描述设计原因
WAL-007钱包详情中展示的交易流水按时间倒序排列最新交易在最前面,便于快速定位
WAL-008冻结/解冻记录属于流水的一种类型,通过 bizType 区分统一流水模型,冻结解冻也有据可查

3.1.3 钱包余额调整

描述:后台手动调整用户钱包余额,支持调增和调减,需填写调整原因。

页面原型

钱包余额调整

业务规则

规则编号规则描述设计原因
WAL-009调增:余额增加,生成"余额调整"类型流水(bizType=5,price 为正)调增需有据可查
WAL-010调减:余额减少,生成"余额调整"类型流水(bizType=5,price 为负)调减同样需要流水记录
WAL-011调减时余额不足则拒绝操作,不允许出现负余额防止资金漏洞
WAL-012调整操作不可撤销,需通过反向调整实现修正保留完整操作痕迹,审计需要
WAL-013所有调整操作记录操作日志,包含操作人、操作时间、调整金额、调整原因敏感操作必须可追溯
WAL-014调整金额必须 > 0,单位为元,前端自动转为分避免 0 元或负数金额的无意义操作

接口列表

接口名称请求方式路径说明
更新钱包余额PUT/pay/wallet/update-balance手动调整用户余额

3.1.4 钱包冻结/解冻

描述:对异常用户钱包进行冻结,阻止其消费行为;支持解冻恢复正常状态。

业务规则

规则编号规则描述设计原因
WAL-015冻结状态下钱包不允许进行余额消费风控需要,阻止异常用户继续消费
WAL-016冻结状态下仍可接收退款入账冻结是限制用户主动行为,不影响平台退款义务
WAL-017冻结/解冻操作记录操作日志敏感操作可追溯
WAL-018冻结时需记录冻结原因便于后续审查和追溯

3.2 后台管理端 - 钱包流水管理

3.2.1 流水列表

描述:展示所有用户的钱包交易流水,支持多维度筛选与分页查询。

页面原型

钱包流水列表

业务规则

规则编号规则描述设计原因
FLO-001流水类型枚举:充值(1)、充值退款(2)、支付(3)、支付退款(4)、余额调整(5)、转账(6)覆盖所有余额变动场景
FLO-002变动金额(price):正数表示余额增加,负数表示余额减少统一用正负号表示方向,简化统计
FLO-003流水号(no)由系统自动生成,全局唯一作为流水的唯一标识,便于对账引用
FLO-004导出 Excel 按当前筛选条件导出,不分页确保导出数据与查询结果一致
FLO-005单次导出不超过 10 万条,超出需缩小筛选范围防止大数据量导出导致系统性能问题

接口列表

接口名称请求方式路径说明
钱包流水分页GET/pay/wallet-transaction/page按条件查询钱包流水列表

3.2.2 流水导出

描述:将筛选后的流水数据导出为 Excel 文件,用于财务对账。

业务规则

规则编号规则描述设计原因
EXP-001导出文件名格式:钱包流水_YYYYMMDD_HHmmss.xls文件名包含时间,便于区分和归档
EXP-002导出字段:流水号、用户ID、业务类型、变动金额、变动后余额、关联业务ID、说明、创建时间覆盖对账所需的全部关键字段
EXP-003金额列以"元"为单位,保留 2 位小数与财务习惯一致

3.3 后台管理端 - 充值套餐管理

3.3.1 套餐列表

描述:管理平台所有充值套餐,支持查看、创建、编辑、删除、上下架操作。

页面原型

充值套餐列表

业务规则

规则编号规则描述设计原因
PKG-001充值金额(payPrice):用户实际支付的金额明确用户需要掏多少钱
PKG-002赠送金额(bonusPrice):用户额外获得的金额,可为 0赠送是促销手段,可为 0 表示不赠送
PKG-003套餐状态:启用(0) / 禁用(1)支持快速上下架
PKG-004仅启用状态的套餐在前台用户端可见禁用后立即对用户不可见
PKG-005套餐列表在前台按充值金额从小到大排序低价套餐在前,引导用户先看到低门槛选项
PKG-006赠送比例超过 50% 时系统给出警告提示防止运营误操作导致平台亏损

3.3.2 创建/编辑套餐

描述:新增或编辑充值套餐,配置套餐名称、充值金额、赠送金额等信息。

业务规则

规则编号规则描述设计原因
PKG-007套餐名称不可重复,最长 20 字避免用户混淆相似套餐
PKG-008充值金额必须 > 0,最小 0.01 元金额必须有效
PKG-009赠送金额 >= 0,默认 0允许不赠送的套餐
PKG-010编辑已有套餐不影响已产生的充值记录历史数据保持原样,修改只影响后续

3.3.3 删除与上下架

业务规则

规则编号规则描述设计原因
PKG-011删除套餐为逻辑删除,不影响已有充值记录历史数据可追溯
PKG-012禁用套餐后,前台不再展示该套餐快速下架不需要删除数据
PKG-013已提交但未支付的充值订单如果关联了被禁用的套餐,仍按原套餐金额完成支付保护用户已发起的充值行为

接口列表

接口名称请求方式路径说明
创建充值套餐POST/pay/wallet-recharge-package/create新增充值套餐
更新充值套餐PUT/pay/wallet-recharge-package/update编辑充值套餐
删除充值套餐DELETE/pay/wallet-recharge-package/delete删除指定套餐
查询充值套餐详情GET/pay/wallet-recharge-package/get获取单个套餐详情
充值套餐分页查询GET/pay/wallet-recharge-package/page按条件分页查询套餐列表

3.4 后台管理端 - 充值订单管理

3.4.1 充值订单列表

描述:查看用户通过充值套餐或自定义金额发起的充值订单。

业务规则

规则编号规则描述设计原因
RCH-001充值订单关联支付订单(payOrderId),支付成功后余额才入账确保"钱到了再给余额",避免资金风险
RCH-002充值订单支持退款操作用户有权申请退款
RCH-003退款时需同时扣除已入账的余额(含赠送部分)防止用户通过充值-退款套取赠送金额

3.4.2 充值退款

描述:对已支付成功的充值订单发起退款,退款金额包含赠送部分。

充值退款状态机

充值退款状态机

业务规则

规则编号规则描述设计原因
RCH-004退款金额 = 原支付金额(payPrice),通过原支付渠道退回退用户实际支付的钱
RCH-005退款时需扣回用户余额中的到账总额(totalPrice = payPrice + bonusPrice)赠送的钱也要扣回,防止套现
RCH-006如果用户余额不足以扣回(已消费部分),拒绝退款防止资金亏损
RCH-007退款状态流转:未退款(0) → 退款中 → 退款成功(10) / 退款失败(20)与支付模块退款状态机一致

接口列表

接口名称请求方式路径说明
充值支付回调POST/pay/wallet-recharge/update-paid支付成功后内部回调更新状态
发起充值退款POST/pay/wallet-recharge/refund对指定充值订单发起退款
退款结果回调POST/pay/wallet-recharge/update-refunded退款成功后内部回调更新状态

3.5 后台管理端 - 转账管理

3.5.1 转账订单列表

描述:查看平台所有转账订单,支持按状态、应用、渠道、时间等条件筛选。

页面原型

转账订单列表

转账状态机

转账状态机

业务规则

规则编号规则描述设计原因
TRF-001转账状态:等待(0)、进行中(5)、成功(10)、关闭(20)覆盖转账全生命周期
TRF-002转账单号由系统自动生成,全局唯一唯一标识,便于追踪和对账
TRF-003仅"等待转账"状态的订单可审核防止重复审核
TRF-004审核通过后自动调用转账渠道发起转账审核通过即执行,减少人工操作
TRF-005审核拒绝后订单状态变为"转账关闭"明确标记被拒绝的订单
TRF-006转账渠道复用支付渠道管理模块(pay_channel)复用已有渠道配置,避免重复建设
TRF-007转账失败时记录渠道错误码和错误信息便于排查问题和重试
TRF-008支持导出 Excel,文件名格式:转账订单_YYYYMMDD_HHmmss.xls满足财务对账需求

接口列表

接口名称请求方式路径说明
转账订单详情GET/pay/transfer/get获取指定转账订单详情
转账订单分页GET/pay/transfer/page按条件分页查询转账订单
导出转账订单GET/pay/transfer/export-excel导出转账订单Excel

3.6 用户前台 - 我的钱包

3.6.1 余额展示

描述:用户查看自己的钱包余额、冻结金额、累计充值、累计消费。

页面原型

我的钱包余额展示

业务规则

规则编号规则描述设计原因
APP-001首次访问自动创建钱包(懒加载模式)避免为未使用钱包功能的用户创建无用数据
APP-002金额展示单位为"元",保留 2 位小数用户友好的展示方式
APP-003冻结金额单独展示,不可用于消费让用户清楚知道哪些钱不能用

接口列表

接口名称请求方式路径说明
获取钱包信息GET/pay/wallet/get获取当前登录用户的钱包信息

3.7 用户前台 - 钱包充值

3.7.1 选择充值套餐/自定义金额

描述:用户选择预定义充值套餐或输入自定义充值金额进行充值。

页面原型

钱包充值页面

业务规则

规则编号规则描述设计原因
APP-004仅展示状态为"启用"的充值套餐禁用的套餐不应对用户可见
APP-005自定义金额最小 0.01 元,最大不超过平台限额(可配置)防止异常金额
APP-006自定义金额不享受赠送赠送是套餐专属权益

3.7.2 选择支付方式与充值结果

描述:用户选择支付方式完成充值付款,支付完成后展示充值结果。

业务规则

规则编号规则描述设计原因
APP-007充值订单创建后关联统一支付订单(payOrder)复用支付模块的订单管理能力
APP-008支付成功后通过回调更新充值订单状态,并增加用户余额确保"钱到了再给余额"
APP-009到账金额 = 支付金额 + 赠送金额用户实际获得的余额
APP-010充值成功展示到账金额和赠送金额;充值失败展示失败原因给用户明确的反馈
APP-011充值结果页提供"查看交易明细"快捷入口方便用户确认到账

接口列表

接口名称请求方式路径说明
创建充值订单POST/pay/wallet-recharge/create创建钱包充值记录
充值记录分页GET/pay/wallet-recharge/page获取当前用户的充值记录

3.8 用户前台 - 余额消费

3.8.1 余额支付

描述:用户在平台消费时选择余额支付,直接从钱包扣款。

业务规则

规则编号规则描述设计原因
APP-012余额充足时方可使用余额支付防止透支
APP-013冻结钱包不可进行余额支付风控要求
APP-014余额支付通过内部钱包支付客户端(WalletPayClient)实现内部扣款不走第三方支付渠道
APP-015支付金额单位为"元",系统自动转换为"分"处理前后端统一使用元,内部用分计算
APP-016支付成功后生成 bizType=PAYMENT(3) 的流水记录每笔消费有据可查

3.8.2 混合支付

描述:用户消费时可组合使用余额 + 其他支付渠道完成支付。

业务规则

规则编号规则描述设计原因
APP-017余额部分优先扣减先扣内部余额,再走外部渠道
APP-018各渠道支付金额之和等于订单总额确保金额一致
APP-019若其他渠道支付失败,余额部分需回退保证支付一致性,不能出现余额扣了但订单没付成功
APP-020混合支付的退款需按原路退回余额部分退回余额,外部渠道部分退回外部渠道

3.9 用户前台 - 交易记录

3.9.1 收支明细

描述:用户查看自己钱包的所有交易流水,按时间倒序展示。

页面原型

交易记录页面

业务规则

规则编号规则描述设计原因
APP-021收入类(充值、充值退款、支付退款、余额调增、转账收入)展示为正数,绿色直观区分收入支出
APP-022支出类(支付、余额调减)展示为负数,红色红色代表支出,符合用户习惯
APP-023默认展示最近一个月的交易明细用户最常查看的时间范围
APP-024默认分页大小:20 条移动端每屏展示合理数量

3.9.2 按类型筛选与按月汇总

描述:用户可按交易类型筛选查看特定类型的流水,并查看指定月份的收入和支出汇总数据。

业务规则

规则编号规则描述设计原因
APP-025支持筛选的类型:全部、充值、消费、退款、转账、其他覆盖用户关心的分类维度
APP-026切换筛选时重置页码避免筛选后页码越界
APP-027按月汇总统计收入总额和支出总额帮助用户了解月度消费情况
APP-028月份选择范围:最近 12 个月覆盖一年的查看需求
APP-029汇总数据实时计算确保数据准确

接口列表

接口名称请求方式路径说明
交易流水分页GET/pay/wallet-transaction/page获取当前用户的交易流水
获取流水统计GET/pay/wallet-transaction/get-summary按时间段获取收支汇总
充值套餐列表GET/pay/wallet-recharge-package/list获取所有启用的充值套餐

四、非功能需求

4.1 性能需求

指标要求说明
钱包查询响应时间单次查询 < 200ms用户打开钱包页面的等待时间
余额变更操作单笔操作 < 500ms(含流水记录写入)充值、消费、调账等操作的响应时间
充值到账延迟支付回调后 < 2 秒到账用户支付完成后看到余额增加的时间
流水查询性能支持单用户 10 万条流水记录的分页查询,响应 < 500ms长期用户的流水量可能很大
并发处理同一用户钱包的并发操作通过 Redis 分布式锁保证数据一致性防止同一钱包同时被多个操作修改导致余额错误
流水导出10 万条数据导出 < 30 秒财务月末导出场景
对账统计按月汇总统计 < 1 秒用户查看月度汇总的响应时间

4.2 安全需求

安全项要求实现方式
余额变更一致性所有余额变更操作必须在数据库事务内完成Spring @Transactional,余额更新 + 流水写入在同一事务
并发安全防止同一钱包并发操作导致余额错误Redis 分布式锁(PayWalletLockRedisDAO),锁粒度为钱包 ID
金额计算精度避免浮点精度问题系统内部以"分"为单位整数计算,展示时转为"元"
操作审计敏感操作必须记录操作日志余额调整、冻结/解冻操作写入操作日志表
权限控制不同操作需对应权限标识后台接口基于 RBAC 权限模型,前台接口基于登录态
防重放防止重复提交充值订单和转账订单均有唯一商户单号
数据隔离多租户数据隔离所有数据表包含 tenant_id 字段
转账安全大额转账需审核转账操作需审核流程,审核通过后才发起

4.3 兼容性需求

兼容项要求
数据库兼容支持 MySQL、PostgreSQL、Oracle、Kingbase、DB2、H2 等数据库
主键策略通过 @KeySequence 注解适配不同数据库的主键自增策略
多端适配前台用户端支持 H5、小程序、APP 等多端访问
接口规范后台接口遵循 RESTful 规范,前台接口兼容移动端调用
金额单位数据库统一以"分"存储,前端展示以"元"为单位,精度 2 位小数

五、数据设计

5.1 数据模型概览

本模块涉及 5 张数据表,关系如下:

钱包数据模型ER图

5.2 pay_wallet 钱包表

字段名类型必填默认值说明
idbigint自增主键ID
user_idbigint-用户ID,关联会员用户或管理员用户
user_typetinyint-用户类型:1-会员 2-管理员
balanceint0可用余额,单位分
freeze_priceint0冻结金额,单位分
total_expenseint0累计支出,单位分
total_rechargeint0累计充值,单位分
creatorvarchar(64)NULL创建者
create_timedatetimeCURRENT_TIMESTAMP创建时间
updatervarchar(64)NULL更新者
update_timedatetimeCURRENT_TIMESTAMP更新时间
deletedbit(1)0逻辑删除:0-未删除 1-已删除
tenant_idbigint0租户ID

索引设计

索引名类型字段说明
PRIMARY主键id自增主键
uk_user_id_type唯一user_id, user_type, tenant_id同一租户下同一用户类型唯一钱包
idx_tenant_id普通tenant_id租户维度查询

5.3 pay_wallet_transaction 钱包流水表

字段名类型必填默认值说明
idbigint自增主键ID
novarchar(64)-流水号,全局唯一
wallet_idbigint-钱包ID,关联 pay_wallet.id
biz_typetinyint-业务类型:1-充值 2-充值退款 3-支付 4-支付退款 5-余额调整 6-转账
biz_idvarchar(64)-关联业务编号(充值订单ID、支付订单ID等)
titlevarchar(256)NULL流水说明
priceint-交易金额,单位分;正值为余额增加,负值为余额减少
balanceint-交易后余额,单位分
creatorvarchar(64)NULL创建者
create_timedatetimeCURRENT_TIMESTAMP创建时间
updatervarchar(64)NULL更新者
update_timedatetimeCURRENT_TIMESTAMP更新时间
deletedbit(1)0逻辑删除
tenant_idbigint0租户ID

索引设计

索引名类型字段说明
PRIMARY主键id自增主键
uk_no唯一no流水号唯一
idx_wallet_id普通wallet_id按钱包查流水
idx_biz_type_id普通biz_type, biz_id按业务类型和编号查流水
idx_create_time普通create_time按时间范围查流水
idx_tenant_id普通tenant_id租户维度查询

5.4 pay_wallet_recharge_package 充值套餐表

字段名类型必填默认值说明
idbigint自增主键ID
namevarchar(64)-套餐名称
pay_priceint-支付金额,单位分
bonus_priceint0赠送金额,单位分
statustinyint0状态:0-启用 1-禁用
creatorvarchar(64)NULL创建者
create_timedatetimeCURRENT_TIMESTAMP创建时间
updatervarchar(64)NULL更新者
update_timedatetimeCURRENT_TIMESTAMP更新时间
deletedbit(1)0逻辑删除
tenant_idbigint0租户ID

索引设计

索引名类型字段说明
PRIMARY主键id自增主键
idx_status普通status按状态筛选
idx_tenant_id普通tenant_id租户维度查询

5.5 pay_wallet_recharge 充值订单表

字段名类型必填默认值说明
idbigint自增主键ID
wallet_idbigint-钱包ID,关联 pay_wallet.id
package_idbigintNULL充值套餐ID,自定义充值时为 NULL
pay_priceint-实际支付金额,单位分
bonus_priceint0赠送金额,单位分
total_priceint-用户实际到账金额(pay_price + bonus_price),单位分
pay_order_idbigintNULL支付订单ID,关联 pay_order.id
pay_channel_codevarchar(32)NULL支付成功的支付渠道编码
pay_statusbit(1)0是否已支付:0-未支付 1-已支付
pay_timedatetimeNULL支付成功时间
pay_refund_idbigintNULL退款单ID,关联 pay_refund.id
refund_total_priceint0退款总金额(含赠送),单位分
refund_pay_priceint0退款支付金额,单位分
refund_bonus_priceint0退款赠送金额,单位分
refund_timedatetimeNULL退款时间
refund_statustinyint0退款状态
creatorvarchar(64)NULL创建者
create_timedatetimeCURRENT_TIMESTAMP创建时间
updatervarchar(64)NULL更新者
update_timedatetimeCURRENT_TIMESTAMP更新时间
deletedbit(1)0逻辑删除
tenant_idbigint0租户ID

索引设计

索引名类型字段说明
PRIMARY主键id自增主键
idx_wallet_id普通wallet_id按钱包查充值记录
idx_pay_order_id普通pay_order_id按支付订单查充值
idx_pay_status普通pay_status按支付状态筛选
idx_tenant_id普通tenant_id租户维度查询

5.6 pay_transfer 转账订单表

字段名类型必填默认值说明
idbigint自增主键ID
novarchar(64)-转账单号,全局唯一
app_idbigint-应用编号,关联 pay_app.id
channel_idbigintNULL转账渠道编号,关联 pay_channel.id
channel_codevarchar(32)NULL转账渠道编码
user_idbigintNULL用户编号
user_typetinyintNULL用户类型
merchant_transfer_idvarchar(64)-商户转账单编号,应用内唯一
subjectvarchar(128)NULL转账标题
priceint-转账金额,单位分
user_accountvarchar(128)NULL收款人账号
user_namevarchar(64)NULL收款人姓名
statustinyint0转账状态:0-等待 5-进行中 10-成功 20-关闭
success_timedatetimeNULL转账成功时间
notify_urlvarchar(1024)NULL异步通知地址
user_ipvarchar(64)NULL用户IP
channel_extrasjsonNULL渠道额外参数
channel_transfer_novarchar(128)NULL渠道转账单号
channel_error_codevarchar(64)NULL渠道错误码
channel_error_msgvarchar(512)NULL渠道错误信息
channel_notify_datatextNULL渠道通知内容
channel_package_infotextNULL渠道package信息(微信专用)
creatorvarchar(64)NULL创建者
create_timedatetimeCURRENT_TIMESTAMP创建时间
updatervarchar(64)NULL更新者
update_timedatetimeCURRENT_TIMESTAMP更新时间
deletedbit(1)0逻辑删除
tenant_idbigint0租户ID

索引设计

索引名类型字段说明
PRIMARY主键id自增主键
uk_no唯一no转账单号唯一
uk_app_merchant唯一app_id, merchant_transfer_id应用内商户单号唯一,防重复提交
idx_channel_id普通channel_id按渠道查转账
idx_status普通status按状态筛选
idx_create_time普通create_time按时间范围查
idx_tenant_id普通tenant_id租户维度查询

5.7 数据字典

5.7.1 钱包流水业务类型

枚举值编号说明金额方向
RECHARGE1充值 - 用户通过支付渠道充值到账正(余额增加)
RECHARGE_REFUND2充值退款 - 充值订单退款后扣回余额负(余额减少)
PAYMENT3支付 - 用户使用余额进行消费负(余额减少)
PAYMENT_REFUND4支付退款 - 消费退款后余额回退正(余额增加)
UPDATE_BALANCE5余额调整 - 后台手动调增/调减正或负
TRANSFER6转账 - 通过转账入账正(余额增加)

5.7.2 转账状态

枚举值编号说明后续流转
WAITING0等待转账 - 订单已创建,等待审核或发起→ 进行中 / 关闭
PROCESSING5转账进行中 - 已调用渠道接口,等待结果→ 成功 / 关闭
SUCCESS10转账成功 - 渠道确认转账完成终态
CLOSED20转账关闭 - 转账失败或审核拒绝终态

5.7.3 充值退款状态

枚举值编号说明后续流转
未退款0退款单已创建,等待处理→ 退款成功 / 退款失败
退款成功10渠道已确认退款到账终态
退款失败20渠道退款处理失败可重试 → 退款成功

六、跨模块联动

6.1 联动模块一览

联动模块联动方式数据流向说明
应用管理(04-01)充值走支付渠道钱包 → 应用管理充值时创建支付订单,通过应用管理的支付渠道收款
应用管理(04-01)钱包支付作为渠道应用管理 ← 钱包用户消费选择余额支付时,钱包模块作为 WalletPayClient 扣减余额
应用管理(04-01)转账走支付渠道钱包 → 应用管理转账时复用应用管理的渠道配置发起转账
会员管理(05-01)钱包归属用户钱包 → 会员钱包通过 user_id + user_type 关联会员用户
会员积分(05-02)充值送积分钱包 → 会员积分充值成功后可触发赠送积分/经验值(通过事件机制)
通知模块充值/转账通知钱包 → 通知充值到账、转账成功等关键节点发送站内通知
日志审计(01-08)操作日志钱包 → 日志余额调整、冻结/解冻等敏感操作写入操作日志
定时任务回调补偿定时任务 → 钱包定时任务(PayNotifyJob)主动查询未确认的支付/转账结果

6.2 关键联动流程

6.2.1 充值到账全流程

充值到账全流程

6.2.2 余额消费全流程

余额消费全流程

6.2.3 充值退款全流程

充值退款全流程

6.3 数据一致性要求

场景一致性要求实现方式
充值到账余额增加 + 流水写入 + 充值订单更新必须同时成功数据库事务 + 分布式锁
余额消费余额扣减 + 流水写入必须同时成功数据库事务 + 分布式锁
充值退款余额扣回 + 流水写入 + 退款状态更新必须同时成功数据库事务 + 分布式锁
手动调账余额变更 + 流水写入 + 操作日志必须同时成功数据库事务
转账转账状态更新 + 流水写入必须同时成功数据库事务

七、附录

7.1 名词解释

名词通俗解释
钱包(Wallet)用户在平台里的"零钱账户",类似微信零钱或支付宝余额
钱包流水(Wallet Transaction)钱包的"银行流水",每一笔进出都有记录,方便查账
充值套餐(Recharge Package)运营配置的"充X送Y"促销方案,类似"充100送20"
充值订单(Wallet Recharge)用户充值时生成的订单,记录充了多少钱、赠送多少、用什么方式付的
转账订单(Transfer)平台给用户打钱的记录,类似公司给你发工资的转账记录
冻结金额(Freeze Price)被"冻住"的钱,看得到但用不了,类似银行冻结账户
赠送金额(Bonus Price)充值套餐额外送的钱,类似"买100送20"里的那个20
业务类型(Biz Type)流水的"分类标签",告诉你这笔钱是因为充值、消费还是调账产生的
分布式锁防止"两个人同时操作同一个钱包"导致数据出错的机制,类似排队叫号
逻辑删除数据不真正删掉,只是标记为"已删除",保证历史记录可追溯
余额调整运营人员手动给用户加钱或扣钱,处理异常情况用的
混合支付一部分用余额、一部分用微信/支付宝的支付方式组合
懒加载用户第一次打开钱包页面时才创建钱包,而不是注册时就创建
对账财务核对平台流水和第三方支付渠道账单是否一致的过程
回调(Callback)第三方支付渠道(微信/支付宝)在支付完成后主动通知平台的方式
租户隔离不同企业(租户)的数据互相看不到,保证数据安全

7.2 权限标识

权限标识说明所属功能
pay:wallet:query查看钱包(含钱包列表、详情、流水查询)钱包管理
pay:wallet:update-balance调整钱包余额钱包管理
pay:wallet-recharge-package:create创建充值套餐充值套餐
pay:wallet-recharge-package:update编辑充值套餐充值套餐
pay:wallet-recharge-package:delete删除充值套餐充值套餐
pay:wallet-recharge-package:query查看充值套餐充值套餐
pay:transfer:query查看转账订单转账管理
pay:transfer:export导出转账订单转账管理

7.3 接口汇总

7.3.1 后台管理端接口

序号接口名称请求方式路径权限标识说明
1钱包详情GET/pay/wallet/getpay:wallet:query按用户ID获取钱包信息
2钱包分页GET/pay/wallet/pagepay:wallet:query分页查询钱包列表
3调整余额PUT/pay/wallet/update-balancepay:wallet:update-balance手动调增/调减用户余额
4流水分页GET/pay/wallet-transaction/pagepay:wallet:query分页查询钱包流水
5充值回调POST/pay/wallet-recharge/update-paidPermitAll(内部调用)支付成功回调更新充值状态
6充值退款POST/pay/wallet-recharge/refundpay:wallet:update-balance对充值订单发起退款
7退款回调POST/pay/wallet-recharge/update-refundedPermitAll(内部调用)退款成功回调更新状态
8创建充值套餐POST/pay/wallet-recharge-package/createpay:wallet-recharge-package:create新增充值套餐
9更新充值套餐PUT/pay/wallet-recharge-package/updatepay:wallet-recharge-package:update编辑充值套餐
10删除充值套餐DELETE/pay/wallet-recharge-package/deletepay:wallet-recharge-package:delete删除充值套餐
11充值套餐详情GET/pay/wallet-recharge-package/getpay:wallet-recharge-package:query获取单个充值套餐
12充值套餐分页GET/pay/wallet-recharge-package/pagepay:wallet-recharge-package:query分页查询充值套餐
13转账订单详情GET/pay/transfer/getpay:transfer:query获取指定转账订单
14转账订单分页GET/pay/transfer/pagepay:transfer:query分页查询转账订单
15导出转账订单GET/pay/transfer/export-excelpay:transfer:export导出转账订单Excel

7.3.2 前台用户端接口

序号接口名称请求方式路径鉴权说明
1获取钱包GET/pay/wallet/get登录态获取当前用户钱包信息
2创建充值订单POST/pay/wallet-recharge/create登录态发起钱包充值
3充值记录分页GET/pay/wallet-recharge/page登录态查询当前用户充值记录
4充值套餐列表GET/pay/wallet-recharge-package/list登录态获取所有启用的充值套餐
5交易流水分页GET/pay/wallet-transaction/page登录态查询当前用户交易流水
6交易流水统计GET/pay/wallet-transaction/get-summary登录态按时间段获取收支汇总

7.4 错误码

错误码说明处理建议
WALLET_NOT_EXISTS钱包不存在首次访问时自动创建钱包
WALLET_FROZEN钱包已冻结提示用户联系客服解冻
WALLET_BALANCE_NOT_ENOUGH余额不足提示用户充值或选择其他支付方式
WALLET_BALANCE_NEGATIVE余额不能为负调减操作被拒绝,提示余额不足
WALLET_LOCK_FAILED获取钱包锁失败系统繁忙,请稍后重试
RECHARGE_ORDER_NOT_FOUND充值订单不存在检查订单ID是否正确
RECHARGE_ORDER_PAID充值订单已支付不允许重复支付
RECHARGE_ORDER_REFUNDED充值订单已退款不允许重复退款
RECHARGE_REFUND_BALANCE_NOT_ENOUGH退款时用户余额不足用户已消费部分金额,无法全额退款
TRANSFER_ORDER_NOT_FOUND转账订单不存在检查转账单号是否正确
TRANSFER_STATUS_ERROR转账状态异常仅等待状态的订单可审核
PACKAGE_NAME_DUPLICATE套餐名称重复修改套餐名称后重试
PACKAGE_PRICE_INVALID套餐金额无效充值金额必须 > 0,赠送金额 >= 0

7.5 异常处理策略

异常场景处理策略
充值回调丢失定时任务(PayNotifyJob)主动查询支付结果
并发余额操作Redis 分布式锁串行执行,避免超卖/超扣
退款时余额不足拒绝退款操作,提示用户余额不足(已消费部分无法退款)
转账渠道超时转账订单保持"进行中"状态,定时任务同步结果
转账渠道失败记录错误信息,订单状态变为"转账关闭",支持人工重试
流水与余额不一致对账任务定期检查,发现差异时告警