退款记录 · KL00006337(¥39.00)

执行时间:2026-10-13 02:39:47(微信侧到账时间)
发起人:义父(Lean)指示 · 执行:波波
结果:成功,已原路退回

一、退款事实

项值
订单号KL00006337(orders.id = 6337)
商品冈仁波齐纪念徽章(order_type = retail)
金额¥39.00(3900 分)
原支付流水号KL0000633708279(微信侧 SUCCESS,支付于 10-10 12:58:13)
微信退款单号50303708752026101361009655849
我方退款单号RF-6337-1;库内 refund_no = RFN-6337-20261013-001
退款渠道ORIGINAL(原路退回)
到账账户中国银行借记卡
手续费21 分(商户侧承担)

二、执行后的状态(已复核)

三、为什么此前"手动操作退款失败"

义父在 A 端点退款,后端返回 404。但路由确实存在(POST /api/admin/orders/{order_id}/refund/execute),

404 是 handler 内部抛的:

rec = SELECT ... FROM refund_records WHERE order_id = 6337 AND status = 'approved'
if not rec:
    raise HTTPException(404, "无已审核通过的退款记录")   # ← 命中的是这个

直接原因:refund_records 表全库 0 行。这套「客人申请 → 商户审批 → 平台执行」的退款流程

从上线起一次都没自发跑通过;订单的 refunding 状态是被直接改出来的

(order_events 里只有 created / paid,没有退款申请事件)。

本次处置:补一条 refund_records(status='approved', approved_amount_fen=3900, cash_refund_fen=3900),

再调用执行接口 —— 平台主动退款目前只能这样走。

四、执行前已验证的前置条件

项实测
微信侧这笔钱trade_state=SUCCESS,¥39 确实收了
是否已退过RF-6337-1/2 微信侧均 RESOURCE_NOT_EXISTS ⇒ 未退过
凭据齐备is_configured()=True(mchid 1111804382,私钥存在)
退款通知地址已单独配置 …/pay/refund-notify ⇒ 不会单边账
状态机refunding → refunded(refund_complete/system)is_allowed=True
租户隔离destinations 仅 1 条且 active,订单 destination_id 为 NULL ⇒ 不会撞 409
事务保护整个 execute 在 conn.transaction() 内

执行纪律:先跑干跑(不带 --commit)确认 admin 鉴权与全部前置条件,

写操作数 = 0 之后才带 --commit 真执行。

五、由此暴露、尚未修复的缺陷

  1. 🔴 A 端退款弹层的「金额输入框」是无效输入

前端传 { amount_fen, reason }(body),而后端 admin_execute_refund 不接受任何 body,

只按 refund_records.approved_amount_fen 退 ⇒ 填了也不生效,UI 在骗人。

  1. 🔴 平台想主动退款必须手工补 refund_records 才走得通。

根治方向:让 admin_execute_refund 支持无 approved 记录时按传入金额直接退。

  1. ⚠️ 微信退款调用发生在事务内部:若微信成功而后续 DB 写入失败,事务回滚会造成

「钱退了、订单状态没变」的单边账。本次未发生;兜底是 notify_url 已配,

/refund-notify 会补状态。

六、安全与清理

按义父 10-04 口径,波波不主动轮换密钥——如需更换请另行指示