那天我打开商户后台,一条部分退款单显示“退款成功”,用户却发来截图说银行卡没到账,已经过了两天。我当时就懵了,支付渠道那边明明返回SUCCESS,怎么还能没到账?脑子里第一个问题就是支付退款原路退回多久到账。
这笔单子原订单299元,用户申请部分退款59元。客服审核通过后,系统调用退款接口,传的是refund_fee=5900,渠道返回也是成功。
我先怀疑退款回调没配上
因为之前遇到过支付回调收不到?按这五步排查,十分钟搞定的情况,我第一反应是退款异步通知没进来。去服务器看日志,发现通知其实到了,签名校验也过了,本地退款单状态也被更新成“已退款”。但用户说没收到。我当时甚至翻了一圈文档都没找到哪里配置错,又重新翻了一遍易支付API怎么调用的文档,确认退款接口的参数没问题,notify_url也没写错。
金额单位也对,不是分的问题
接着想会不会金额传错了。代码里把59元转成5900分,用的intval,没四舍五入,没问题。查渠道后台,该笔退款是“退款成功”,金额59.00元。到这儿我就有点想不明白了,渠道成功、回调成功、金额也对,用户为什么没收到?
宝塔定时任务配置订单自动关闭才是真凶
第二天用户发来新截图,说后台订单状态变成了“已关闭”。我一查数据库,退款单状态字段确实被改成了closed。翻了一下宝塔定时任务配置订单自动关闭的脚本,里面写的是每分钟执行一次,把超过30分钟未支付的订单关掉。但条件是 status IN ('unpaid','refunding'),退款中的单子也被捎带关掉了。渠道的钱其实已经原路退回,只是本地状态被改成了关闭,用户一看以为退款被取消了,根本没去查银行流水。
退款到账时间被状态搞混了
这次排查让我重新意识到,支付退款原路退回多久到账应该分两层看:渠道什么时候退、用户端什么时候看到状态。支付宝余额和微信零钱基本秒到,银行卡慢的要1-5个工作日。定时任务把本地状态改成“已关闭”,用户以为没退,其实钱已经在路上,只差银行入账通知。
最后怎么修和再遇到怎么快速定位
修改定时任务脚本,把条件里的refunding去掉,只关未支付。再把被误关的退款单状态批量改回退款成功。用户第二天查银行卡,59块确实到了,还多一句“你们后台显示有问题”。
后来查了下易支付费率表,退款不收手续费,但原订单手续费不退,所以59元全额退给用户,商户承担了0.38元手续费。这个跟到账时间无关,但容易让财务对账时困惑。
当初照着彩虹易支付对接教程把退款接口写完,没注意回调里status字段会被其他脚本覆盖。如果你也遇到类似情况,先查渠道退款单号是否成功,再看本地有没有定时任务改状态,多半是状态被覆盖的问题。大部分“没到账”其实是状态误导或银行入账慢。
这个问题后面可能还会变。如果你用的是新版本,定时任务的条件可能已经改成了更严谨的状态判断,但部分退款原路退回的到账时间还是跟渠道有关。尤其银行卡退款的,1-5个工作日都不算异常。别只看本地状态就下结论,先让用户去查银行卡流水。