jmeter 请求发送加密参数(其中包含Json嵌套)

来源:互联网 发布:网易公开课mac版 编辑:程序博客网 时间:2024/06/07 17:07

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());

这里写图片描述

原创粉丝点击