From 54ad2d6d3c8a05ff451e736aab11378f84376465 Mon Sep 17 00:00:00 2001 From: Jack <46790855@qq.com> Date: Wed, 16 Jul 2025 22:22:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0json=20key=20=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=9A=84=E6=96=B9=E6=B3=95=EF=BC=8C=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=91=98=E8=A6=81=E7=AD=BE=E5=90=8D=E9=A1=BA=E5=BA=8F=E5=BC=95?= =?UTF-8?q?=E8=B5=B7=E7=9A=84=E9=AA=8C=E7=AD=BE=E5=A4=B1=E8=B4=A5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../suisung/mall/common/utils/CommonUtil.java | 26 +++++++++++++++++ .../suisung/mall/common/utils/JsonUtil.java | 28 +++++++++++++++++++ .../impl/ShopOrderBaseServiceImpl.java | 6 ++++ 3 files changed, 60 insertions(+) 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