2022年9月23日更新,这个问题终于找到了原因:暂时发现以下几种原因都会导致验证失败:
1、python的使用json.dumps()转换为json字符格式后,逗号、冒号后面默认是会有一个空格的,这时候如果在jmeter请求中没有补上空格,那么就会导致验签失败。
可以通过入参去掉空格:
import json
data = {'token':'e5dads5 3455s2','verify':True,'content':'中文'}
data_json = json.dumps(data,separators=(',',':')) # 将,:后面的空格去掉
print(data_json)
#输出:{"token":"e5dads5 3455s2","verify":true,"content":"\u4e2d\u6587"}
补上空格后,验签通过,接口下单成功:
(建议直接把格式化后的参数传给接口使用)
2、beanshell(java)脚本中,拼接的参数是无序存放的,最后post请求传请求参数的时候,一定要按照这个拼接后的顺序去传参,不然就会报无效的签名。
3、字符串中含有中文,编码方式不一致时,也可能导致签名验证失败,给含中文的字符串加上编码方式。(详见https://www.cnblogs.com/eagleking/p/16047927.html)
String body = URLEncoder.encode(bodyin, "utf-8"); //参数bodyin增加编码方式,避免因为字符串含中文而验签失败
问题描述:需要调用python的脚本对请求头里的一个签名字符串进行MD5加密,不管是使用【OS进程取样器】还是使用【Beanshell取样器】调用python程序,而且也尝试过了通过jmeter生成时间戳和python脚本生成时间戳,但最后接口请求的时候都包签名失败,调试几天都没查出原因所在。如下图所示:
解决方案:弃用调用python脚本进行md5加密的情况,直接使用jmeter内置脚本digest函数进行md5加密。可以查看本人写的另一帖子:Jmeter内置函数使用之调用摘要函数(digest)进行加密_Jarthong的博客-CSDN博客
另外:调用python脚本进行非对称加密在传回给jmeter接口,在http请求不需要请求头时,是正常可以用的。