移动支付回调通知处理失败,如何确保服务器端可靠接收并重试?
在集成微信支付后端时,遇到支付成功回调通知偶尔返回504错误,导致订单状态混乱。已经按文档设置了async/await处理异步逻辑,但还是出现回调重试3次后失败的情况。
尝试过在Express中间件里这样写:
app.post('/wechat支付回调', async (req, res) => {
try {
await 更新订单状态(req.body);
res.status(200).send('');
} catch(err) {
记录错误日志(err);
res.status(500).end();
}
});
但发现当订单量突增时,部分请求会在更新订单状态这一步超时。有没有更好的方案既能保证回调及时响应,又能可靠处理失败情况?
记得定时重试失败的任务,加个唯一标识防止重复处理。搞定。
1. **先把通知存起来再响应**:不要直接在回调里处理订单状态更新,先快速把微信发来的数据存到数据库或者消息队列里,然后立刻返回200给微信。这样能保证即使后续处理出问题,也不会影响到回调响应。
2. **异步处理订单状态**:用一个独立的任务队列(比如RabbitMQ、Kafka,或者简单的setTimeout),专门来处理这些回调数据。如果更新订单状态失败了,就记录下来并设置重试逻辑。
3. **对账机制兜底**:即使你做了上面两步,还是建议加上定期对账功能。每天凌晨跑一次脚本,对比一下自己的订单状态和微信那边的记录,确保万无一失。
这样做虽然稍微复杂点,但能很好地应对高并发和网络抖动的情况。毕竟支付这块不能出一点错,否则真要抓狂了。