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

3.6 KiB
Raw Blame History

🔥 支付失败问题诊断 - 2026-01-23

问题现象

前端支付时报错:

支付失败: Error: 操作失败: Transaction rolled back because it has been marked as rollback-only

错误原因分析

这个错误表示事务在执行过程中被标记为只能回滚,通常是因为:

  1. 钱包表不存在 - 最可能的原因
  2. 用户钱包余额不足
  3. 数据库约束冲突
  4. 其他业务逻辑异常

诊断步骤

第一步执行诊断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'  // 改为微信支付
  }
}

验证修复

  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