特此声明:以下聊天记录为老师和学员的真实沟通记录,仅用于做典型技术问题分享,敏感信息已打码。VIP学员可以享受永久答疑服务。

2023年2月24日,早上刚到公司,有学员发来问题:有个http接口调不通

问题截图如下:

这个接口是需要签名加密的,现在接口返回code:1,签名验证失败

具体的签名加密方法,是学员自己在beanshell中写的逻辑

  • 分析一:首先怀疑sign字段,接口对于签名字段要求是小写的md5,学员传的是大写的,让学员改成小写试试,结果还是不成功

  • 分析二:对于签名接口,也可能是时间戳不准确,但是学员贴出了获取时间戳的代码,看着也没问题

  • 分析三:接口既然返回了“invaild sign data,有可能是在Jmeter中加密数据出现了错误,按照接口的签名规则,对请求中的参数使用第三方工具进行加密,然后跟Jmeter的加密结果进行对比,结果发现并不一致。说明确实是在Jmeter加密错误。

学员想远程看看,目前问题基本已经定位,应该很快就能解决,暂时不需要远程了,接下来查看学员是如何加密的。

清注意代码中标红的地方,此处调用了自己封装的md5函数,然后想把入参中的phoneNum+testfan字符串+mytime拼接,然后做md5加密。关键是在整个beanshel中,并没有定义phoneNum和mytime这两个Java变量,不过在代码中的这两个地方,分别定义了phoneNum和mytime两个Jmeter变量。

众所周知,在beanshell中变量分成Jmeter变量和Java变量两种形式,Jmeter变量使用vars.get(“变量名”的形式调用。Java变量就是直接定义变量,然后执行使用,如String phoneNum =”123”。

这个学员是把Jmeter变量当成Java变量来用了,所以beanshel就识别不到这两个变量,最后拼接后的数据就是错的,加密后自然也是错的了。

学员自己改了下,把改后的代码发了出来,不过仍然有一些小问题,变量名没加双引号。

加上双引号后,问题彻底得到解决,美好的一天,从帮助别人开始。

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!