微信支付jsapi缺少参数 total_fee 错误分析与解决方法

微信支付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,所以最好的方法还是把中间结果打印出来或者断点测试一下

(0)

相关推荐

  • PHP实现微信支付(jsapi支付)流程步骤详解

    最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路. 前期准备: 1.微信认证服务号,并且开通了微信支付 2.微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 3.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付证书

  • Java通过JsApi方式实现微信支付

    要使用JsApi进行微信支付,首先要从微信获得一个prepay_id,然后通过调用微信的jsapi完成支付,JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回.由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分. 示例代码如下: function onBridgeReady(){ WeixinJSBridge

  • ThinkPHP实现微信支付(jsapi支付)流程教程详解

    之前写过一篇文章讲了PHP实现微信支付(jsapi支付)流程 ,详见文章:PHP实现微信支付(jsapi支付)流程. 当时的环境是没有使用框架的,直接在一个域名指向的目录下边新建目录之后访问该目录实现的,但应用到框架中,还是有一些问题,在ThinkPHP中,由于路由规则与支付授权目录有出入,所以会报错.本篇讲讲在TP中集成微信支付的流程. 鹅厂出的SDK和文档,就是让你看不懂,使劲绕,这酸爽用了就知道.文档和SDK不是应该越简单通俗易懂越好么?难道只有使劲重构才能显示出鹅厂程序猿技术的高超咩?额

  • 微信支付java版本之JSAPI支付+发送模板消息

    本文为大家分享了java版本之JSAPI支付+发送模板消息的相关资料,供大家参考,具体内容如下 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示  以下类中涉及到生成token,关闭订单接口调用,获取配置文件信息,和工具类,在其他文章中有具体代码实现 package com.zhrd.bussinss.platform.controller.rest; import java.io.F

  • PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解

    之前有写过几篇文章将微信支付和退款: 1.PHP实现微信支付(jsapi支付)流程 2.ThinkPHP中实现微信支付(jsapi支付)流程 3.PHP实现微信申请退款 这几篇都是使用了微信官方给的PHP版本的SDK,进行支付的时候写代码可以省不少事,步骤也挺简化,但是集成SDK有很多坑,很多人说引入的SDK老报错,或者说官方SDK本身有不少错误,改起来很麻烦,也确实挺麻烦的,对于新手搞支付很容易被绕进去,那么今天就来讲讲不集成支付SDK直接调用支付接口实现支付和退款. 前期准备: 1.当然了,

  • 微信支付jsapi缺少参数 total_fee 错误分析与解决方法

    微信支付jsapi缺少参数 total_fee,其实很多参数错误都会报这个错,其实不一定是参数 total_fee,所以最好是单步或者在日志文件输出中间结果,毕竟服务器上没几个装开发软件的. 最近更换服务器之后,加上了nginx做代理并做了负载均衡后,微信支付第一次支付缺少参数 total_fee,再支付就可以,再点支付有报错缺少参数 total_fee,好奇怪,按理说是不应该报错或者要就一直报错,看了好一会代码,没问题,最后把统一下单的参数打印到后台,终于发现问题 统一下单中spbill_cr

  • 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些"暗坑"能不掉就不掉吧,要不然关键时刻出问题,真是让人急的焦头烂额. 双12客户的商城活动正在蓄势进行中,却有用户频频反馈说:支付不了,有问题,并截图如下: 当时问题感觉很奇怪,自己测试多次都ok啊,问题来了都赶紧解决吧,最终找到解决办法: 原因是程序中一个字符串变量被错误的设置为数字类型,解决方法很

  • 微信小程序首页数据初始化失败的解决方法

    一. 问题描述 用户首次后再次进入小程序时,我们通常需要通过获取用户openid或unionid用作唯一标示与后台进行数据交流,初始化用户信息.当我们通过第三方服务器跟微信建立请求时,微信需要用户确认是否公开信息.如图1,从console可以看到,在请求的同时,我们的首页index已经加载完成,图中初始化数据显示为空.无论我们将请求信息写在app.js的onload中或者index.js中,当我们点击确认后,请求信息才执行success方法,将第三方服务器返回的数据处理,这样的因需要用户点击而产

  • MySQL5.7缺少my.ini文件的解决方法

    my.ini是什么? my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的. my.ini存放在哪里? my.ini存放在MySql安装的根目录,如图所示: 我安装的MySQL 5.7缺少my.ini文件,需要自己创建. 大致内容如下 [mysqld] character-set-server=utf8 #绑定IPv4和3306端口 bind-address = 0.0.0.0 port = 3306 sql_mode="STRICT_TRANS_TABLES,NO

  • Ubuntu 20.04 火狐浏览器无法播放视频(缺少flash插件)的解决方法

    1.flash插件包下载地址:https://get.adobe.com/cn/flashplayer/ 本地下载: adobe Flash Player 浏览器flash播放插件 v32.0.0.207 Adobe Flash Player for Firefox 28.0.0.126 中文官方最新版 2.解压下载的文件:tar xzvf flash_player_npapi_linux.x86_64.tar.gz 3.打开终端并将路径切换到lib目录:cd /usr/lib 4.在lib目录

  • asp.net URL中包含中文参数造成乱码的解决方法

    问题: 前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:http://www.****.com/user.aspx?id=水天,就出现大问题了: 1.从IE地址栏中直接输入这个地址,访问没错: 2.做一个静态页,其中包括这个超链接,点击访问也没错: 3.就是把这个链接添加到这个功能块中,点击访问那边接收到的是乱码. 一开始,被这个问题也搞得头大,在google了一把后,总算是把问题给搞清楚了,其实只要这个链接地址不经过任何编码传递是不会有问题的

  • MySQL 常见错误分析与解决方法

     一.Can't connect to MySQL server on 'localhost'(10061)? 翻译:不能连接到localhost 上的mysql?分析:这说明"localhost"计算机是存在的,但在这台机器上却没提供MySQL服务.?需要启动这台机器上的MySQL服务,如果机子负载太高没空相应请求也会产生这个错误.?解决:既然没有启动那就去启动这台机子的mysql.如果启动不成功,多数是因为你的my.ini配置的有问题.重新配置其即可.?如果觉得mysql负载异常,

随机推荐