脚本开发工具:idea64(压测工具为甲方采购的第三方压测工具,脚本基本idea64编辑器调试,基于sacla语言开发)
具体接口文档和加密方案可见上文,以下为基于sacla语言开发的脚本以及相关注释:
/*
* 导入需要的包
* */
package scripts
import scala.concurrent.duration._
import io.gatling.app.Script
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import java.text.SimpleDateFormat
import java.util.Date
import java.util.UUID
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.security.MessageDigest
class 百望_认证抵扣申请 extends Script {
val httpConfig = http
.baseURL("http://****:31004")
.acceptHeader("text/html,application/xhtml+xml,application/xmlq=0.9,image/webp,image/apng,*/*q=0.8")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("zh-CN,zhq=0.9")
.upgradeInsecureRequestsHeader("1")
.userAgentHeader("Mozilla/5.0 (Windows NT 6.1 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")
val headers_0 = Map(
"accept"->"*/*",
"Cache-Control" -> "no-cache",
"Content-Type" -> "application/json;charset=UTF-8"
)
/*
* MD5加密,基于HMC-SHA1算法加密要调用MD5加密方法来实现
* */
var hexDigits = Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
def getMD5Encode(key:Array[Byte]): String={
val md5 = MessageDigest.getInstance("MD5")//获取MD5实例
val result:Array[Byte] = md5.digest(key)//此处得到的是md5加密后的byte类型值
val sb = new StringBuffer(32)
var i = 0
// while 循环执行
while (i< result.length){
// 一个字节对应两个字符
val x:Byte = result(i)
// 取得高位
val h = 0x0f & (x >>> 4)
// 取得低位
val l = 0x0f & x
sb.append(hexDigits(h)).append(hexDigits(l))
i+=1
}
return sb.toString()
}
/*
* AccessKeySecret基于HMC-SHA1算法加密
* */
def getSignature(data:String,key:String):String={
val signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1")
val mac = Mac.getInstance("HmacSHA1")//应付漏洞检查
mac.init(signingKey)
val rawHmac = mac.doFinal(data.getBytes())
return getMD5Encode(rawHmac)
}
val init = exec()
val action = group("百望")(
exec(session=>{
val uuid = UUID.randomUUID().toString().replaceAll("-", "")//获取uuid函数值
val date=new Date()
val dateTimeFormat: SimpleDateFormat =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
val TimeStamp = dateTimeFormat.format(date)
val rawStr = "AccessKeyID=inter&SignatureNonce="+uuid+ "&TimeStamp="+TimeStamp //拼接需要加密的报文
val pass="123456"
val sign = getSignature(rawStr,pass)//调用HMC-SHA1算法加密方法,获取值返回给sign字段
/*
*对各入参函数重新赋值
* */
session
.set("SignatureNonce",uuid) //是否已被占用,被占用则提示:004
.set("TimeStamp",TimeStamp) //不能和本系统时间差异不能超过5分钟,否则提示错误:003
.set("Signature",sign)
})
/*
*接口调用action主体
* */
.group("认证抵扣申请接口")(
exec(
http("request_0")
.get("/scm/rest/api/nocheckDeductible?AccessKeyID=inter&SignatureNonce=${SignatureNonce}&TimeStamp=${TimeStamp}&Signature=${Signature}")
.headers(headers_0)
.body(StringBody("""{"TaxNo":"91310000766940223R","Version":"1.0","AccessKeyID":"inter","Period":"201811","InvoiceList":[{"CertificationType":"1","InvoiceCode":"1100182130","InvoiceNumber":"41362168","PurchaserTaxNo":"91310000766940223R"}]}"""))
.check(substring(""""Message":"执行成功"""").exists)
)
)
)
setUp(
scenario("百望_认证抵扣申请")
.exec(
exitBlockOnFail(init).exitHereIfFailed,
exitBlockOnFail(action)
)
.inject(atOnceUsers(1))
.protocols(httpConfig)
).maxDuration(1 minutes)
}