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

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

这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值