微信支付一直报fail_invalid signature错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信支付一直报fail_invalid signature错误相关的知识,希望对你有一定的参考价值。

前端代码:

var _data =
"appId":appId,
"timestamp":timestamp,
"nonceStr": nonceStr,
"package": _package,
"signType": signType,
"paySign": paySign
;
WeixinJSBridge.invoke('getBrandWCPayRequest', _data,
function(res)
alert(res.err_msg);

);
后端签名:
/**
* 获取签名的方法
*/
public static String wxSign(Map<String, String> params)
if(params == null)
return null;

if(params.size() == 0)
return "";

ArrayList<String> keys = new ArrayList<String>(params.keySet());
Object[] keysArr = keys.toArray();
Arrays.sort(keysArr);
StringBuilder sb = new StringBuilder();
boolean flag = true;
String value;
for(Object key : keysArr)
value = params.get(key);
if(value != null && value.length() > 0)
sb.append(key+"="+value+"&");


String key = "ASDFWERFASDFASDFASASDF584wcss";
sb.append("key="+ key);
String md5SignValue = MD5.GetMD5Code(sb.toString()).toUpperCase();
System.out.println(sb.toString());
System.out.println(md5SignValue);
return md5SignValue;


/**
* 参与支付签名的字段
*/
Map<String, String> _params = new HashMap<String, String>();
String timestamp = beat.getRequest().getParameter("timestamp");
_params.put("appId", appid);
_params.put("timeStamp", timestamp);//官方文档上说,前端s得小写,后端s大写
_params.put("nonceStr", noncestr);
_params.put("package", "prepay_id="+ prepay_id);
_params.put("signType", "MD5");

String paySign = WXSignUtil.wxSign(_params);

已经被这个问题折磨了两天了,实在是找不出问题在哪了,还请那位高人帮忙看一下,知道一番,小弟感激不尽

这个h5调起方法,坑特别多,不知道你是不是遇到我这样的坑。微信页面不是有js sdk吗,支付页面要是也调用了js sdk,就会报这个鬼错误,还告诉你是签名错误,其实支付那块都没写错。把js sdk去掉,就能支付成功。准确的说,如果下面这块段代码同事存在于一个页面里面,也会报这样的错误。你查查是不是这个问题。在支付页面不要掉js sdk的 接口。把第一段代码去掉,就好了。我的问题就是这个,不知道和你一样不。


js sdk配置代码块:



支付调起代码块:

参考技术A 你的代码应该没问题。曾经我也被这个问题虐了半天,一直提示签名错误,结果原因是“支付授权目录”没把我在测试的那个目录加进去。你看一下你是不是也是这个原因。

进入 微信公众平台 -- 微信支付 -- 开发配置 -- 支付授权目录 把你的路径加进入。
参考技术B 找两行代码:
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
将上面两行中的true改为false
还有一行:curl_setop 改为curl_setopt
是微信支付接口文档自身的问题!
参考技术C 楼主解决了没?我也遇到这个问题,求助!

在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误

 

这是 微信支付-统一下单 接口文档 

 

一、问题描述

在调用统一下单接口时,报mch_id参数格式错误,但商户ID确实是10位数字正确的,可就是一直报这个错误

返回的错误xml如下:

技术图片

 

 

二、排错过程

1、多次对比官网xml格式,确认生成的xml是否有误

2、检查生成的xml是否带有空格、字段是否拼写有误,检查生成的xml是否有缺少或多字符

官方的xml:

技术图片

 

 

 

我开发过程中生成的xml:

技术图片

 

 

对比发现,我生成的xml参数比官方的参数多了CDATA等着字符,但CDATA标签是用于说明数据不被XML解析器解析的,不应该会影响xml的结构。

 

后来发现,就算我把生成的xml参数中的必须的字段从xml中移除,再去调用接口,发现还是返回一样的错误。

考虑过后,我在想:是不是发起请求的代码有误。

于是我尝试修改发起请求的代码,原使用HttpClient发起请求,改为WebRequest,发现接口正确返回数据。

三、错误原因及解决方案

由此我分析错误原因是我在.net core上使用HttpClient发起请求,却没有正确返回,不知怎么还返回了意料之外的错误(异常)

HttpClient示例代码是:

var response = await httpClient.PostAsXmlAsync(url, xml);

 

尝试使用WebRequest之后,接口正常返回数据。

 

使用WebRequest发起请求,示例代码是:

var bytes = (xml== null) ? new byte[0] : Encoding.UTF8.GetBytes(xml);

using (var ms = new MemoryStream())

    ms.Write(bytes, 0, bytes.Length);
    ms.Seek(0, SeekOrigin.Begin);

    var request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";

    .....后续代码省略.....

 

 

目前我先用WebRequest实现代码,至于为什么HttpClient发起请求返回错误,后续查找资料、分析总结。

 

以上是关于微信支付一直报fail_invalid signature错误的主要内容,如果未能解决你的问题,请参考以下文章

微信支付get_brand_wcpay_request:fail

微信支付摔个两次坑

在.net core上,Web网站调用微信支付-统一下单接口(xml传参)一直返回错误:mch_id参数格式错误

微信支付宝支付那点事

微信jssdk支付坑

微信支付v3 统一下单接口 demo