问题描述:

使用springBoot中RestTemplate发送post请求,使用HMAC-SHA256加密方式,通过签名验证工具校验签名通过但是仍然返回签名错误状态提示。

微信提供的签名验证工具:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

自己的xml

<xml><time_expire><![CDATA[20200318171406]]></time_expire><nonce_str><![CDATA[r5392r99S0IEtZF91Arl5994068153Pn]]></nonce_str><time_start><![CDATA[20200318170406]]></time_start><openid><![CDATA[**********]]></openid><sign><![CDATA[3B42CACF29F2F1F741A828F769D5F0580F9B46F4711EB964AB08BF50C8796947]]></sign><body><![CDATA[产品支付]]></body><notify_url><![CDATA[*****/resultNotify]]></notify_url><mch_id><![CDATA[**********]]></mch_id><spbill_create_ip><![CDATA[127.0.01]]></spbill_create_ip><out_trade_no><![CDATA[**********]]></out_trade_no><goods_tag><![CDATA[产品支付]]></goods_tag><total_fee>10</total_fee><appid><![CDATA[**********]]></appid><trade_type><![CDATA[JSAPI]]></trade_type><attach><![CDATA[产品支付]]></attach><sign_type><![CDATA[HMAC-SHA256]]></sign_type>
</xml>

请求方式:

        URI uri = null;try {uri = new URI("https://api.mch.weixin.qq.com/pay/unifiedorder") ;} catch (URISyntaxException e) {e.printStackTrace();}
//xml,是微信接口需要的参数xml格式的字符串String result =  restTemplate.postForObject(uri,xml,String.class);String s1 = "";try {s1 = new String(result.getBytes("ISO8859-1"), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return s1;

解决方法:

1、参数不含有中文,使用restTemplate.postForObject ,返回成功。

2、仍然使用 String result =  restTemplate.postForObject(uri,xml,String.class);,但是需要在生成xml字符串参数是,进行一次ISO8859-1编码,new String(xml.toString().getBytes("utf-8"),"ISO8859-1")

3、设置请求头为application/xml; charset=UTF-8,然后发送restTemplate 请求

URI uri = null;try {uri = new URI("https://api.mch.weixin.qq.com/pay/unifiedorder") ;} catch (URISyntaxException e) {e.printStackTrace();}//使用  restTemplate(springboot 封装的用于发送请求的对象)如果不设置请求头,编码格式默认为ISO8859-1,会导致签名算法验证通过,但是微信仍然会返回签名错误的提示HttpHeaders headers = new HttpHeaders();MediaType type = MediaType.parseMediaType("application/xml; charset=UTF-8");headers.setContentType(type);HttpEntity<String> requestEntity = new HttpEntity<>(xml, headers);ResponseEntity<String> responseEntity =  restTemplate.postForEntity(uri,requestEntity,String.class);String s1 = responseEntity.getBody();//s1为微信返回结果的xml格式的字符串

注意:如果发生签名算法通过,但微信仍返回签名错误可检查一下内容:

1、out_trade_no 不重复

2、参数中是否有中文(最可能产生错误的原因,可先将中文改成英文进行排除验证)

3、加密过程中是否使用utf-8进行编码(MD5与HMAC-SHA256两种加密都需要注意编码格式)

4、请求头是否为:application/xml; charset=UTF-8

5、编码方式微信支撑MD5与HMAC-SHA256,但使用HMAC-SHA256加密可能会出现签名算法验证通过但微信返回签名错误的情况,可以改成MD5加密算法。(碰到过,需要注意)

