0x00.前情提要

客户反馈系统支付宝充值不成功,订单均超时自动关闭。根据客户描述,我在系统内尝试充值,结果与客户描述一致,问题可以复现。

0x01.寻根问底

  1. 通过查看nginx accesslog和errorlog发现并没有充值结果的回调请求。

  2. 直接访问充值回调请求/api/v1/finance/notifyUrl,报500错误(服务不可用)。从错误信息看,是因为参数缺失导致后台报错,尽管报错,但服务已经响应,accesslog有对应请求日志打印。

  3. 初步判断,服务器未收到支付宝回调请求。

  4. 联系支付宝客服反馈问题,支付宝客服表示每笔订单均回调5次,但收到的是状态码为403的响应,未收到200-success响应,并提供了通知报文url。

    通知结束时间 轮次 结果 失败原因 处理方案
    2023-07-22 21:16:39,985 1 失败 返回的内容并非success,由于返回数据存在换行,无法完全展示,状态码:403,通知url:http://**/api/v1/finance/notifyUrl ,当前返回为:<!doctype html> 请检查您服务器的业务处理情况
    2023-07-22 21:16:40,005 1 失败 支付宝放弃通知 近期多次通知失败时会发生,请检查您的通知域名近期通知失败情况
  5. 在浏览器内直接访问通知报文url,得到如下结果

    判断是请求被服务器防火墙拦截了

  6. 查看宝塔防火墙日志

    果不其然,破案!

  7. 解决方法也很简单,直接向这个url加入白名单即可。

0x02.柳暗花明

经过跟客户确认近期在服务器上执行的操作,她说最近升级过宝塔版本,推断就是因为宝塔版本升级,防火墙检测规则变动引发的故障。