app支付前java后台统一下单文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

微信支付接口签名校验工具:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

app支付后台代码可参考:https://blog.csdn.net/wd0032/article/details/79680215

微信退款可参考:https://www.cnblogs.com/yclimb/p/9934046.html

在我让主管确认了好几遍appid、mch_id以及app_key之后(发现并修改了商户号mch_id和app_key(第一次是app_secret), 后来又再次重新生成了app_key)

本人校验了好几个小时(包括使用官方校验工具多次校验签名是否正确)确认官方生成的签名和本地代码生成的一致,排除了签名算法的错误

最后还是返回签名错误

后来再次怀疑配置参数是否正确,然后让同事帮忙review代码,也是签名,后来同事最后用其他项目的配置参数,调试,成功了,成功了!!!!

所以最终定位:配置参数错误,主要就是生成的秘钥app_key有问题

第二天再次确认配置参数,并重新生成app_key,测试,成功!!!!!

所以在确认签名算法无误后,可以重置两到三次app_key(具体原因不知道)

新:

再次接微信支付的时候,又出现了这个问题,前两次依然失败(签名错误),第三次用了一个曾经成功过的秘钥可以了;

感觉事情没那么简单,于是又看到了这么一篇文章:https://help.ecmoban.com/article-2085.html

里边提到:秘钥的设置应注意:不能使用自定义的秘钥,要去密码生成网站生成如,http://suijimimashengcheng.51240.com 或 http://www.sexauth.com/

