java中微信统一下单采坑(app微信支付)

时间:2024-01-18 15:11:44

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

java中微信统一下单采坑(app微信支付)

里边提到:秘钥的设置应注意:不能使用自定义的秘钥,要去密码生成网站生成如,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的感觉是,愤怒、头痛、恶心,想打人。
后续问题解决后会在该随笔追加解决方案 .
追加: 问题已解决 , 重置了三次商户密钥.(....................)
在解决过程中又发现了一个较大的坑 , 在二维码支付模式中 , 本来的设计是生成二维码之后展示到页面上让用户去长按识别来支付 , 但是今天发现微信关闭了这个功能 , 只能是用另外一台手机去扫码支付 .
由于用户体验及其不好 , 后改用公众号支付模式 .