3.6 KiB
3.6 KiB
🔥 支付失败问题诊断 - 2026-01-23
问题现象
前端支付时报错:
支付失败: Error: 操作失败: Transaction rolled back because it has been marked as rollback-only
错误原因分析
这个错误表示事务在执行过程中被标记为只能回滚,通常是因为:
- 钱包表不存在 - 最可能的原因
- 用户钱包余额不足
- 数据库约束冲突
- 其他业务逻辑异常
诊断步骤
第一步:执行诊断SQL
# 在MySQL中执行
mysql -u root -p peixue < peidu/sql/🔍诊断支付失败-2026-01-23.sql
或者在数据库工具中打开并执行:peidu/sql/🔍诊断支付失败-2026-01-23.sql
第二步:根据诊断结果修复
情况1:钱包表不存在
解决方案:
# 执行钱包表创建脚本
mysql -u root -p peixue < peidu/sql/create_wallet_tables_fixed_2026-01-23.sql
情况2:用户钱包不存在或余额不足
解决方案A:创建测试钱包并充值
-- 为测试用户创建钱包并充值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:使用其他支付方式测试
// 前端改用微信支付测试
paymentMethod: 'wechat' // 而不是 'wallet'
情况3:查看后端详细日志
后端日志会显示具体的异常信息:
# 查看后端控制台输出
# 找到类似这样的错误信息:
❌ 钱包支付失败: 钱包余额不足
❌ 钱包支付失败: Table 'peixue.wallet' doesn't exist
快速修复方案
方案1:创建钱包表并充值(推荐)
-- 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:暂时使用微信支付测试
修改前端代码,使用微信支付:
// pages/payment/index.vue
data() {
return {
paymentMethod: 'wechat' // 改为微信支付
}
}
验证修复
- 重新启动后端(如果修改了数据库)
- 清除前端缓存
- 重新测试支付流程
预期结果:
- 钱包支付:余额扣减成功,订单状态变为"已支付"
- 微信支付:订单状态变为"已支付"(模拟支付)
后续优化建议
-
添加钱包余额检查
- 支付前在前端显示钱包余额
- 余额不足时提示用户充值
-
完善错误提示
- 将后端具体错误信息返回给前端
- 而不是只返回"Transaction rolled back"
-
添加充值功能
- 实现钱包充值接口
- 前端添加充值入口
相关文件
- 诊断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