SELECT order_no, refund_status, refunded_at FROM wp_refunds WHERE refund_status = 'processing' AND created_at < NOW() - INTERVAL 10 MINUTE;
渠道后台退款状态是 REFUND_SUCCESS,退款时间 14:22:07,本地订单的 refund_status 还是 processing。用户打电话问钱到没到,客服只能手工去查。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:退款回调地址配的是下单回调的同一个入口,处理函数只认支付类型,退款类型的报文被直接忽略并返回 success。渠道以为通知成功,不再重发。
「退款回调状态」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:回调入口按通知类型分流,退款通知走独立处理函数,更新 refund_status 和退款时间;无法识别的类型也要落库保存原始报文,便于事后补数据;加一个查单任务,把退款中超过十分钟的单主动向渠道查询。
确认没问题再收工,再发一条退款通知,订单状态在几秒内变成已退款,查单任务不再捞出这笔。
