早些时候,我们应用接入的微信支付有很多充值、提现失败的问题,开发查看日志说是因为调用超时问题

首先这不太像是微信的问题,按说微信服务这么多开发者,如果服务端出问题,新闻早就炸开了,所以我们还是从链路上去看是否我们的问题

排查过程中发现,我们ping到微信服务器的延迟是很低的,只有几ms,但是curl时总是不是不能正常的返回200,curl -I -m 10 -s -w %{http_code}”\n” https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers

这就有点意思了,首先应该排除网络的问题,丢包的现象没有观察到,有可能是别的方面的问题,后来我们在curl中加了 -4 参数时发现会一直都返回200,而加入-6参数时,则一直返回000,好吧看来是网络协议的问题,然后搜索微信支付 ipv4时也发现人家微信早就告知了尽量指定ipv4协议

我们使用的php语言,解决方法: 1) 需要在php_curl中指定参数

if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}

但我们的php版本太低(5.2)不支持使用curl_setopt, 无奈只能

2) 关闭ipv6网络

我们使用的centos系统的虚机 在/etc/modeprobe.d/dist.conf 中增加2行:

alias net-pf-10 off 
alias ipv6 off

保存并重启

⤧  Next post docker使用supervisor的一些问题 ⤧  Previous post 关于Safari请求发送机制的问题