之前一直正常运行的微信支付突然出现”调用支付JSAPI缺少参数total_fee”问题。项目日志不全且本人不是微信公众号的管理员,表示有些懵圈。
1.首先查日志,发现total_fee是有的,包括所有必须的参数都是有的。有时候虽然报的时缺少total_fee,但很可能并非真的缺这个字段值。
2.各种补全同事的代码日志,定位之后发现是调用统一下单接口时微信返回的信息中return_code为FAIL,return_msg为????。这种情况最后下首要的措施是先把return_msg显示出来,因为return_msg非常关键会提示我们请求失败的原因。乱码很可能是tomcat编码问题,解决方法:进入tomcat的bin目录,打开catalina.sh,在
if [ -z "$LOGGING_MANAGER" ]; then
LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
fi
后添加“Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8”,最后显示为
if [ -z "$LOGGING_MANAGER" ]; then
LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
fi
显示结果为签名错误。
3.签名错误的原因主要有以下几种:
- md5生成sign错误:没有按照文档所说对字段进行字母排序或没有进行字母大写转换
- App secret等参数被他人改动
- 商户key值被他人改动
下面说一下如何一个个排查:
1.检查sign是否正确生成可通过微信公众平台支付接口调试工具https://pay.weixin.qq.com/wiki/tools/signverify/进行调试,选择符合自己的接口方式,我的是自定义,然后添加参数并将对应的实际值填入,生成签名。可以看到应该生成的即被微信服务器所认可的签名以及应该向微信服务器发送的xml。比对后发现没错,这个就监介了。
2.怀疑App secret被管理员重新生成。App secret如果被改是会影响用户授权,应该是无法走到提交统一下单请求那一步的。所以被排除了。
3.基本上就剩商户密钥了。问了管理员说没改,但实际上就是她重新生成了密钥。。。。。
最终发现不只是商户密钥被改,app secret也被改了。感觉诡异,前两天改的,但是直到问题出现的时候竟然还能走到统一下单,难道是用户openid被缓存起来了么
有点想吐槽的是为,微信支付出问题之后对于没有经验的开发者来说很不好定位。返回的内容太宽泛了,你要不停地各种排查==东西改了之后还要放到服务器上去测(我是不知道如何通过工具直接一步走到支付那里去调试支付请求接口了啦)。解决问题之后有种知道真相的我眼泪掉下来的感觉。。。。