jmeter jsr223 beanshell处理动态生成请求参数签名(例如微信开放api接口签名)
Posted On 2017年1月12日
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 次