模拟支付、退款
这篇解决什么
不接支付宝、微信,也能把下单、支付、退款、业务回写跑通。读完能在应用里打开 mock 渠道,用接入示例走完一单。
默认端口 48080,管理端前缀 /admin-api。先完成 支付功能设计。真渠道见后面的支付宝、微信篇。
示意图:模拟渠道下单、查单、退款都直接成功。没有渠道回调。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 模块 | 模拟渠道实现 | ruoyi-office/yudao-module-pay/ |
| 渠道码 | mock | PayChannelEnum.MOCK |
| 客户端 | 配置类是空的 NonePayClientConfig | .../client/impl/mock/MockPayClient.java |
| 示例单 | 表 pay_demo_order,应用 key demo | PayDemoOrderServiceImpl |
| 接口 | 创建、支付回写、退款 | @RequestMapping("/pay/demo-order") |
| 页面 | 支付&退款案例 | views/pay/demo/order/index.vue |
| 收银台 | 隐藏路由,带 payOrderId | /pay/cashier,PayCashier |
菜单:接入示例 2161,支付&退款案例 2549,路由 /pay/demo/order。
在应用 demo 下增加渠道「模拟支付」。配置不用填密钥。然后发起示例订单,点「支付」进收银台,选 mock。

本系统截图:支付管理 → 接入示例 → 支付&退款案例。先建单,再进收银台选模拟支付。
MockPayClient 下单立刻返回成功,渠道单号形如 MOCK-P-{outTradeNo},退款 MOCK-R-{outRefundNo}。解析回调会抛「无支付回调 / 无退款回调」,这是预期,不要去配渠道通知地址。
业务回写仍走 PayNotifyJob:支付模块认为单已成功后,POST 应用上的 orderNotifyUrl。示例接口是 POST /pay/demo-order/update-paid,@PermitAll,内部再校验支付单。退款是 POST /pay/demo-order/update-refunded。
先用模拟把闭环跑完
业务接入支付时,先把 PayOrderApi.createOrder、应用回调、退款三条接上,渠道再换成支付宝或微信。不要一上来就调沙箱。
模拟渠道不支持转账。doUnifiedTransfer 尚未实现。提现案例请走真渠道,见后续转账篇。
配置与操作
走 支付管理 → 接入示例 → 支付&退款案例(菜单 2549,/pay/demo/order;接入示例目录 2161)。先在应用 demo 下加渠道「模拟支付」,配置不用填密钥。再建示例单,点「支付」进收银台,选 mock。
保存后 MockPayClient 立刻成功,渠道单号形如 MOCK-P-{outTradeNo}。业务回写仍走 PayNotifyJob,打应用上的 orderNotifyUrl(示例 POST /pay/demo-order/update-paid)。解析回调会抛「无支付回调」,不用配渠道通知地址。模拟渠道不支持转账。
