jmeter jsr223 beanshell处理动态生成请求参数签名(例如微信开放api接口签名)

jmeter jsr223 beanshell处理动态生成请求参数签名(例如微信开放api接口签名)

请求签名的方法。

例如c=value1&b=value2  需要先按照字母排序 b=value2&c=value2 算出MD5散列值(可能会加盐,salt key你自己获取)

最终请求时的请求参数为 b=value2&c=value2&sign={md5_string},  注意sign参数的位置也需要重新按照排序。

import java.util.TreeMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import java.util.Arrays;
import java.security.MessageDigest;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.nio.charset.Charset;

long requestTime = System.currentTimeMillis();

// 原始请求参数定义
//key1=value1&key2=&key3=value3    key2 为空将不会被作为签名的字符串并被舍弃请求。 具体请参见接口文档。
// 此处会自动添加sign 参数,sign可以不填或者留空即可。

String originalparametersString = "serviceVersion=1.0&requestTime=1482399798149&sign=&partnerUserId=weishenme&partner=xxxx";

String[] parameters = originalparametersString.split("&");


log.info(originalparametersString);

log.info(String.valueOf(parameters.length));

TreeMap SortedParametersWithoutSign = new TreeMap();


// 将参数按字母排序

for(int i = 0 ; i < parameters.length ; i ++){

   String[] pandvalue  =  parameters[i].split("=");
   log.info(String.valueOf(pandvalue.length));
   if(pandvalue.length>1){
   	  
       String[] values = Arrays.copyOfRange(pandvalue, 1, pandvalue.length);
       log.info(String.valueOf(values.length));
       log.info(values[0]);
       if(!values[0].equals(""))
       SortedParametersWithoutSign.put(pandvalue[0],values[0]);
   }
   else{
     	  //SortedParametersWithoutSign.put(pandvalue[0],null);
   }
	
}

// 根据排序后的参数,组装参数。 

String requestParameters = "";

    Set set = SortedParametersWithoutSign.entrySet();
      Iterator iterator = set.iterator();
      int iterationcount = 0;
      while(iterator.hasNext()) {

      	Map.Entry mentry = (Map.Entry)iterator.next();
      	log.info("key: "+mentry.getKey()+"  ---- must:"+ mentry.getValue()   );

	//	if( mentry.getValue()[0].equals("Y") && !mentry.getKey().equals("sign") ){

              if(iterationcount == 0)
			requestParameters += mentry.getKey()+"="+mentry.getValue();
			else requestParameters += "&"+mentry.getKey()+"="+mentry.getValue();

			iterationcount++;

	//	}
		
      	

      }


log.info(requestParameters);


// 将组装的参数 得到md5 散列串
MessageDigest md = MessageDigest.getInstance("MD5");

Byte[] messageDigest = md.digest((requestParameters+"123456").getBytes(Charset.forName("UTF-8")));

//Byte[] messageDigest = md.digest(requestParameters.getBytes());

BigInteger number = new BigInteger(1, messageDigest);

 String hashtext = number.toString(16);
            // Now we need to zero pad it if you actually want the full 32 chars.
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }

log.info(hashtext);

//String[] input = {"Y",""};
//input[1] = hashtext;



// 加入sign的参数,重新生成 请求的参数。 
SortedParametersWithoutSign.put("sign",hashtext);




// 重新拿到最新的请求数据
 requestParameters = "";

     set = SortedParametersWithoutSign.entrySet();
       iterator = set.iterator();
       iterationcount = 0;
      while(iterator.hasNext()) {

      	Map.Entry mentry = (Map.Entry)iterator.next();
      	log.info("key: "+mentry.getKey()+"  ---- must:"+ mentry.getValue()  );

	//	if( mentry.getValue()[0].equals("Y")  ){

              if(iterationcount == 0)
			requestParameters += mentry.getKey()+"="+mentry.getValue();
			else requestParameters += "&"+mentry.getKey()+"="+mentry.getValue();

			iterationcount++;

	//	}

      }



log.info(requestParameters);

vars.put("requestParameters",requestParameters);

此篇文章已被阅读4142 次

Add a Comment

邮箱地址不会被公开。 必填项已用*标注