小程序商城用户支付成功,但是订单状态显示未支付。
定位过程
首先通过用户反馈的问题时间点查看日志,找到问题发生的时间日志位置。检查日志有没有报错。日志没有看到有什么异样。
检查后台业务代码,初步怀疑是数据库写失败。
再反复结合业务代码并思考再三,因为只有在收到微信通知消息才会更新数据库。所以不太可能是写数据库问题。
检查nginx access.log日志,看到发生问题时间点有没有收到微信通知请求。结果发现在发生问题的时间点里,微信通知请求报404错误。再检查nginx error.log日志,看看是什么引起的错误原因。nginx error.log日志里报错内容是: open() “/usr/share/nginx/www/index.html” failed (2: No such file or directory)…,这说明是微信通知请求的api地址不对。检查application.yml配置看到请求的地址url确实不对。
问题根源
是上一次修改nginx反向代理和application.yml中的微信通知url后没有重启服务。
发现
微信通知请求不到服务时会间隔一段时间再次发送请求。通过nginx日志看到间隔时间是这样的: 30s / 3min / 10min / 20min / 30min / 1h / 3h / 3h / 3h。
微信小程序在发起预支付,用户支付,小程序界面显示的“支付成功”是预支付js请求的结果。这时候微信支付通知请求可能还没有到达服务。这是一个异步回调功能,可能会失败。服务只有在收到微信支付通知请求才会更新数据库。