代码 微信支付退款卡在 PROCESSING / CLOSED / ABNORMAL:三种"没退成功"的状态怎么读、怎么处理

2026-10-06 09:00:52

微信支付退款卡在 PROCESSING / CLOSED / ABNORMAL:三种"没退成功"的状态怎么读、怎么处理

调 POST /v3/refund/domestic/refunds 只是受理了退款请求,钱有没有到用户手里要另说。退款单最终会落成三种"没退成功"的形态:一直 PROCESSING、CLOSED、ABNORMAL,各自含义不同,处理动作也不同。下面按状态逐个拆,附退款回调的重试频次和几个高频错误码。

提交退款返回的成功,只是"受理成功"

调 POST /v3/refund/domestic/refunds 申请退款,接口返回 HTTP 200 不等于退款到账。资金处理有多个环节,接口只保证请求被受理。想知道钱有没有退到用户手里,只有两个途径:

  • 退款结果通知:申请退款时传的 notify_url,微信回调过来
  • 主动查单:POST/GET 查询单笔退款,按商户退款单号 out_refund_no 或微信退款单号 refund_id

官方建议:申请退款后间隔 1 分钟查一次;超过 5 分钟还是"退款处理中",就逐步衰减轮询频率(5 分钟、10 分钟、20 分钟、30 分钟……)。不要 1 秒一次死轮询。

退款状态只有四个值,先分清终态和非终态

status(退款单状态):

  • SUCCESS 退款成功——终态,钱已经原路退回用户
  • PROCESSING 退款处理中——非终态,还没到账,继续等
  • CLOSED 退款关闭——终态,等于"这笔退款失败"
  • ABNORMAL 退款异常——需要人工介入,见下文

回调事件的 event_type 对应:REFUND.SUCCESS / REFUND.ABNORMAL / REFUND.CLOSED。只有状态变更成"成功/关闭/异常"才会推通知,"处理中"不会推。

CLOSED:退款失败,要换单号重发

退款关闭(CLOSED)就是退款失败。两种成因:

  1. 退款单受理后一直处于 PROCESSING,超过 7 天,出资账户余额仍然不足,退款关闭。
  2. 出款账户的资金状态不符合要求。例如想从分账余额里出款,但该笔订单的分账余额已经被解冻。

补救:把账户余额充够,生成一个新的商户退款单号 out_refund_no,重新调申请退款 API。原来的单号已经关闭,不能复用。

ABNORMAL:原路退回失败,钱停在中间账户

退款异常(ABNORMAL)一般发生在退到用户银行卡的环节:用户的卡作废或冻结,原路退回失败。

注意微信的处理顺序:卡退回失败时,微信会优先尝试把钱退到用户的微信零钱;只有用户的零钱账户也已注销,退款单才会流转成 ABNORMAL。也就是说,能退到零钱的情况下不会给你报异常。

此时退款资金停在退款的中间账户里,两个处理方式:

  1. 商户平台 → 交易中心,手动发起这笔退款;
  2. 调 POST /v3/refund/domestic/refunds/{refund_id}/apply-abnormal-refund 发起异常退款:
    • type:USER_BANK_CARD(退到用户银行卡)或 MERCHANT_BANK_CARD(退回交易商户的结算银行账户)
    • 退到用户银行卡时 bank_type 必填,且只支持招行、交通、农行、建行、工商、中行、平安、浦发、中信、光大、民生、兴业、广发、邮储、宁波这 15 家的借记卡
    • bank_account 是敏感字段,要用微信支付公钥加密,HTTP 头 Wechatpay-Serial 带上公钥 ID
    • 这个接口频率限制 150qps,即每秒正常申请退款请求不超过 15

处理成功后,退款单状态会流转为 SUCCESS。

一个容易误判的点:PROCESSING 期间资金已经扣了

退款单受理成功后,微信会先从交易商户的基本账户里扣掉要退的钱(资金账单里会有一笔支出记录),钱进入微信侧退款的中间账户。等状态变 SUCCESS,才代表钱原路退到了用户。

所以"资金账单里看到退款支出、但退款单还是 PROCESSING"是正常逻辑,不是重复退款。别看到账单扣款就以为退款成功、去给用户手动补一笔。

退款接口高频错误码

  • REFUND_FEE_MISMATCH:"订单金额或退款金额与之前请求不一致"。检查退款金额是否超过实付;total_fee / refund_fee 单位是分、不能带小数点;多次退款时每次 out_refund_no 必须唯一,重复用了旧单号也会报这个。
  • INVALID_REQUEST:"支付单号校验不一致,请核实后再试"。同一个 out_refund_no 被用于了不同的微信订单号或商户订单号——out_refund_no 必须在商户系统内全局唯一。
  • USER_ACCOUNT_ABNORMAL:用户账号异常(如已注销),原路退回处理不了。确认账号已注销就退不了;账号正常则检查参数后重试。
  • RESOURCE_NOT_EXISTS:退款单不存在,检查退款单号。
  • FREQUENCY_LIMITED:该笔退款正在受理中。调查单接口确认,或降低频率用原单号重试,别换单号。
  • SYSTEM_ERROR:系统超时。用相同参数、相同商户退款单号重试,不要换单号。

退款回调本身的坑

退款回调地址是申请退款时传的 notify_url,不一定是支付时的回调地址。验签通过后 HTTP 应答 200 或 204;验签不通过返回 5XX 或 4XX 并带回执。若应答失败或 5 秒超时,微信按 15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h 的频次重发,最多 15 次,不保证送达。所以回调必须幂等:按 out_refund_no 判重,重复通知只处理一次。

小结的排查顺序

  1. 拿到退款单,先看 status 是终态还是 PROCESSING;
  2. PROCESSING:别慌,按衰减频率查单,别拿账单扣款当成功;
  3. CLOSED:充值 + 换 out_refund_no 重发;
  4. ABNORMAL:走商户平台手动处理或 apply-abnormal-refund 接口;
  5. 接口直接报错:按错误码逐个对(金额/单号唯一性/账号异常/频率)。

状态取值与错误码以微信支付官方文档为准,字段名与取值请以文档为准。

推荐文章

程序员茄子在线接单