|                                                                                                                                                                           |  | # 微信退款功能使用说明
## 功能概述
本项目已集成微信支付退款功能,当用户取消订单时,系统会自动申请微信退款。
## 主要组件
### 1. 微信退款工具类
- **文件位置**: `ruoyi-catdog/src/main/java/com/ruoyi/applet/utils/WechatRefundUtil.java`- **功能**: 封装微信支付V3退款API,提供退款申请功能- **主要方法**: `applyRefund(RefundRequest request)`
### 2. 取消订单接口(已集成退款功能)
- **文件位置**: `ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java`- **接口路径**: `POST /applet/mall/order/orderCancel`- **功能**: 取消订单并自动申请退款
### 3. 退款回调接口
- **文件位置**: `ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/WechatRefundNotifyController.java`- **接口路径**: `POST /no-auth/wechat/refund`- **功能**: 处理微信退款通知
## 配置要求
### 1. 微信支付配置
确保在 `application.yml` 中正确配置了微信支付参数:
```yamlwechat:  enabled: true  appId: your_app_id  merchantId: your_merchant_id  privateKeyPath: path/to/your/private_key.pem  merchantSerialNumber: your_merchant_serial_number  apiV3key: your_api_v3_key  notifyUrl: https://your-domain.com/prod-api/no-auth/wechat/notify```
### 2. 退款通知地址
在微信商户平台配置退款通知地址:```https://your-domain.com/prod-api/no-auth/wechat/refund```
## 使用流程
### 1. 取消订单并申请退款
```httpPOST /applet/mall/order/orderCancelContent-Type: application/json
{  "id": 123456,  "remark": "用户取消订单"}```
**响应示例**:```json{  "code": 200,  "msg": "订单取消成功,退款申请已提交:退款申请成功,退款单号:REFUND_1234567890"}```
### 2. 退款流程
1. 用户调用取消订单接口2. 系统取消订单状态3. 检查订单是否已支付4. 如果已支付,自动申请微信退款5. 记录退款历史6. 微信异步通知退款结果
## 退款状态说明
- **SUCCESS**: 退款成功- **CLOSED**: 退款关闭- **PROCESSING**: 退款处理中- **ABNORMAL**: 退款异常
## 注意事项
### 1. 签名验证
- 退款工具类使用项目中已有的 `WechatPayUtil` 进行签名- 确保私钥文件路径正确且可访问
### 2. 金额单位
- 微信支付API使用分为单位- 系统自动将元转换为分
### 3. 退款限制
- 只能对已支付的订单申请退款- 退款金额不能超过原订单金额- 部分退款需要特殊处理
### 4. 错误处理
- 网络异常会自动重试- 签名失败会记录详细日志- 退款失败会返回具体错误信息
## 扩展功能
### 1. 部分退款
如需支持部分退款,可以修改 `applyWechatRefund` 方法:
```java// 设置部分退款金额amountReq.refund = partialRefundAmount.multiply(new BigDecimal(100)).longValue();```
### 2. 退款查询
可以添加退款查询接口:
```java@GetMapping("/refund/query/{refundNo}")public AjaxResult queryRefund(@PathVariable String refundNo) {    // 实现退款查询逻辑}```
### 3. 退款统计
可以添加退款统计功能:
```java@GetMapping("/refund/statistics")public AjaxResult getRefundStatistics() {    // 实现退款统计逻辑}```
## 测试建议
### 1. 沙箱环境测试
- 使用微信支付沙箱环境进行测试- 验证退款申请和回调功能
### 2. 日志监控
- 监控退款申请日志- 监控退款回调日志- 设置告警机制
### 3. 异常测试
- 测试网络异常情况- 测试签名失败情况- 测试金额超限情况
## 常见问题
### Q1: 退款申请失败怎么办?
A1: 检查以下几点:- 微信支付配置是否正确- 私钥文件是否存在且可读- 订单状态是否为已支付- 网络连接是否正常
### Q2: 退款回调没有收到怎么办?
A2: 检查以下几点:- 退款通知地址是否正确配置- 服务器防火墙是否开放相应端口- 回调接口是否正常响应
### Q3: 如何查看退款历史?
A3: 退款历史记录在 `oms_wechat_payment_history` 表中,可以通过以下方式查询:- 通过订单ID查询- 通过退款单号查询- 通过交易类型(opType=3)查询
## 技术支持
如有问题,请联系开发团队或查看相关日志文件。 
 |