故签名错误的排查方法暂时总结如下:

  1. 确认公众号的appSecret和商户号的API密钥没有搞混。

  2. 去官网生成签名然后对比本地签名,确保签名算法正确(官网签名校验:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

  3. 重置商户秘钥(可重置两到三次)(去网站生成:http://suijimimashengcheng.51240.com 或 http://www.sexauth.com/)

以下为参考转载:https://www.cnblogs.com/wanghuijie/p/wxpay_sign_error.html

最近在做微信支付,调用微信的统一下单支付接口http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1时,老是返回“签名错误”,偶尔可以成功,不知道是怎么回事。我在日志中打印出生成的字符串和签名,然后用相同的数据在微信支付提供的在线支付调试工具生成签名,发现生成的签名结果一样!生成的最终xml也一样,但接口就是返回

<xml><return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[签名错误]]></return_msg>
</xml>

POST给微信的xml内容:

<xml>
<appid><![CDATA[wxe587fed28211bccb]]></appid>
<body><![CDATA[Demo]]></body>
<device_info><![CDATA[WEB]]></device_info>
<fee_type><![CDATA[CNY]]></fee_type>
<mch_id><![CDATA[1265056801]]></mch_id>
<nonce_str><![CDATA[ejnshgum39igp6qwpvzwb5jbwk8yigqz]]></nonce_str>
<notify_url><![CDATA[http://testpay.le1.com.cn/wechat/notify.htm]]></notify_url>
<openid><![CDATA[opZb3wsfU6RUZGxgFZ6OXVbdVxcU]]></openid>
<out_trade_no><![CDATA[1002_09745565EpuxTunUCD0AA72E]]></out_trade_no>
<product_id><![CDATA[QWE789C1523QWE78]]></product_id>
<sign><![CDATA[BF4BB39FFAFC4DF470C5A3F7784678BD]]></sign>
<spbill_create_ip><![CDATA[172.16.12.171]]></spbill_create_ip>
<total_fee><![CDATA[1]]></total_fee>
<trade_type><![CDATA[NATIVE]]></trade_type>
</xml>

首先 , 看到返回msg显示签名错误 , 第一反应官网提供的路径去生成了一下签名做比较 , 结果发现签名算法是没错的.

https://pay.weixin.qq.com/wiki/tools/signverify/(或 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

找了各种方法 , 百度谷歌搜索了一下午 , 发现很多同行都遇到了一样的问题 , 得到了以下解决方法

  1、确认公众号的appSecret和商户号的API密钥没有搞混。

  2、重置商户API密钥。(本人亲测是这样解决了问题,tx真是个坑,我严重鄙视。)

  3、确认公众号授权的域名和目录是正确的。
  4、参数body含有中文字符,改换英文签名成功,那么就转换字符编码试试。
    $dat = iconv('UTF-8','ISO8859-1',array2xml($package));
 
然而 , 并没有解决问题 , 先吐槽一下微信支付这个巨坑 , 不是说它的api水平有多烂,但你至少说明白一点啊,每次看微信api都头痛。比阿里差的不是一个数量级的。调阿里api都是,优雅、简单、舒服,效率高。调微信api的感觉是,愤怒、头痛、恶心,想打人。
 
后续问题解决后会在该随笔追加解决方案 .
 
追加: 问题已解决 , 重置了三次商户密钥.(....................)
 
在解决过程中又发现了一个较大的坑 , 在二维码支付模式中 , 本来的设计是生成二维码之后展示到页面上让用户去长按识别来支付 , 但是今天发现微信关闭了这个功能 , 只能是用另外一台手机去扫码支付 .
由于用户体验及其不好 , 后改用公众号支付模式 .

java中微信统一下单采坑(app微信支付)的更多相关文章

  1. SpringBoot项目后台对接微信支付开发——微信统一下单接口开发

    开始没找到微信支付的sdk.自己根据官方给的接口文档纯手写,各种xml转JSON,JSON转xml,加密解密,签名....整个人都是崩溃的 开发的第三天,发现有官方的sdk.心情一下子豁然开朗,整个人 ...

  2. 微信支付(java版本)_统一下单

    最近工作接触到微信支付,刚开始解决微信支付很神秘,接触之后发现并没有那么神秘,就是有很多坑,在开发的时候需要注意,整理出来: 1.准备工作 首先需要登录微信支付公众平台阅读接口文档,地址:https: ...

  3. php 微信 统一下单 接口实例

    <?phpclass wechatAppPay { //接口API URL前缀 const API_URL_PREFIX = 'https://api.mch.weixin.qq.com'; / ...

  4. 微信小程序填坑---小程序支付

    因为公司刚刚重新做了网站,所以也吧公众号和小程序提上了日程,在公众号里面没有什么问题,直接按照官方文档进行代码编写.调试,然后就解决了公众号内支付的问题. 因为小程序提供了<webview> ...

  5. 使用wepy框架搭建微信小程序采坑记(一)

    1.什么是wepy 这个框架是腾讯内部出的一个类MVVM的小程序开发框架.大体上来说语法是类VUE的,所以如果有VUE开发经验的话迁移成本会低一些.至于具体的怎么使用我就不赘言了,有问题查文档(官方文 ...

  6. 微信小程序采坑(一)

    1.微信小程序如何让text内容空格 <text decode="{{true}}" space="{{true}}">  </text> ...

  7. 微信小程序采坑

    wx.request() complete回调函数执行时机问题 代码执行顺序有时候会严重影响用户体验:比如项目中请求数据时显示loading的图标,请求完成后不管失败还是成功都要把loading图标隐 ...

  8. 微信小程序采坑之上拉触底加载更多和下拉刷新

    小程序中加载更多数据一般都是触底刷新 有自带的函数: onReachBottom: function (){} 但是在使用时触发完全没有反应,后来尝试给外层加了一个高度,解决问题 仔细想想也是,没有设 ...

  9. Java中日期格式化YYYY-DD的坑

    写这篇博文是记录下跨年的bug.去年隔壁组的小伙伴就是计算两个日期之间间隔的天数,因为跨年的原因计算有误. 当时测试组的小姐姐也没有模拟出来这种场景,导致上生产环境直接影响线上的数据. 今天逛技术论论 ...

随机推荐

  1. 牛客网-乌龟跑步-(四维dfs)

    链接:https://ac.nowcoder.com/acm/problem/15294来源:牛客网 题目描述 有一只乌龟,初始在0的位置向右跑. 这只乌龟会依次接到一串指令,指令T表示向后转,指令F ...

  2. 微信小程序和微信公众号的id是一个吗

    首先,简单说下我遇到的问题是我们的程序调用微信小程序得到openid,然后通过openID得到用户的唯一标识,用户得以登录,然而,当我们调用微信公众号也同样的到openid,同一以用户两个不同的ope ...

  3. 存储过程传入datatable

    存储过程传入一般的参数都很简单,今天要说一下存储过程传入datatable 类型 首先要自定义一个 表类型 CREATE TYPE [dbo].[servicedatableType] AS TABL ...

  4. mysql解压缩版安装方法以及mysql无法启动1067错误

    https://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html我下载的版本号是5.6.421.解压到C:\Program Files\M ...

  5. Linux驱动之一个简单的输入子系统程序编写

    的在Linux驱动之输入子系统简析已经分析过了输入子系统的构成,它是由设备层.核心层.事件层共同组成的.其中核心层提供一些设备层与事件层公用的函数,比如说注册函数.反注册函数.事件到来的处理函数等等: ...

  6. 网络编程初识和socket套接字

    网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...

  7. ORM常用字段介绍

    Django中的ORM Django项目使用MySQL数据库 1. 在Django项目的settings.py文件中,配置数据库连接信息: DATABASES = { "default&qu ...

  8. Python 多个分隔符 读取逗号和空格分开的数据

    str.split()  清除默认 空格和tab  对空格数量不敏感 str.split(' ') 只清除一个空格     对空格数量敏感 l = re.split('[^0-9.]+',s.stri ...

  9. trinitycore 魔兽服务器源码分析(二) 网络

    书接上文 继续分析Socket.h SocketMgr.h template<class T>class Socket : public std::enable_shared_from_t ...

  10. 主机性能监控之wmi 获取进程信息

    标 题: 主机性能监控之wmi 获取进程信息作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990499.html 欢迎转帖 请保持文本完整并注明出处 仅 ...