jmeter 请求发送加密参数(其中包含Json嵌套)
某个接口的请求参数非常多,并且接口请求要求有MD5签名校验;签名的方式为在Headers或是请求中包含一个sign参数,该参数值通过对URL、Method、Body的拼接字符串进行MD5计算后得到。
- 验签的方法实现
- 请求参数的组装加密生成signature,var.put生成signature,供Sample使用
验签的方法实现
代码块
建立BeanShell PreProcessor,例如:
“` java
import java.util.Map;
import org.open.sdk.java.common.Constants;
import org.open.sdk.java.common.enums.OpenSdkSupportHttpMethod;
import org.open.sdk.java.exception.OpenSdkException;
import org.open.sdk.java.http.client.OpenPlatformClient;
import org.open.sdk.java.tools.CommonUtils;
import org.open.sdk.java.tools.SignatureUtils;
import org.open.sdk.java.tools.MyStringUtil;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.Date;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
String secret = “${appKey}”;
Map params = new HashMap();
params.put(“appId”, “
appId”);params.put(“sourceNo”,“
{sourceNo}”);
params.put(“scope”, “ACCESSTOKEN”);
params.put(“timestamp”, “${timestamp}”);
params.put(“channel”, “H5”);
// 先将参数以其参数名的字典序升序进行排序
Map sortedParams = new TreeMap(params);
Set entrys = sortedParams.entrySet();
// 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起
StringBuilder basestring = new StringBuilder();
Iterator it = entrys.iterator();
while(it.hasNext()){
Entry param = (Entry) it.next();
String key = (String)param.getKey();
String value = (String)param.getValue();
if(MyStringUtil.isEmpty(value)){
value = "";
}
basestring.append(key).append("=").append(value);
}
basestring.append(secret);
// 使用MD5对待签名串求签
byte[] bytes = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
bytes = md5.digest(basestring.toString().getBytes("UTF-8"));
} catch (GeneralSecurityException ex) {
throw new IOException(ex);
}
// 将MD5输出的二进制结果转换为小写的十六进制
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex);
}
vars.put(“signature”, sign.toString());
脚注
其实加密方法不需要自己写,使用开发封装完成的方法直接调用即可,但是为了直观明了,自己板门弄虎的重写了一次。
请求参数的组装加密生成signature,var.put生成signature,供Sample使用,其中请求参数包含List参数
代码块
import java.util.Map;
import org.open.sdk.java.common.Constants;
import org.open.sdk.java.common.enums.OpenSdkSupportHttpMethod;
import org.open.sdk.java.exception.OpenSdkException;
import org.open.sdk.java.http.client.OpenPlatformClient;
import org.open.sdk.java.tools.CommonUtils;
import org.open.sdk.java.tools.SignatureUtils;
import org.open.sdk.java.tools.MyStringUtil;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.Date;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
JSONObject jsonObject = new JSONObject();
List list = new ArrayList();
HashMap map1 = new HashMap();
map1.put("outRepaymentPlanNo", "${outRepaymentPlanNo1}");
map1.put("payableFee","36000");
map1.put("payableInterest","100000");
map1.put("payableLateFee","36000");
map1.put("payableFee","0");
map1.put("payableManagementFee","72000");
map1.put("payablePenalty","0");
map1.put("payablePrincipal","6000000");
map1.put("payableServiceFee","36000");
map1.put("payableTotal","6244000");
map1.put("period",1);
map1.put("preIouDate","2017-08-18 11:00:30");
HashMap map2 = new HashMap();
map2.put("outRepaymentPlanNo","${outRepaymentPlanNo2}");
map2.put("payableFee","0");
map2.put("payableInterest","100000");
map2.put("payableLateFee","0");
map2.put("payableFee","0");
map2.put("payableManagementFee","0");
map2.put("payablePenalty","0");
map2.put("payablePrincipal","6000000");
map2.put("payableServiceFee","0");
map2.put("payableTotal","6100000");
map2.put("period","2");
map2.put("preIouDate","2017-08-18 11:00:30");
String param1= JSON.toJSONString(map1);
System.out.println("---param1----" + param1);
String param2= JSON.toJSONString(map1);
System.out.println("---param2----" + param2);
list.add(map1);
list.add(map2);
jsonObject.put("list", list);
System.out.println(jsonObject);
//log.info("\n\n===============获取的变量param1为" + param1);
//log.info("\n\n===============获取的变量param2为" + param2);
//log.info("\n\n===============获取的变量jsonObject为" + jsonObject);
String jsonplans=JSON.toJSONString(jsonObject);
log.info("\n\n===============获取的变量jsonplans为" + jsonplans);
vars.put("repaymentPlanList", jsonplans);
String secret = "${appKey}";
Map params = new HashMap();
params.put("appId", "${appId}");
params.put("sourceNo", "1000300003");
params.put("timestamp", "20170818110035");
params.put("accessToken", "${accessToken}");
params.put("feeRate", "30");
params.put("frontNotifyUrl", "http://payex.aiyoumi.com");
params.put("latePenaltyRate", "0");
params.put("loanAmount", "12000000");
params.put("loanApplyNo", "2017081816391160");
params.put("loanProductNo", "TF01");
params.put("loanRate", "1000");
params.put("managementFeeRate", "60");
params.put("maturityDate", "2017-08-18 11:00:33");
params.put("merchantNo", "1000300003");
params.put("notifyUrl", "http://payex.aiyoumi.com");
params.put("outCustomerId", "18686868888");
params.put("outCustomerName", "周一");
params.put("paymentDayPerMonth", "05");
params.put("penaltyRate", "100");
params.put("repaymentMode", "2");
params.put("repaymentPhase", "2");
params.put("serviceFeeRate", "30");
params.put("loanSerialNo", "2017081816391160");
params.put("loanTimeLimit", "365");
params.put("repayInterestAmt", "200000");
params.put("repayManagementFee", "72000");
params.put("repayPrincipalAmt", "12000000");
params.put("repayServiceFee", "36000");
params.put("repayTotalAmt", "12344000");
params.put("certificateNo", "15010319850602176X");
params.put("fee", "36000");
params.put("account", "666611777777777777");
params.put("accountName", "周一");
params.put("applyTime", "2017-08-18 11:00:31");
params.put("bankCode", "ABC");
params.put("bankName", "中国农业银行");
params.put("bankOfAccount", "深圳分行");
params.put("certificateType", "1");
params.put("discountAmt", "0");
params.put("endTime", "2017-08-18 11:00:32");
params.put("loanMode", "1");
params.put("loanProductName", "粤科1号");
params.put("mobile", "18686868888");
params.put("startTime", "2017-08-18 11:00:34");
params.put("urlKey", "loan_signed");
params.put("repaymentPlanList", jsonplans);//获取List对象
// 先将参数以其参数名的字典序升序进行排序
Map sortedParams = new TreeMap(params);
Set entrys = sortedParams.entrySet();
// 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起
StringBuilder basestring = new StringBuilder();
Iterator it = entrys.iterator();
while(it.hasNext()){
Entry param = (Entry) it.next();
String key = (String)param.getKey();
String value = (String)param.getValue();
if(MyStringUtil.isEmpty(value)){
value = "";
}
log.info("---验签的参数----" + param);
basestring.append(key).append("=").append(value);
}
basestring.append(secret);
// 使用MD5对待签名串求签
byte[] bytes = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
bytes = md5.digest(basestring.toString().getBytes("UTF-8"));
} catch (GeneralSecurityException ex) {
throw new IOException(ex);
}
// 将MD5输出的二进制结果转换为小写的十六进制
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex);
}
vars.put("loansignature", sign.toString());