退款成功后订单状态未更新怎么办?
我做了一个小程序的退款功能,用户发起退款后明明收到支付平台返回的refund_status: "SUCCESS",但订单状态在前端还是显示”退款中”。
之前按文档写了这样的回调处理逻辑:
async handleRefundResult(data) {
if(data.refund_status === 'SUCCESS') {
// 更新本地数据库状态
await updateOrderStatus(data.order_id, 'REFUNDED');
// 同时调用页面更新
this.refreshOrderList();
}
}
但实际测试时发现,有时候数据库确实更新了,但页面就是不刷新。试过手动刷新页面就能看到正确状态,但用户肯定不愿意每次都手动刷新啊。
查了接口日志发现,支付平台的异步通知有时会比前端调用晚几秒到达,导致状态不同步。用轮询的话又怕频繁请求服务器,有没有更好的解决方案?
建议从后端入手解决这个问题。在用户发起退款请求的时候,你可以在后端先将订单状态改为“退款中”,然后直接返回给前端这个状态,同时记录一个退款任务。等支付平台的异步通知到达时,后端再根据通知的结果更新订单状态为“已退款”或者处理失败的情况。
为了让前端能及时感知到状态变化,可以考虑用 WebSocket 或者 Server-Sent Events (SSE) 来实现实时推送。比如,当后端收到支付平台的退款成功通知后,主动推送给前端,告诉它订单状态已经变为“已退款”。这样就不需要前端轮询,也避免了手动刷新的问题。
代码上可以这样调整:
后端部分增加一个 WebSocket 的推送逻辑:
前端部分监听 WebSocket 消息:
这样做的好处是状态同步的实时性更强,用户体验更好,而且不会增加太多服务器负担。当然,WebSocket 的实现稍微复杂一点,如果不想搞得太麻烦,也可以用长轮询作为折中方案,但实时性会差一些。
对了,记得在退款逻辑里加上超时处理,比如超过一定时间还没收到支付平台的通知,主动去查询退款状态,防止有漏网之鱼。这种边界情况很容易被忽略,别问我怎么知道的,踩过坑才懂。