问题
今天在巡查后端日志的时候发现,微信支付日志里有许多失败记录
(wxpay java sdk.run:166 - report fail. reason: Connect to report.mch.weixin.qq.com:80 [report.mch.weixin.qq.com/0.0.0.1] failed: 无效的参数 (connect failed)
原因
网上简单搜了一下,排名靠前的回答是说什么跟微信不支持苹果端小程序支付有关,但看错误提示,感觉跟这个应该关系不大,后来经过排查,发现是微信支付官方SDK的问题。
以下是微信SDK中WXPayReport.java
文件中的代码截图:
看了看微信支付接口,发现微信支付接口中有一个“测速上报”的功能,意思就是把商户的响应时间啥的报告给微信,帮助它优化网络部署之类的。
但是注意,上图中的url地址是不可访问的😓。。。(可以测试一下上面的地址,是找不到IP的)
微信支付接口文档中的上报地址是下面这样的:
解决方案
那么怎么解决呢?让我改它代码加上上报功能,我是懒得改,还是看看怎么关掉它吧。
大概看了一下源码,发现是有一个开关的,在 WXPayConfig.java
有一个shouldAutoReport()
方法:
我们在实现子类的时候,可以覆盖这个方法,然后返回 false
就可以关闭自动上报了。
继续跟踪了一下代码,发现SDK中用了一个LinkdBlockingQueue来作为报告发送队列,即使关掉自动上报,代码还是会把报告加入队列中,白白浪费内存。唉,直接改SDK代码吧。。。
修改WXPayReport.java
文件,添加开关控制就行了:
public void report(String uuid, long elapsedTimeMillis,
String firstDomain, boolean primaryDomain, int firstConnectTimeoutMillis, int firstReadTimeoutMillis,
boolean firstHasDnsError, boolean firstHasConnectTimeout, boolean firstHasReadTimeout) {
if (config.shouldAutoReport()) { // 这里添加控制
long currentTimestamp = WXPayUtil.getCurrentTimestamp();
ReportInfo reportInfo = new ReportInfo(uuid, currentTimestamp, elapsedTimeMillis,
firstDomain, primaryDomain, firstConnectTimeoutMillis, firstReadTimeoutMillis,
firstHasDnsError, firstHasConnectTimeout, firstHasReadTimeout);
String data = reportInfo.toLineString(config.getKey());
WXPayUtil.getLogger().info("report {}", data);
if (data != null) {
reportMsgQueue.offer(data);
}
}
}
最后
最后还是希望官方的SDK能够改一下吧,很明显的错误,做大厂要有点大厂的样子嘛😅。