public static String signTopRequest(RequestParametersHolder requestHolder, String secret)
			throws IOException {
		// 第一步：把字典按Key的字母顺序排序
		Map<String, String> sortedParams = new TreeMap<String, String>();
		TaobaoHashMap appParams = requestHolder.getApplicationParams();
		if(appParams != null && appParams.size() > 0){
			sortedParams.putAll(appParams);
		}
		TaobaoHashMap protocalMustParams = requestHolder.getProtocalMustParams();
		if(protocalMustParams != null && protocalMustParams.size() > 0){
			sortedParams.putAll(protocalMustParams);
		}
		TaobaoHashMap protocalOptParams = requestHolder.getProtocalOptParams();
		if(protocalOptParams != null && protocalOptParams.size() > 0){
			sortedParams.putAll(protocalOptParams);
		}
		
		Set<Entry<String, String>> paramSet = sortedParams.entrySet();

		// 第二步：把所有参数名和参数值串在一起
		StringBuilder query = new StringBuilder(secret);
		for (Entry<String, String> param : paramSet) {
			if (StringUtils.areNotEmpty(param.getKey(), param.getValue())) {
				query.append(param.getKey()).append(param.getValue());
			}
		}

		// 第三步：使用MD5加密
		byte[] bytes = encryptMD5(query.toString());

		// 第四步：把二进制转化为大写的十六进制
		return byte2hex(bytes);
	}