# 微信支付退款配置指南

## 概述

本项目已集成微信支付V3版本的退款功能，支持用户取消订单后自动退款到微信账户。

## 前置条件

1. 已开通微信支付商户号
2. 已获取微信支付API证书
3. 已配置微信支付API密钥

## 配置步骤

### 1. 获取微信支付配置信息

登录 [微信支付商户平台](https://pay.weixin.qq.com/)，获取以下信息：

- **WECHAT_APPID**: 小程序AppID（已有）
- **WECHAT_MCHID**: 商户号
- **WECHAT_SERIAL_NO**: API证书序列号
- **WECHAT_APIV3_KEY**: APIv3密钥
- **WECHAT_PRIVATE_KEY**: API证书私钥内容

### 2. 下载API证书

1. 进入 **账户中心 > API安全 > 申请API证书**
2. 下载证书文件（apiclient_key.pem）
3. 复制私钥内容到环境变量

### 3. 配置环境变量

编辑 `apps/server/.env.local` 文件，添加以下配置：

```bash
# 微信支付配置
WECHAT_MCHID=1234567890
WECHAT_SERIAL_NO=3B2XXXXXXXXXXXXXXXXXXXXXXXXX
WECHAT_APIV3_KEY=your_apiv3_key_32_characters
WECHAT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...
-----END PRIVATE KEY-----"
WECHAT_REFUND_NOTIFY_URL=https://your-domain.com/api/payment/wechat/refund-notify
```

**注意事项**：
- `WECHAT_PRIVATE_KEY` 需要包含完整的私钥内容（包括头尾标记）
- 私钥内容可以使用换行符，也可以使用 `\n` 转义
- `WECHAT_REFUND_NOTIFY_URL` 需要替换为实际的域名

### 4. 配置退款回调地址

在微信支付商户平台配置退款通知URL：

1. 进入 **产品中心 > 开发配置**
2. 设置退款通知URL: `https://your-domain.com/api/payment/wechat/refund-notify`

## 功能说明

### 退款流程

1. **用户发起退款**：在订单详情页点击"取消订单"
2. **状态检查**：只有 `pending_confirm`（待确认）和 `pending_checkin`（待入住）状态的订单可退款
3. **调用微信退款API**：系统自动调用微信支付退款接口
4. **更新订单状态**：退款成功后，订单状态变更为 `refunded`
5. **恢复库存**：自动恢复房态库存
6. **记录平台账户**：记录退款支出交易（仅记账）

### 退款时间

- 微信支付退款：1-3个工作日到账
- 退款原路返回至用户微信账户

### 退款重试

如果退款失败，订单会保持 `refunding` 状态，可以通过管理后台手动重试：

```typescript
// 调用重试接口
await refundService.retryRefund(orderId);
```

## 测试模式

如果未配置微信支付参数，系统会自动进入**模拟模式**：

- 退款接口调用会被模拟（仅打印日志）
- 订单状态正常更新
- 库存正常恢复
- 适用于开发和测试环境

## 数据库变更

需要执行以下迁移脚本：

```bash
mysql -u root -p rent_platform < database/migrations/002_add_transaction_id_to_orders.sql
```

该脚本会在 `orders` 表添加 `transaction_id` 字段，用于存储微信支付交易号。

## API文档

### 退款接口

**接口**: `POST /api/orders/:id/refund`

**请求参数**:
```json
{
  "reason": "用户主动取消"
}
```

**响应**:
```json
{
  "code": 200,
  "message": "退款成功，款项将原路返回",
  "data": null
}
```

### 退款重试接口（管理员）

**接口**: `POST /api/admin/orders/:id/retry-refund`

**响应**:
```json
{
  "code": 200,
  "message": "退款重试成功",
  "data": null
}
```

## 常见问题

### 1. 退款失败：签名验证失败

**原因**：私钥配置错误或证书序列号不匹配

**解决**：
- 检查 `WECHAT_PRIVATE_KEY` 是否包含完整内容
- 确认 `WECHAT_SERIAL_NO` 与证书匹配

### 2. 退款失败：商户号不匹配

**原因**：`WECHAT_MCHID` 配置错误

**解决**：登录商户平台确认商户号

### 3. 退款失败：订单缺少交易号

**原因**：订单的 `transaction_id` 字段为空

**解决**：
- 确保支付成功后保存了微信支付交易号
- 检查支付回调逻辑是否正确

## 相关文档

- [微信支付退款API文档](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_9.shtml)
- [微信支付开发指引](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml)

## 技术支持

如有问题，请联系技术团队或查看微信支付官方文档。
