diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java index 2fb4341e..abc0c811 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/CommonUtil.java @@ -2,6 +2,7 @@ package com.suisung.mall.common.utils; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import com.suisung.mall.common.api.StateCode; import com.suisung.mall.common.exception.ApiException; import org.apache.commons.codec.binary.Base64; @@ -290,6 +291,18 @@ public class CommonUtil { } } + /** + * 生成 md 摘要通用签名(参考了顺丰同城的做法) + * + * @param postData JSON 对象的 key 做了排序 + * @param appId + * @param appKey + * @return + */ + public static String generateOpenSign(JSONObject postData, String appId, String appKey) { + return generateOpenSign(JsonUtil.sortJsonObjectByKeyAsc(postData).toString(), appId, appKey); + } + /** * 验证MD5摘要签名 * @@ -314,6 +327,19 @@ public class CommonUtil { return sign.equals(sn); } + /** + * 验证MD5摘要签名 + * + * @param sign + * @param postData JSON 对象的 key 做了排序 + * @param appId + * @param appKey + * @return + */ + public static boolean checkOpenSign(String sign, JSONObject postData, String appId, String appKey) { + return checkOpenSign(sign, JsonUtil.sortJsonObjectByKeyAsc(postData).toString(), appId, appKey); + } + /** * 检查分账比例的数值是否在 0.00-100.00 范围内 * diff --git a/mall-common/src/main/java/com/suisung/mall/common/utils/JsonUtil.java b/mall-common/src/main/java/com/suisung/mall/common/utils/JsonUtil.java index 350102fc..3a99298d 100644 --- a/mall-common/src/main/java/com/suisung/mall/common/utils/JsonUtil.java +++ b/mall-common/src/main/java/com/suisung/mall/common/utils/JsonUtil.java @@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.List; +import java.util.TreeMap; /** * json转换工具类 @@ -106,4 +107,31 @@ public class JsonUtil { } } } + + /** + * 高性能JSONObject按key升序排序(asc) + * 利用TreeMap天然有序特性,减少中间集合操作 + */ + public static JSONObject sortJsonObjectByKeyAsc(JSONObject jsonObject) { + if (jsonObject == null || jsonObject.isEmpty()) { + return new JSONObject(); + } + + // 直接转换为TreeMap(自动按key升序),减少中间集合创建 + TreeMap sortedMap = new TreeMap<>(jsonObject); + + // 直接基于有序Map构造JSONObject(Hutool支持Map构造) + return new JSONObject(sortedMap); + } + + + public static void main(String[] args) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("b", "2"); + jsonObject.put("a", "1"); + jsonObject.put("c", "3"); + jsonObject.put("a", "2"); + jsonObject.put("A", "1"); + System.out.println(sortJsonObjectByKeyAsc(jsonObject)); + } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java index e5a68596..5a153267 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/order/service/impl/ShopOrderBaseServiceImpl.java @@ -8613,6 +8613,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl