|
|
@@ -0,0 +1,225 @@
|
|
|
+package com.fs.hospital580.util;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.SortedMap;
|
|
|
+import java.util.TreeMap;
|
|
|
+
|
|
|
+/**
|
|
|
+ * ClassName: ObjectApiSignUtil<br/>
|
|
|
+ * Function: 签名<br/>
|
|
|
+ * Date: 2019-08-21 14:20<br/>
|
|
|
+ *
|
|
|
+ * @author km
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+public class ObjectApiSignUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据对应请求参数与对应serverCode获取secretKey进行签名并返回。
|
|
|
+ * 对signature参数不做签名
|
|
|
+ *
|
|
|
+ * @param paramMaps 参数
|
|
|
+ * @param secretKey clientId的secret
|
|
|
+ * @return 加密结果
|
|
|
+ */
|
|
|
+ public static String getSign(Map<String, Object> paramMaps, String secretKey) {
|
|
|
+ //按照自然排序
|
|
|
+ SortedMap<String, Object> sortedMap = new TreeMap<>(paramMaps);
|
|
|
+ String signString = ObjectApiSignUtil.getUrlSortParamsByMap(sortedMap);
|
|
|
+ signString += secretKey;
|
|
|
+ log.info("签名字符串为:{}", signString);
|
|
|
+ return MD5Util.MD5Encode(signString, "UTF-8").toUpperCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据对应请求参数与对应serverCode获取secretKey进行签名并返回。
|
|
|
+ * 对signature参数不做签名
|
|
|
+ *
|
|
|
+ * @param object 参数
|
|
|
+ * @param secretKey clientId的secretKey
|
|
|
+ * @return 加密结果
|
|
|
+ */
|
|
|
+ public static String getSign(Object object, String secretKey) {
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ Map<String, Object> map = mapper.convertValue(object, new TypeReference<Map<String, Object>>() {
|
|
|
+ });
|
|
|
+
|
|
|
+ // 按照自然排序
|
|
|
+ SortedMap<String, Object> sortedMap = new TreeMap<>(map);
|
|
|
+ String signString = ObjectApiSignUtil.getUrlSortParamsByMap(sortedMap);
|
|
|
+ signString += secretKey;
|
|
|
+ log.info("签名字符串为:{}", signString);
|
|
|
+ return MD5Util.MD5Encode(signString, "UTF-8").toUpperCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对map排序(key-value格式)
|
|
|
+ *
|
|
|
+ * @param map 入参
|
|
|
+ * @return 排序后的结果
|
|
|
+ */
|
|
|
+ public static String getUrlSortParamsByMap(Map<String, Object> map) {
|
|
|
+ if (map == null) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 定义拼接对象
|
|
|
+ StringBuilder stringBuffer = new StringBuilder();
|
|
|
+ SortedMap<String, Object> sortedMap = new TreeMap<>(map); // 对Map做排序处理
|
|
|
+
|
|
|
+ // 遍历Map对象
|
|
|
+ for (Map.Entry<String, Object> entry : sortedMap.entrySet()) {
|
|
|
+ // 获取key
|
|
|
+ String key = entry.getKey();
|
|
|
+
|
|
|
+ // sign字段不参与签名
|
|
|
+ if ("sign".equals(key)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取加密对象
|
|
|
+ Object value = entry.getValue();
|
|
|
+
|
|
|
+ // 如果加密对象是空,或者空字符串,则不作加密
|
|
|
+ if (null == value || "".equals(value)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果加密对象是数组,则调用数组排序方法
|
|
|
+ if (value instanceof Object[]) {
|
|
|
+ Object[] objects = (Object[]) value;
|
|
|
+ stringBuffer.append(key).append("=")
|
|
|
+ .append(ObjectApiSignUtil.getSignStringByList(Arrays.asList(objects))).append("&");
|
|
|
+ } else if (value instanceof List) {
|
|
|
+ // 如果加密对象是列表,则调用列表排序方法
|
|
|
+ stringBuffer.append(key).append("=")
|
|
|
+ .append(ObjectApiSignUtil.getSignStringByList((List) value)).append("&");
|
|
|
+ } else if (value instanceof Map) {
|
|
|
+ // 如果加密对象是Map,则递归当前方法
|
|
|
+ stringBuffer.append(key).append("=")
|
|
|
+ .append(ObjectApiSignUtil.getSignStringByMap((Map) value)).append("&");
|
|
|
+ } else {
|
|
|
+ // 否则直接拼接对象转字符串值
|
|
|
+ stringBuffer.append(key).append("=").append(value.toString()).append("&");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ stringBuffer.append("key=");
|
|
|
+ return stringBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对map排序
|
|
|
+ *
|
|
|
+ * @param map 入参
|
|
|
+ * @return 排序后的结果
|
|
|
+ */
|
|
|
+ public static String getSignStringByMap(Map<String, Object> map) {
|
|
|
+ if (map == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 定义拼接对象
|
|
|
+ StringBuilder stringBuffer = new StringBuilder();
|
|
|
+ stringBuffer.append("{");
|
|
|
+ SortedMap<String, Object> sortedMap = new TreeMap<>(map); // 对Map做排序处理
|
|
|
+
|
|
|
+ // 遍历Map对象
|
|
|
+ for (Map.Entry<String, Object> entry : sortedMap.entrySet()) {
|
|
|
+ // 获取key
|
|
|
+ String key = entry.getKey();
|
|
|
+
|
|
|
+ // 获取加密对象
|
|
|
+ Object value = entry.getValue();
|
|
|
+
|
|
|
+ // 如果加密对象是空,或者空字符串,则不作加密
|
|
|
+ if (null == value || "".equals(value)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果加密对象是数组,则调用数组排序方法
|
|
|
+ if (value instanceof Object[]) {
|
|
|
+ Object[] objects = (Object[]) value;
|
|
|
+ stringBuffer.append(key).append(":")
|
|
|
+ .append(ObjectApiSignUtil.getSignStringByList(Arrays.asList(objects))).append(",");
|
|
|
+ } else if (value instanceof List) {
|
|
|
+ // 如果加密对象是列表,则调用列表排序方法
|
|
|
+ stringBuffer.append(key).append(":")
|
|
|
+ .append(ObjectApiSignUtil.getSignStringByList((List) value)).append(",");
|
|
|
+ } else if (value instanceof Map) {
|
|
|
+ // 如果加密对象是Map,则递归当前方法
|
|
|
+ stringBuffer.append(key).append(":")
|
|
|
+ .append(ObjectApiSignUtil.getSignStringByMap((Map) value)).append(",");
|
|
|
+ } else {
|
|
|
+ // 否则直接拼接对象转字符串值
|
|
|
+ stringBuffer.append(key).append(":").append(value.toString()).append(",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 移除最后一个逗号
|
|
|
+ if (stringBuffer.length() > 1) {
|
|
|
+ stringBuffer.deleteCharAt(stringBuffer.length() - 1);
|
|
|
+ }
|
|
|
+ stringBuffer.append("}");
|
|
|
+
|
|
|
+ return stringBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对list排序
|
|
|
+ *
|
|
|
+ * @param list 列表
|
|
|
+ * @return 排序后的结果
|
|
|
+ */
|
|
|
+ public static String getSignStringByList(List list) {
|
|
|
+ // 如果列表为空,则直接返回
|
|
|
+ if (null == list) {
|
|
|
+ return null;
|
|
|
+ } else if (list.isEmpty()) {
|
|
|
+ // 如果列表长度为0,则返回空长度字符串
|
|
|
+ return "[]";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 定义拼接对象
|
|
|
+ StringBuilder stringBuffer = new StringBuilder();
|
|
|
+ stringBuffer.append("[");
|
|
|
+
|
|
|
+ // 遍历处理列表
|
|
|
+ for (Object object : list) {
|
|
|
+ // 如果对象是空,或者空字符串,则跳过
|
|
|
+ if (null == object || "".equals(object)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果加密对象是数组,则调用数组排序方法
|
|
|
+ if (object instanceof Object[]) {
|
|
|
+ Object[] objects = (Object[]) object;
|
|
|
+ stringBuffer.append(ObjectApiSignUtil.getSignStringByList(Arrays.asList(objects))).append(",");
|
|
|
+ } else if (object instanceof List) {
|
|
|
+ // 如果加密对象是列表,则递归当前方法
|
|
|
+ stringBuffer.append(ObjectApiSignUtil.getSignStringByList((List) object)).append(",");
|
|
|
+ } else if (object instanceof Map) {
|
|
|
+ // 如果加密对象是Map,则调用Map排序方法
|
|
|
+ stringBuffer.append(ObjectApiSignUtil.getSignStringByMap((Map) object)).append(",");
|
|
|
+ } else {
|
|
|
+ // 否则直接拼接对象转字符串值
|
|
|
+ stringBuffer.append(object.toString()).append(",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 移除最后一个逗号
|
|
|
+ if (stringBuffer.length() > 1) {
|
|
|
+ stringBuffer.deleteCharAt(stringBuffer.length() - 1);
|
|
|
+ }
|
|
|
+ stringBuffer.append("]");
|
|
|
+
|
|
|
+ return stringBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|