From c1d20b425b10e8ba59f102dd1ab413055883eed0 Mon Sep 17 00:00:00 2001
From: 彭雪彬 <1724387007@qq.com>
Date: Mon, 14 Jul 2025 16:57:11 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/xin' into pxb

---
 oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java |   96 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java b/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java
new file mode 100644
index 0000000..1bb9545
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/hwc/utils/SignUtil.java
@@ -0,0 +1,96 @@
+package com.oying.modules.hwc.utils;
+
+import com.oying.exception.BadRequestException;
+import com.oying.modules.security.config.SwiftPassProperties;
+import com.oying.utils.enums.PayTypeEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+/**
+ * @author zeming.fan@swiftpass.cn
+ */
+@Slf4j
+public class SignUtil {
+
+    /**
+     * 请求时根据不同签名方式去生成不同的sign
+     */
+    public static String getSign(String signType, String preStr, SwiftPassProperties properties, PayTypeEnum status) {
+        if ("RSA_1_256".equals(signType)) {
+            try {
+                return SignUtil.sign(preStr, "RSA_1_256", properties.getMchPrivateKey());
+            } catch (Exception e1) {
+                log.error(e1.getMessage(), e1);
+                throw new BadRequestException(e1.getMessage());
+            }
+        } else {
+            switch (status) {
+                case HWC:
+                    return MD5.sign(preStr, "&key=" + properties.getKey(), "utf-8");
+                case HWC2:
+                    return MD5.sign(preStr, "&key=" + properties.getKey2(), "utf-8");
+            }
+            throw new BadRequestException("汇旺财类型错误");
+        }
+    }
+
+    /**
+     * 对返回参数的验证签名
+     */
+    public static boolean verifySign(String sign, String signType, Map<String, String> resultMap, SwiftPassProperties properties, PayTypeEnum status) throws Exception {
+        if ("RSA_1_256".equals(signType)) {
+            Map<String, String> params = SignUtils.paraFilter(resultMap);
+            StringBuilder builder = new StringBuilder((params.size() + 1) * 10);
+            SignUtils.buildPayParams(builder, params, false);
+            String preStr = builder.toString();
+            return !SignUtil.verifySign(preStr, sign, "RSA_1_256", properties.getPlatPublicKey());
+        } else if ("MD5".equals(signType)) {
+            switch (status) {
+                case HWC:
+                    return !SignUtils.checkParam(resultMap, properties.getKey());
+                case HWC2:
+                    return !SignUtils.checkParam(resultMap, properties.getKey2());
+            }
+            throw new BadRequestException("汇旺财类型错误");
+        }
+        return true;
+    }
+
+    /**
+     * RSA_1_256 验证签名
+     */
+    public static boolean verifySign(String preStr, String sign, String signType, String platPublicKey) throws Exception {
+        // 调用这个函数前需要先判断是MD5还是RSA
+        // 商户的验签函数要同时支持MD5和RSA
+        RSAUtil.SignatureSuite suite;
+        if ("RSA_1_1".equals(signType)) {
+            suite = RSAUtil.SignatureSuite.SHA1;
+        } else if ("RSA_1_256".equals(signType)) {
+            suite = RSAUtil.SignatureSuite.SHA256;
+        } else {
+            throw new Exception("不支持的签名方式");
+        }
+        return RSAUtil.verifySign(suite, preStr.getBytes(StandardCharsets.UTF_8), Base64.decodeBase64(sign.getBytes(StandardCharsets.UTF_8)),
+                platPublicKey);
+    }
+
+    /**
+     * RSA_1_256生成不同的sign
+     */
+    public static String sign(String preStr, String signType, String mchPrivateKey) throws Exception {
+        RSAUtil.SignatureSuite suite;
+        if ("RSA_1_1".equals(signType)) {
+            suite = RSAUtil.SignatureSuite.SHA1;
+        } else if ("RSA_1_256".equals(signType)) {
+            suite = RSAUtil.SignatureSuite.SHA256;
+        } else {
+            throw new Exception("不支持的签名方式");
+        }
+        byte[] signBuf = RSAUtil.sign(suite, preStr.getBytes(StandardCharsets.UTF_8),
+                mchPrivateKey);
+        return new String(Base64.encodeBase64(signBuf), StandardCharsets.UTF_8);
+    }
+}

--
Gitblit v1.9.3