背景
在调用接口的时候,需要计算参数的签名值,然后将签名值放在header
里边传输过来,如下:
在使用Apifox
测试接口时,signature
参数就需要动态生成,Apifox
提供了编写脚本进行参数调整等功能,今天尝试研究研究~
解决办法
apifox
提供了请求的前置操作
,可以在前置操作
编写脚本实现功能。
环境
访问地址和请求体
请求头
现在需要做的事情是
- 将请求体的
timestamp
替换成当前时间,因为服务端会对请求有效时间进行验证 - 在替换了
timestamp
后,使用HMACSHA256
签名方式将整个request-body
进行签名 - 在得到签名值
sign
后,替换请求头里边的signature
- 发送数据
脚本代码
注:js语言不是很熟悉,代码也是自己一步步调试了很多回才成功的,代码的质量就不要在意了。
// 1. 拿到全局变量appKey
var appKey = pm.variables.get("appKey")
// 2. 获取请求体
var jsonData = JSON.parse(pm.request.body.raw);
console.log("修改前的body -> ", jsonData)
jsonData.timestamp = Date.parse(new Date()) / 1000;
console.log("修改后的body -> ", jsonData)
pm.request.body.update(JSON.stringify(jsonData, null, 2))
// 3. 签名
try {
const jarResult = pm.execute('confirmation-sdk-1.0.jar', [pm.request.body.raw, appKey]);
console.log('jar运行结果 -> ' + jarResult);
4. // 获取请求头
pm.request.headers.upsert({
key: "signature",
value: jarResult,
});
} catch (e) {
console.error(e.message);
}
-
序号1
appkey
设置在apifox
全局变量里边
-
序号2
- 拿到请求体并转成
Json
结构 - 生成实时
时间戳
并赋值予timestamp
- 更新请求体
- 拿到请求体并转成
-
序号3
- 通过
pm.execute()
的方式调用其他语言编写的程序,这里是java程序 confirmation-sdk-1.0.jar
:程序名称[pm.request.body.raw, appKey]
:参数数组
- 通过
-
序号4
- 将
confirmation-sdk-1.0.jar
得到的签名结果赋值给请求头的signature
- 将
confirmation-sdk-1.0.jar
程序
public static void main(String[] args) {
// 调用签名工具
System.out.println(EncryptUtil.hmacSha256(args[0],args[1]));
}
main
函数中调用签名方法- 将得到签名值输出出来,所有注意输出不要有其他内容
- 如果打包出现
没有主清单
错误,可以调整一下打包的方式
三方程序需要放在apifox
的指定目录,在apifox
左下角有设置
按钮,点击打开后选择外部插件
查看路径,将三方程序放入该路径即可。