微信支付jsapi缺少参数 total_fee 错误分析与解决方法
2018-03-26 09:56
585 查看
微信支付jsapi缺少参数 total_fee,其实很多参数错误都会报这个错,其实不一定是参数 total_fee,所以最好是单步或者在日志文件输出中间结果,毕竟服务器上没几个装开发软件的。
最近更换服务器之后,加上了nginx做代理并做了负载均衡后,微信支付第一次支付缺少参数 total_fee,再支付就可以,再点支付有报错缺少参数 total_fee,好奇怪,按理说是不应该报错或者要就一直报错,看了好一会代码,没问题,最后把统一下单的参数打印到后台,终于发现问题
统一下单中spbill_create_ip参数一会是127.0.0.1(ipv4),一会是0:0:0:0:0:0:0:1(ipv6)
当为ipv4是可以正常调用,为ipv6是就发生缺少参数 total_fee错误,其实后台报错是
<xml> <return_code> <![CDATA[FAIL]]> </return_code> <return_msg><![CDATA[invalid spbill_create_ip]]></return_msg> </xml>
从中可以发现
1、微信支付不支持ipv6;
2、spbill_create_ip参数虽然要求为非空,但是微信只是校验了非空,没有根本要求要实际的用户端实际ip,(127.0.0.1都能发起支付);
3、同时,我们也发现为什么ipv4情况下会一直是127.0.0.1,因为用了nginx做了代理,所以request.getRemoteAddr获取的IP永远是本机地址。
确定问题所在,下面解决问题,把获取IP地址的方法换一下
原来是
parameterMap.put("spbill_create_ip", request.getRemoteAddr());
更换成
public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
这样获取的IP是ipv4是也是客户的真实ip。
有时报这个错误并不一定是IP的问题,前端报错都是微信支付jsapi缺少参数 total_fee,所以最好的方法还是把中间结果打印出来或者断点测试一下
您可能感兴趣的文章:
相关文章推荐
- 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
- 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
- IOS端调用微信支付时出现:“调用JSAPI缺少参数:timeStamp”解决方法
- 微信支付jsapi缺少参数 total_fee
- 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
- 微信支付爬坑记——微信支付开发出现redirect_uri参数错误的解决方法
- 微信支付缺少total_fee参数
- 微信小程序 调用支付jsapi时缺少参数:total_fee
- 【已解决】phpcms2008 后台 我在后台 “缺少 catid 参数” 错误的解决方法
- 调用支付jsapi缺少参数 total_fee
- 微信免充值券验收用例开发出现”err_code”:”-1″,”err_desc”:”调用支付JSAPI缺少参数: total_fee”,但支付成功
- C# 001 --- 正确的删除一个控件的事件函数 --- 解决错误: “A”不包含“B”的定义,并且找不到可接受类型为“A”的第一个参数的扩展方法“B”(是否缺少 using 指令或程序集引用?)
- 微信支付开发出现redirect_uri参数错误的解决方法
- 记一个微信支付-1错误JSAPI缺少参数app|get_brand_request:Fail
- 常见错误分析及解决方法
- DiskGenius的 “终止位置参数溢出”错误解决方法。
- DiskGenius的 “终止位置参数溢出”错误解决方法。
- 一个JAVA单例模式的典型错误应用的分析和解决方法
- 动易2005、2006版常见错误号的原因分析及解决方法
- ambiguous call to overloaded function 两种情况的错误分析及解决方法