签名验证

签名验证

签名方式要求: 将第三方传递过来的参数数据进行字典排序并在前后两端均加上appSecret,得到的字符串进行 md5签名(第三方传递过来的签名sign不进行排序与签名)

单层简易数据方式

请求数据示例:
{
“orderId”: “SS111111111”,
“timestamp”: “1584687954”,
“status”: “7”,
“sign”: “11231asdasda”
}
在数据仅有一个层级时采用此方法即可完成

/**
 * @param businessParam 业务参数Map,使用TreeMap保证有序
 * 如果业务参数有对象传输,请使用Json工具类转换为字符串
 * @param appSecret     分配的appSecret
 */
public static String getSignKey(TreeMap<String, String> treeMap, String appSecret) {
	return md5(getDataStr(treeMap, appSecret));
}
private static String getDataStr(TreeMap<String, String> treeMap, String appSecret) {
	StringBuilder sb = new StringBuilder(appSecret);
	// 按照规则拼成字符串
	for (Map.Entry<String, String> entry : treeMap.entrySet()) {
		if ("sign".equals(entry.getKey())) {
			continue;
		}
		String name = entry.getKey();
		String value = entry.getValue();
		sb.append(name).append(value);
	}
	sb.append(appSecret);
	return sb.toString();
}
private static String md5(String dataStr) {
	return DigestUtils.md5Hex(dataStr);
}

如上述代码所示, 将接收的参数转换为TreeMap类型, 然后直接调用getDataStr方法得到结果

多层级数据方式

请求数据示例:

	{
		totalQuantity:20,
		company: {
			administrator: '',
			department: [{ 
				userId: '' ,
				username: ''
			},{
				userId: '' ,
				username: ''
			}]
		}
	}

在数据多层级时采用此方法即可完成

public static String getSignKey(JSONObject json, String appSecret) {
	String data = JSONObject.toJSONString(json, SerializerFeature.SortField.MapSortField);
	JSONObject jsonObject = JSONObject.parseObject(data,JSONObject.class, Feature.OrderedField);
	StringBuilder sb = new StringBuilder(appSecret);
	for (String str : jsonObject.keySet()){
		if ("sign".equals(str)) {
			continue;
		}
		sb.append(str).append(json.get(str));
	}
	sb.append(appSecret);
	// 按照规则拼成字符串
	return md5(sb.toString());
}
private static String md5(String dataStr) {
	return DigestUtils.md5Hex(dataStr);
}

多层级数据处理方法主要依托于
String data = JSONObject.toJSONString(json, SerializerFeature.SortField.MapSortField);
JSONObject jsonObject = JSONObject.parseObject(data,JSONObject.class, Feature.OrderedField);
这两个排序接口设定, 下面的方法对于简易和复杂两种情况均可以处理, 且传递参数为比较常用的JSONObject,更适用些,具体使用哪种方式可自行选择!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值