支付功能设计
这篇解决什么
支付中心怎么分层:应用和渠道是主数据,订单 / 退款 / 转账是业务单,回调先回支付模块再通知业务。读完先对模块边界和表,再进模拟支付、钱包、支付宝等功能篇。
默认端口 48080,前缀 /admin-api。工程启动见 快速开始。
业务流程及架构
支付自己不算流程引擎,没有 processDefinitionKey。业务只调 PayOrderApi 建单;真正打款、退款由渠道客户端做。渠道编码以 PayChannelEnum 为准:mock / wallet / alipay_* / wx_*。
示意图:业务建支付单。渠道打款后回调 /pay/notify/order,支付模块再通知业务。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 应用 / 渠道 | pay_app + pay_channel | 菜单应用 1126 |
| 模拟支付 | 渠道码 mock,不走回调 | 模拟支付、退款 |
| 钱包 | pay_wallet,渠道码 wallet | 钱包充值、支付、退款 |
| 支付宝 | alipay_* | 支付宝支付接入 |
| 微信 | wx_pub / wx_lite | 微信公众号支付、微信小程序支付 |
| 退款 | pay_refund | 支付宝、微信退款接入 |
| 转账 | pay_transfer | 支付宝转账、微信转账 |
| 移动 | 支付搬家 | 移动端支付 |
渠道回调要公网
yudao.pay.order-notify-url 指向 PayNotifyController 的 /pay/notify/order。支付宝、微信会再拼 /{channelId}。本机地址渠道打不进来。模拟支付不走回调,可以先联调。
数据表 ER
主干表按 DO 画出。示例单 pay_demo_order / pay_demo_withdraw、通知日志不进这张图。
示意图:应用下开渠道。订单挂应用和渠道。成功后再通知业务。钱包是余额账本,不是第二套网关。
前后端代码
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 模块 | api + server | ruoyi-office/yudao-module-pay/ |
| 单体引入 | yudao-module-pay-server | ruoyi-office/yudao-server/pom.xml |
| 渠道编码 | mock / wallet / alipay_* / wx_* | PayChannelEnum |
| 回调 | @RequestMapping 下 /pay/notify/order | PayNotifyController |
| 管理端 | 支付目录 | ruoyi-office-vben/apps/web-antd/src/views/pay/ |
官方菜单:1117 支付管理(/pay)。应用 1126,订单 1173,退款 1161,回调 2301,钱包目录 2551。看不到菜单先查角色。

本系统截图:支付管理 → 应用信息。能进列表说明模块和菜单已经在跑。

本系统截图:支付管理 → 支付订单。业务单只认支付单号,不要去改渠道后台。
功能开启
单体 -P boot 时已经依赖支付实现,没有单独的「支付开关」页。启动 YudaoServerApplication 即可。
客户默认包 ruoyi-office-db/dump/latest/:先 schema_*.sql 再 static_data_*.sql,带 pay_* 表、菜单、字典 pay_channel_code,以及通知 Job。以后改表走 ruoyi-office-db/update/。
示例订单写死应用标识 demo。先在应用信息建一条 appKey = demo,再去接入示例下单。
XXL-Job 还要挂 payNotifyJob、payOrderSyncJob、payOrderExpireJob、payRefundSyncJob。转账另挂 payTransferSyncJob。payNotifyJob 没挂,业务单的「已支付」回调不会重试。
示意图:先应用后渠道。模拟渠道可以先把闭环跑通。
旧文 支付功能开启 已并入本页,请收藏本篇。
