143 lines
3.6 KiB
Markdown
143 lines
3.6 KiB
Markdown
|
|
# 🔥 支付失败问题诊断 - 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`
|