peixue-dev/Archive/peidu-temp-files/docs/🔥支付失败问题诊断-2026-01-23.md

143 lines
3.6 KiB
Markdown
Raw Normal View History

2026-02-28 17:26:03 +08:00
# 🔥 支付失败问题诊断 - 2026-01-23
## 问题现象
前端支付时报错:
```
支付失败: Error: 操作失败: Transaction rolled back because it has been marked as rollback-only
```
## 错误原因分析
这个错误表示**事务在执行过程中被标记为只能回滚**,通常是因为:
1. **钱包表不存在** - 最可能的原因
2. **用户钱包余额不足**
3. **数据库约束冲突**
4. **其他业务逻辑异常**
## 诊断步骤
### 第一步执行诊断SQL
```bash
# 在MySQL中执行
mysql -u root -p peixue < peidu/sql/🔍诊断支付失败-2026-01-23.sql
```
或者在数据库工具中打开并执行:`peidu/sql/🔍诊断支付失败-2026-01-23.sql`
### 第二步:根据诊断结果修复
#### 情况1钱包表不存在
**解决方案:**
```bash
# 执行钱包表创建脚本
mysql -u root -p peixue < peidu/sql/create_wallet_tables_fixed_2026-01-23.sql
```
#### 情况2用户钱包不存在或余额不足
**解决方案A创建测试钱包并充值**
```sql
-- 为测试用户创建钱包并充值10000元
INSERT INTO wallet (user_id, balance, frozen_amount, total_recharge, total_consume, total_withdraw, version)
VALUES (
(SELECT user_id FROM `order` WHERE id = 320),
10000.00,
0.00,
10000.00,
0.00,
0.00,
0
)
ON DUPLICATE KEY UPDATE
balance = balance + 10000.00,
total_recharge = total_recharge + 10000.00;
```
**解决方案B使用其他支付方式测试**
```javascript
// 前端改用微信支付测试
paymentMethod: 'wechat' // 而不是 'wallet'
```
#### 情况3查看后端详细日志
后端日志会显示具体的异常信息:
```bash
# 查看后端控制台输出
# 找到类似这样的错误信息:
❌ 钱包支付失败: 钱包余额不足
❌ 钱包支付失败: Table 'peixue.wallet' doesn't exist
```
## 快速修复方案
### 方案1创建钱包表并充值推荐
```sql
-- 1. 创建钱包表
SOURCE peidu/sql/create_wallet_tables_fixed_2026-01-23.sql;
-- 2. 为测试用户充值
INSERT INTO wallet (user_id, balance, frozen_amount, total_recharge, total_consume, total_withdraw, version)
SELECT
user_id,
10000.00 AS balance,
0.00 AS frozen_amount,
10000.00 AS total_recharge,
0.00 AS total_consume,
0.00 AS total_withdraw,
0 AS version
FROM `order`
WHERE id = 320
ON DUPLICATE KEY UPDATE
balance = balance + 10000.00,
total_recharge = total_recharge + 10000.00;
```
### 方案2暂时使用微信支付测试
修改前端代码,使用微信支付:
```javascript
// pages/payment/index.vue
data() {
return {
paymentMethod: 'wechat' // 改为微信支付
}
}
```
## 验证修复
1. **重新启动后端**(如果修改了数据库)
2. **清除前端缓存**
3. **重新测试支付流程**
预期结果:
- 钱包支付:余额扣减成功,订单状态变为"已支付"
- 微信支付:订单状态变为"已支付"(模拟支付)
## 后续优化建议
1. **添加钱包余额检查**
- 支付前在前端显示钱包余额
- 余额不足时提示用户充值
2. **完善错误提示**
- 将后端具体错误信息返回给前端
- 而不是只返回"Transaction rolled back"
3. **添加充值功能**
- 实现钱包充值接口
- 前端添加充值入口
## 相关文件
- 诊断SQL: `peidu/sql/🔍诊断支付失败-2026-01-23.sql`
- 钱包表创建: `peidu/sql/create_wallet_tables_fixed_2026-01-23.sql`
- 支付逻辑: `peidu/backend/src/main/java/com/peidu/service/impl/OrderServiceImpl.java`
- 钱包服务: `peidu/backend/src/main/java/com/peidu/service/impl/WalletServiceImpl.java`