Files
yunxinwei-java/docs/支付宝押金冻结订单解冻运维手册.md
赵忠林 93c2a57a86 fix(openalipay): 修复支付宝角色ID配置及押金解冻功能
- 将支付宝控制器中用户角色ID硬编码替换为配置读取,默认角色ID为81,配置存在时使用配置值
- 修正用户角色保存时使用动态角色ID,支持多租户配置
- 修改数据源配置,切换本地MySQL连接地址以便开发调试
- 新增押金冻结订单修复与解冻工具类UnfreezeToolTest.java,支持数据库中auth_no为空的冻结订单修复
- 实现基于支付宝Java SDK的证书模式解冻接口调用,避免Python调用时根证书问题
- 设计并完善押金冻结订单解冻的运维手册,指导正确操作及错误处理
- 优化解冻流程,支持自动修复冻结订单状态并更新数据库状态为UNFREEZE
- 添加FixFreezeOrderTest.java辅助测试工具类,用于根据订单号或冻结订单号进行押金解冻测试和修复
2026-05-11 13:52:52 +08:00

172 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 支付宝押金冻结订单解冻运维手册
> 用于处理 `shop_freeze_order` 表中客户押金冻结订单的解冻操作
---
## 一、背景
当客户需要退还押金时,需要调用支付宝 `alipay.fund.auth.order.unfreeze` 接口解冻资金。
### 相关参数订单ID=29909
| 参数 | 值 |
|------|-----|
| 授权号 auth_no | `2026041610002001650571764471` |
| 商户冻结订单号 out_order_no | `2044685513146597377` |
| 冻结金额 | `200.00` 元 |
---
## 二、文件位置
```
src/test/java/com/gxwebsoft/test/UnfreezeToolTest.java
```
---
## 三、修改配置(针对不同订单)
`UnfreezeToolTest.java` 中修改以下常量:
```java
private static final String AUTH_NO = "2026041610002001650571764471"; // 支付宝授权号
private static final String OUT_ORDER_NO = "2044685513146597377"; // 商户冻结订单号
private static final BigDecimal AMOUNT = new BigDecimal("200.00"); // 解冻金额
```
---
## 四、执行命令
### 方式一:指定测试方法(推荐)
```bash
cd /Users/gxwebsoft/JAVA/yunxinwei-java
./mvnw test -Dtest=UnfreezeToolTest#fixAndUnfreeze
```
### 方式二:运行整个测试类
```bash
./mvnw test -Dtest=UnfreezeToolTest
```
---
## 五、执行前检查
### 1. 确保 Redis 已启动
```bash
redis-cli ping
# 如果返回 PONG说明已启动
# 如果报错,执行:
redis-server --daemonize yes
```
### 2. 确保数据库连接正常
检查 `application.yml` 中的数据库配置
### 3. 验证订单信息
执行前先确认:
- 订单确实存在且状态为冻结
- 授权号 auth_no 正确
- 解冻金额与冻结金额一致
---
## 六、执行流程
程序会自动执行以下步骤:
1. **查找冻结订单** — 根据 `out_order_no` 查询 `shop_freeze_order`
2. **修复 auth_no** — 如果数据库中 auth_no 为空,补充授权号
3. **查找关联订单** — 根据 `freeze_order_no` 查询关联的业务订单
4. **修复订单关联** — 修复订单与冻结订单的关联关系
5. **调用支付宝解冻接口** — 使用 `alipay.fund.auth.order.unfreeze` API
6. **更新数据库状态** — 将 `status` 更新为 `UNFREEZE`
---
## 七、执行成功示例
```
========================================
押金修复 & 解冻工具
========================================
[1] 查找冻结订单...
✅ 找到冻结订单: id=29909
out_order_no: 2044685513146597377
status: FREEZE
auth_no: 2026041610002001650571764471
[2] 修复 auth_no...
✅ auth_no 已修复: 2026041610002001650571764471
[3] 查找关联订单...
✅ 找到关联订单: id=29908
order_no: 2026041622609876
is_freeze: true
freeze_order_no: 2044685513146597377
[5] 调用支付宝解冻接口...
----------------------------------------
支付宝返回:
{
"code": "10000",
"msg": "Success",
"amount": "200.00",
"authNo": "2026041610002001650571764471",
"outOrderNo": "2044685513146597377",
"operationId": "202605111341118651865",
"unfreezeTime": "2026-05-11 13:41:11"
}
----------------------------------------
🎉 解冻成功!
解冻金额: 200.00
授权号: 2026041610002001650571764471
订单号: 2044685513146597377
[6] 更新数据库状态...
✅ 数据库已更新
⏰ 资金将在1-7个工作日内退回客户农业银行储蓄卡
```
---
## 八、常见错误处理
| 错误码 | 含义 | 处理方式 |
|--------|------|----------|
| `isv.invalid-alipay-root-cert-sn` | 根证书序列号不匹配 | 使用 Java SDK 的 `certificateExecute()` 方法 |
| `ACQ.TRADE_NOT_EXIST` | 交易不存在 | 检查 auth_no 是否正确 |
| `isv.auth_no_error` | 授权号错误 | 核对 auth_no 值 |
| `isv.amount_error` | 金额不匹配 | 确保解冻金额 <= 冻结金额 |
---
## 九、技术要点
- 使用 **Java SDK** 的证书模式(`DefaultAlipayClient`
- 使用 `certificateExecute()` 方法而非普通 `execute()`
- 从数据库 `sys_setting` 表读取商户配置tenant_id=6
- 使用雪花ID生成 `out_request_no`
---
## 十、相关文件
| 文件 | 说明 |
|------|------|
| `src/test/java/.../UnfreezeToolTest.java` | 解冻工具类 |
| `src/main/resources/cert/` | 支付宝证书目录 |
| `shop_freeze_order` | 冻结订单表 |
| `order` | 业务订单表 |
| `sys_setting` | 系统配置表(支付宝密钥) |
---
*文档创建时间: 2026-05-11*
*最后更新: 2026-05-11*