微信签名算法验证通过,但微信仍然返回签名错误的解决相关推荐

  1. 微信小游戏获取用户相关api返回签名错误87009的解决方案

    大家在用微信小游戏经常会通过小程序的appid和secret来获取访问权限,这样就能获取用户的加密串,或者查询用户的记录. 不过微信社区在一些问题上更新并不及时,或者不活跃导致很多用户使用过程中经常遇 ...

  2. php获取prepay_id时报错,微信支付获取prepay_id返回签名错误,官方demo中的签名方法MD5验证有问题...

    引用官方V3微信支付PHP版的demo做的改动,在获取prepay_id发现总是返回签名错误,经与腾讯官方的"微信公众平台支付接口调试工具"对比发现MD5不一样,找到demo中代码 ...

  3. 微信小程序支付返回签名错误_java 微信小程序微信支付统一下订单及数字签名错误问题(后端)...

    今天来分享一下之前做微信小程序微信支付遇到的一些坑,博主这里是微信小程序支付功能,因此选择的微信支付方式是JSAPI支付方式(温馨提示左下角有音乐哦). 首先我们肯定是要在小程序后台绑定一个商户号的, ...

  4. 微信小程序支付返回签名错误_PHP微信小程序支付——签名错误

    先分清几个概念:微信公众平台.微信开放平台.微信商户平台 1.微信公众平台.微信开放平台.微信商户平台是三个不同的平台 2.微信公众平台:用于公众号.小程序等等的设置平台,包括APPID.APPSEC ...

  5. [PHP]微信红包接口实践说明 CA证书出错 签名错误

    1. 在微信支付的商户平台,在[API安全]中下载API证书,将下载的证书(apiclient _cert.pem/apiclient_key.pem/roota.pem)放在服务器上,确定并记录存放 ...

  6. 微信jssdk ios下报config invalid signature签名错误问题 Android正常

    微信jssdk ios下报config invalid signature签名错误问题 Android正常 最近Taro项目出于安全考虑,所有上传图片的地方都要改为,先把图片上传到微信服务器,然后根据 ...

  7. php连接数据库404错误代码,访问编码后的中文URL返回404错误的解决方法,url404_PHP教程...

    访问编码后的中文URL返回404错误的解决方法,url404 昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内.仔细考 ...

  8. android 微信支付,body为中文字符,签名错误

    微信支付订单生产方法: /*** 根据您的订单信息 生成 微信产品支付订单信息*/private String createWeChatOrder() {StringBuffer xml = new ...

  9. 微信JSSDK invalid signature签名错误的解决方法

    导致签名错误的原因: 微信文档给出以下原因. invalid signature签名错误:建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cg ...

最新文章

  1. 100%的BAT招聘岗位都考的知识,你精通了吗?
  2. 把文件每行的tab键分隔符改成逗号分隔符
  3. python怎么建立画板_Python基于opencv实现的简单画板功能示例
  4. 关于delete和delete[]
  5. 团队项目-北航MOOC系统Android客户端 NABC
  6. How Browser Works
  7. git 忽略文件不起作用
  8. Exception.InnerException 属性的使用
  9. MySQL数据库数据分开存储
  10. 机器学习领域有哪一些值得关注的人
  11. 栈的复习(加减乘除表达式求值)
  12. 触发事件_SAP 通过事件触发后台JOB
  13. SDWebImage点滴
  14. Microsoft SQL Server Management Studio(SSMS)概述
  15. 20个常用模拟电路(嵌入式硬件篇)
  16. html5 中英文语言切换,使用 vue-i18n 切换中英文效果
  17. ei检索的cpss_国际检索系统收录我校期刊
  18. Android开发者进退两难的出路;转行还是进阶?转行转什么最好
  19. bootstarp table完成数据渲染之后展示趋势图(echart折线图)
  20. 大数据以及Hadoop相关概念介绍

热门文章

  1. JS 文本框内输入内容添加在页面与删除
  2. 赛效:怎么将PPT转为PDF
  3. 如何选购手机移动电源/充电宝?
  4. vue中用table_Vue中table合并单元格用法
  5. 反恐精英之碧瑶仙子版
  6. (翻译)复仇模式(Revenge)
  7. 《Windows CE 大排档》封面和封底出炉啦!
  8. 修改antd组件,搜索框中图标的样式
  9. python音频转数组_Python生成音乐 之 读取midi转换为数组
  10. 【末日祭典】魔法门英雄无敌III——lanruo