微信支付退款卡在 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)就是退款失败。两种成因:
- 退款单受理后一直处于 PROCESSING,超过 7 天,出资账户余额仍然不足,退款关闭。
- 出款账户的资金状态不符合要求。例如想从分账余额里出款,但该笔订单的分账余额已经被解冻。
补救:把账户余额充够,生成一个新的商户退款单号 out_refund_no,重新调申请退款 API。原来的单号已经关闭,不能复用。
ABNORMAL:原路退回失败,钱停在中间账户
退款异常(ABNORMAL)一般发生在退到用户银行卡的环节:用户的卡作废或冻结,原路退回失败。
注意微信的处理顺序:卡退回失败时,微信会优先尝试把钱退到用户的微信零钱;只有用户的零钱账户也已注销,退款单才会流转成 ABNORMAL。也就是说,能退到零钱的情况下不会给你报异常。
此时退款资金停在退款的中间账户里,两个处理方式:
- 商户平台 → 交易中心,手动发起这笔退款;
- 调
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 判重,重复通知只处理一次。
小结的排查顺序
- 拿到退款单,先看
status是终态还是 PROCESSING; - PROCESSING:别慌,按衰减频率查单,别拿账单扣款当成功;
- CLOSED:充值 + 换
out_refund_no重发; - ABNORMAL:走商户平台手动处理或
apply-abnormal-refund接口; - 接口直接报错:按错误码逐个对(金额/单号唯一性/账号异常/频率)。
状态取值与错误码以微信支付官方文档为准,字段名与取值请以文档为准。