# 微信退款功能使用说明 ## 功能概述 本项目已集成微信支付退款功能,当用户取消订单时,系统会自动申请微信退款。 ## 主要组件 ### 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` 中正确配置了微信支付参数: ```yaml wechat: 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. 取消订单并申请退款 ```http POST /applet/mall/order/orderCancel Content-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)查询 ## 技术支持 如有问题,请联系开发团队或查看相关日志文件。