8-incident-20261001-compensation.sql 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. -- ============================================================
  2. -- 【一次性人工补偿】2026-10-01 微信充值 30 元未到账事故
  3. --
  4. -- 事故:商户订单号 202610012106065931549256,30.00 元
  5. -- 微信交易号 4500000442202610019536073654,支付成功时间 2026-10-01 21:06:14
  6. -- 用户 user_id = 1555324358568706048(手机号 15814577840)
  7. -- 微信支付回调被 Redis 幂等锁误判为"重复通知"后应答 HTTP 200,
  8. -- 微信不再重试,钱包流水一直停留在"待确认",余额未增加。
  9. --
  10. -- 说明:本文件只针对本次事故执行一次,不属于版本迁移(勿并入 8.sql 自动执行)。
  11. -- 执行前请先跑【0.核对】,并在微信商户平台确认该笔订单确已收款。
  12. -- ============================================================
  13. -- 【0.核对】应返回 1 行、status = 0(待确认)
  14. SELECT id, user_id, type, order_no, amount, status, create_time
  15. FROM charge_app.t_wallet_detail
  16. WHERE order_no = '202610012106065931549256';
  17. -- 【0.核对】应返回 0 行(证明系统内确实没有入账记录)
  18. SELECT id FROM charge_app.t_pay_log WHERE out_trade_no = '202610012106065931549256';
  19. -- 【1.钱包流水置为已确认】status: 0待确认 -> 1已确认
  20. UPDATE charge_app.t_wallet_detail
  21. SET status = 1,
  22. currency = 'CNY',
  23. amount = 3000,
  24. transaction_time = '2026-10-01 21:06:14'
  25. WHERE id = 1555324958656167936
  26. AND order_no = '202610012106065931549256'
  27. AND status = 0;
  28. -- 【2.补记支付记录】必须补:幂等快路径依赖 t_pay_log,
  29. -- 缺了它以后再收到该订单回调会走不到快路径而重复入账
  30. -- <唯一ID> 请替换为雪花ID或任意未被占用的唯一值
  31. INSERT INTO charge_app.t_pay_log
  32. (id, user_id, openid, bank_type, mch_id, out_trade_no, transaction_id, success_time,
  33. trade_type, trade_state, attach, total, currency, payer_total, payer_currency)
  34. VALUES
  35. (<唯一ID>, 1555324358568706048, 'oK-oR5g5Y9vkVeaa7wsoLt1yMGAY', 'BANK_CREDIT', '1635831469',
  36. '202610012106065931549256', '4500000442202610019536073654', '2026-10-01 21:06:14',
  37. 'JSAPI', 'SUCCESS', '', 3000, 'CNY', 3000, 'CNY');
  38. -- 【3.补余额】
  39. UPDATE charge_app.t_account
  40. SET balance = balance + 3000
  41. WHERE user_id = 1555324358568706048;
  42. -- 【4.验证】
  43. SELECT u.id AS user_id, acc.balance, acc.discount_amount,
  44. (acc.balance - acc.discount_amount) AS refundable_amount
  45. FROM charge_app.t_user u
  46. LEFT JOIN charge_app.t_account acc ON u.id = acc.user_id
  47. WHERE u.id = 1555324358568706048;
  48. -- 【5.全量排查同类受害者】列出当天所有"待确认"的充值流水,
  49. -- 再与微信对账单逐笔核对(未支付就放弃的预下单也会是待确认,需用对账单确认哪些真的付了钱)
  50. SELECT w.id, w.user_id, w.order_no, w.amount, w.status, w.create_time
  51. FROM charge_app.t_wallet_detail w
  52. WHERE w.type = 1
  53. AND w.status = 0
  54. AND w.create_time >= '2026-10-01 00:00:00'
  55. AND w.create_time < '2026-10-02 00:00:00'
  56. ORDER BY w.create_time;