Selaa lähdekoodia

支付请求升级

ZhangWenQiang 3 vuotta sitten
vanhempi
commit
e869940260

+ 138 - 0
happy-cloud-wisdom/happy-cloud-wisdom-biz/src/main/java/org/jeecg/common/zhutils/DCCryptor.java

@@ -0,0 +1,138 @@
+package org.jeecg.common.zhutils;
+
+import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
+import java.util.Enumeration;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.bouncycastle.asn1.ASN1EncodableVector;
+import org.bouncycastle.asn1.ASN1InputStream;
+import org.bouncycastle.asn1.ASN1Integer;
+import org.bouncycastle.asn1.ASN1Sequence;
+import org.bouncycastle.asn1.DERSequence;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.bouncycastle.crypto.params.ParametersWithID;
+import org.bouncycastle.crypto.signers.SM2Signer;
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.bouncycastle.math.ec.ECPoint;
+
+/**
+ * CBC加密
+ */
+public class DCCryptor {
+
+    public static byte[] CMBSM4EncryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4EncryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 1);
+    }
+
+    public static byte[] CMBSM4DecryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4DecryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 2);
+    }
+
+    public static byte[] CMBSM2SignWithSM3(byte[] id, byte privkey[], byte msg[]) throws Exception {
+        if (privkey == null || msg == null) {
+            throw new Exception("CMBSM2SignWithSM3 input error");
+        }
+        ECPrivateKeyParameters privateKey = encodePrivateKey(privkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(privateKey, id);
+        signer.init(true, parameters);
+        signer.update(msg, 0, msg.length);
+        return decodeDERSignature(signer.generateSignature());
+    }
+
+    public static boolean CMBSM2VerifyWithSM3(byte[] id, byte pubkey[], byte msg[], byte signature[]) throws Exception {
+
+        if (pubkey == null || msg == null || signature == null) {
+            throw new Exception("CMBSM2VerifyWithSM3 input error");
+        }
+        ECPublicKeyParameters publicKey = encodePublicKey(pubkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(publicKey, id);
+        signer.init(false, parameters);
+        signer.update(msg, 0, msg.length);
+        return signer.verifySignature(encodeDERSignature(signature));
+    }
+
+    private static byte[] CMBSM4Crypt(byte key[], byte iv[], byte input[], int mode) throws Exception {
+        SecretKeySpec spec = new SecretKeySpec(key, "SM4");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME);
+        cipher.init(mode, spec, ivParameterSpec);
+        return cipher.doFinal(input);
+    }
+
+    private static ECPrivateKeyParameters encodePrivateKey(byte[] value) {
+        BigInteger d = new BigInteger(1, value);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPrivateKeyParameters(d, ecParameters);
+    }
+
+    public static ECPublicKeyParameters encodePublicKey(byte[] value) {
+        byte[] x = new byte[32];
+        byte[] y = new byte[32];
+        System.arraycopy(value, 1, x, 0, 32);
+        System.arraycopy(value, 33, y, 0, 32);
+        BigInteger X = new BigInteger(1, x);
+        BigInteger Y = new BigInteger(1, y);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECPoint Q = spec.getCurve().createPoint(X, Y);
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPublicKeyParameters(Q, ecParameters);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static byte[] decodeDERSignature(byte[] signature) throws Exception {
+        ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature));
+        ASN1Sequence primitive = (ASN1Sequence) stream.readObject();
+        Enumeration<ASN1Integer> enumeration = primitive.getObjects();
+        BigInteger R = enumeration.nextElement().getValue();
+        BigInteger S = enumeration.nextElement().getValue();
+        byte[] bytes = new byte[64];
+        byte[] r = format(R.toByteArray());
+        byte[] s = format(S.toByteArray());
+        System.arraycopy(r, 0, bytes, 0, 32);
+        System.arraycopy(s, 0, bytes, 32, 32);
+        return bytes;
+    }
+
+    private static byte[] encodeDERSignature(byte[] signature) throws Exception {
+        byte[] r = new byte[32];
+        byte[] s = new byte[32];
+        System.arraycopy(signature, 0, r, 0, 32);
+        System.arraycopy(signature, 32, s, 0, 32);
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(new ASN1Integer(new BigInteger(1, r)));
+        vector.add(new ASN1Integer(new BigInteger(1, s)));
+        return (new DERSequence(vector)).getEncoded();
+    }
+
+    private static byte[] format(byte[] value) {
+        if (value.length == 32) {
+            return value;
+        } else {
+            byte[] bytes = new byte[32];
+            if (value.length > 32) {
+                System.arraycopy(value, value.length - 32, bytes, 0, 32);
+            } else {
+                System.arraycopy(value, 0, bytes, 32 - value.length, value.length);
+            }
+            return bytes;
+        }
+    }
+
+}

+ 179 - 0
happy-cloud-wisdom/happy-cloud-wisdom-biz/src/main/java/org/jeecg/common/zhutils/DCHelper.java

@@ -0,0 +1,179 @@
+package org.jeecg.common.zhutils;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyStore;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 工具类
+ */
+public class DCHelper {
+
+    /**
+     * 序列化json
+     *
+     * @param json
+     * @return
+     * @throws Exception
+     */
+    public static String serialJsonOrdered(JSONObject json) throws Exception {
+        StringBuilder appender = new StringBuilder();
+        appender.append("{");
+        Iterator<String> keys = new TreeSet<>(json.keySet()).iterator();
+        boolean isFirstEle = true;
+        while (keys.hasNext()) {
+            if (!isFirstEle) {
+                appender.append(",");
+            }
+            String key = keys.next();
+            Object val = json.get(key);
+            if (val instanceof JSONObject) {
+                appender.append("\"").append(key).append("\":");
+                appender.append(serialJsonOrdered((JSONObject) val));
+            } else if (val instanceof JSONArray) {
+                JSONArray jarray = (JSONArray) val;
+                appender.append("\"").append(key).append("\":[");
+                boolean isFirstArrEle = true;
+                for (int i = 0; i < jarray.size(); i++) {
+                    if (!isFirstArrEle) {
+                        appender.append(",");
+                    }
+                    Object obj = jarray.get(i);
+                    if (obj instanceof JSONObject) {
+                        appender.append(serialJsonOrdered((JSONObject) obj));
+                    } else {
+                        appender.append(obj.toString());
+                    }
+                    isFirstArrEle = false;
+                }
+                appender.append("]");
+            } else {
+                String value = val.toString();
+                appender.append("\"").append(key).append("\":").append(value);
+            }
+            isFirstEle = false;
+        }
+        appender.append("}");
+        return appender.toString();
+    }
+
+    public static String getTime() {
+        LocalDateTime now = LocalDateTime.now(ZoneId.of("+8"));
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        return formatter.format(now);
+    }
+
+    public static String doPostForm(String httpUrl, Map<String, String> param) throws Exception {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        try {
+            URL url = new URL(httpUrl);
+            SSLContext sslcontext;
+            sslcontext = SSLContext.getInstance("SSL");
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            tmf.init((KeyStore) null);
+            X509TrustManager defaultTm = null;
+            for (TrustManager tm : tmf.getTrustManagers()) {
+                if (tm instanceof X509TrustManager) {
+                    defaultTm = (X509TrustManager) tm;
+                    break;
+                }
+            }
+            sslcontext.init(null, new TrustManager[]{defaultTm}, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
+
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("POST");
+            connection.setConnectTimeout(15000);
+            connection.setReadTimeout(60000);
+            connection.setInstanceFollowRedirects(true);
+
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            os = connection.getOutputStream();
+            os.write(createLinkString(param).getBytes());
+            if (connection.getResponseCode() != 200) {
+                is = connection.getErrorStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            } else {
+                is = connection.getInputStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                boolean firstLine = true;
+                while ((temp = br.readLine()) != null) {
+                    if (!firstLine) {
+                        firstLine = false;
+                        sbf.append("\r\n");
+                    }
+                    sbf.append(temp);
+                }
+                result = sbf.toString();
+            }
+        } finally {
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            connection.disconnect();
+        }
+        return result;
+    }
+
+    private static String createLinkString(Map<String, String> params) throws Exception {
+        ArrayList<String> keys = new ArrayList<>(params.keySet());
+        Collections.sort(keys);
+
+        StringBuilder prestr = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            if (i == keys.size() - 1) {
+                prestr.append(key).append("=").append(value);
+            } else {
+                prestr.append(key).append("=").append(value).append("&");
+            }
+        }
+        return prestr.toString();
+    }
+
+}

+ 47 - 212
happy-cloud-wisdom/happy-cloud-wisdom-biz/src/main/java/org/jeecg/common/zhutils/PayRequest.java

@@ -1,20 +1,12 @@
 package org.jeecg.common.zhutils;
 
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
 
-import javax.crypto.Cipher;
-import javax.crypto.spec.SecretKeySpec;
 import java.net.URLEncoder;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.Signature;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
+import java.nio.charset.StandardCharsets;
+import java.security.Security;
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.TreeSet;
 
 /**
  * @Author: zwq
@@ -22,6 +14,8 @@ import java.util.TreeSet;
  * @Date: 2021/05/27 9:34
  */
 public class PayRequest {
+    // 采用国密算法
+    private static final String ALG_SM = "SM";
 
     /**
      * 支付请求统一方法
@@ -31,63 +25,79 @@ public class PayRequest {
      * @return
      */
     public static String doRequest(JSONObject obj_body, String funcode, String userid, String payurl,
-                                   PublicKey publicKey, PrivateKey prvKey, String aesKey) throws Exception {
+                                   String publicKey, String prvKey, String aesKey) throws Exception {
+        // 引入BC库
+        Security.addProvider(new BouncyCastleProvider());
+
         JSONObject jObject = new JSONObject();
         JSONObject request = new JSONObject();
         // head
         JSONObject head = new JSONObject();
         head.put("funcode", funcode);
         head.put("userid", userid);
-        //免前置接入方式时该字段必输,前17位必须满足日期格式yyyyMMddHHmmssSSS(年月日时分秒毫秒)后面的自己定义,长度18-51位
-        LocalDateTime now = LocalDateTime.now(ZoneId.of("+8"));
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
-        String reqid = formatter.format(now);
-        //组合随机数(12位),请求id=日期+随机数
+        // 免前置接入方式时该字段必输,前17位必须满足日期格式yyyyMMddHHmmssSSS(年月日时分秒毫秒)后面的自己定义,长度18-51位
+        String reqid = DCHelper.getTime();
+        // 组合随机数(12位),请求id=日期+随机数
         reqid = reqid + RandomRequest.getRandom(12);
         head.put("reqid", reqid);
-        //data
+        // data
         request.put("head", head);
         request.put("body", obj_body);
         jObject.put("request", request);
-        //签名
+        // 签名
         JSONObject sign = new JSONObject();
         sign.put("sigdat", "__signature_sigdat__");
-        sign.put("sigtim", GetTime());
+        sign.put("sigtim", DCHelper.getTime());
         jObject.put("signature", sign);
-        String source = serialJsonOrdered(jObject);
-        System.out.println("source===" + source);
-        String data = signRsa2048(source.getBytes(), prvKey);
-        sign.put("sigdat", data);
+        String source = DCHelper.serialJsonOrdered(jObject);
+        System.out.println("签名原文: " + source);
+        byte[] signature1 = DCCryptor.CMBSM2SignWithSM3(getID_IV(userid), Base64.decode(prvKey), source.getBytes(
+                StandardCharsets.UTF_8));
+        String sigdat1 = new String(Base64.encode(signature1));
+        System.out.println("签名结果: " + sigdat1);
+        sign.put("sigdat", sigdat1);
         jObject.put("signature", sign);
 
-        // AES加密
-        String AesPlainxt = serialJsonOrdered(jObject);
-        System.out.println("加密前req:  " + AesPlainxt);
-        String req = encryptAES256Str(AesPlainxt, aesKey.getBytes());
+        // SM4-CBC加密
+        String plaintxt = jObject.toString();
+        System.out.println("加密前req:  " + plaintxt);
+        byte[] enInput = DCCryptor.CMBSM4EncryptWithCBC(aesKey.getBytes(), getID_IV(userid), plaintxt.getBytes(
+                StandardCharsets.UTF_8));
+        String req = new String(Base64.encode(enInput));
         System.out.println("加密后req:  " + req);
 
         // 发送请求
         HashMap<String, String> map = new HashMap<>();
         map.put("UID", userid);
+        map.put("ALG", ALG_SM);
         map.put("DATA", URLEncoder.encode(req, "utf-8"));
+        map.put("FUNCODE", funcode);
         System.out.println(map.toString());
         String formResult = PayUtils.doPostForm(payurl, map);
         System.out.println("请求结果: " + formResult);
+        try {
+            Base64.decode(formResult);
+        } catch (Exception e) {
+            System.err.println("访问返回错误.");
+        }
 
         //请求报文通过校验,不再抛异常
         if (!formResult.startsWith(PayConst.CDCServer)) {
-            // 解密请求结果
-            String resPlain = decryptAES256(formResult, aesKey.getBytes(), true);
+            // 解密请求
+            String resPlain = new String(DCCryptor.CMBSM4DecryptWithCBC(aesKey.getBytes(), getID_IV(userid), Base64.decode(formResult)),
+                    StandardCharsets.UTF_8);
             System.out.println("res decrypt: " + resPlain);
+            // 验签
             JSONObject object2 = JSONObject.parseObject(resPlain);
             JSONObject object3 = object2.getJSONObject("signature");
             String resSign = object3.getString("sigdat");
             object3.put("sigdat", "__signature_sigdat__");
             object2.put("signature", object3);
-            String resSignSource = serialJsonOrdered(object2);
+            String resSignSource = DCHelper.serialJsonOrdered(object2);
             System.out.println("验签原文: " + resSignSource);
             System.out.println("验签签名值: " + resSign);
-            Boolean verify = signRsa2048Verify(resSignSource.getBytes(), Base64.decode(resSign), publicKey);
+            Boolean verify = DCCryptor.CMBSM2VerifyWithSM3(getID_IV(userid), Base64.decode(publicKey), resSignSource.getBytes(
+                    StandardCharsets.UTF_8), Base64.decode(resSign));
             System.out.println("验签结果: " + verify);
             if (verify) {
                 return resSignSource;
@@ -97,188 +107,13 @@ public class PayRequest {
     }
 
     /**
-     * 加密
-     *
-     * @param content
-     * @param bytePassword
-     * @return
-     */
-    public static String encryptAES256Str(String content, byte[] bytePassword) {
-        return Base64.encode(encryptAES256(content, bytePassword));
-    }
-
-    public static byte[] encryptAES256(String content, byte[] bytePassword) {
-        try {
-            Cipher cipherInstance = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
-            SecretKeySpec key = new SecretKeySpec(bytePassword, "AES");
-            cipherInstance.init(Cipher.ENCRYPT_MODE, key);
-            byte[] byteContent = content.getBytes();
-            byte[] cryptograph = cipherInstance.doFinal(byteContent);
-            return cryptograph;
-        } catch (Exception e) {
-            System.out.println(e.getMessage());
-        }
-        return bytePassword;
-    }
-
-    /**
-     * 解密
-     *
-     * @param content
-     * @param bytePassword
-     * @param logError
-     * @return
-     */
-    public static String decryptAES256(String content, byte[] bytePassword, boolean logError) {
-        if (content == null || content.length() == 0) {
-            System.out.println("解密失败1");
-        }
-        byte[] bContent = null;
-        try {
-            bContent = Base64.decode(content);
-        } catch (Exception e) {
-            System.out.println("解密失败2");
-            e.printStackTrace();
-        }
-        try {
-            Cipher cipherInstance = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
-            SecretKeySpec key = new SecretKeySpec(bytePassword, "AES");
-            cipherInstance.init(Cipher.DECRYPT_MODE, key);
-            byte[] crypted = cipherInstance.doFinal(bContent);
-            return new String(crypted, "utf-8");
-        } catch (Exception e) {
-            System.out.println("解密失败3" + e.getMessage());
-        }
-        return content;
-    }
-
-    /**
-     * RSA 2048 签名
-     *
-     * @param baSource
-     * @param prvKey
-     * @return
-     * @throws Exception
-     */
-    public static String signRsa2048(byte[] baSource, PrivateKey prvKey) throws Exception {
-        try {
-            Signature signature = Signature.getInstance("SHA256WithRSA");
-            signature.initSign(prvKey);
-            signature.update(baSource);
-            return Base64.encode(signature.sign());
-        } catch (Exception e) {
-            System.out.println("签名失败" + e.getMessage());
-            throw new Exception("签名失败" + e.getMessage());
-        }
-    }
-
-    /**
-     * RSA 2048 验签
-     *
-     * @param baSource
-     * @param baSignature
-     * @param pubKey
-     * @return
-     * @throws Exception
-     */
-    public static boolean signRsa2048Verify(byte[] baSource, byte[] baSignature, PublicKey pubKey) throws Exception {
-        try {
-            Signature signature = Signature.getInstance("SHA256WithRSA");
-            signature.initVerify(pubKey);
-            signature.update(baSource);
-            return signature.verify(baSignature);
-        } catch (Exception e) {
-            System.out.println("验签失败 " + e.getMessage());
-            throw new Exception("验签失败 " + e.getMessage());
-        }
-    }
-
-    /**
-     * 当前时间
-     *
-     * @return
-     */
-    public static String GetTime() {
-        LocalDateTime now = LocalDateTime.now(ZoneId.of("+8"));
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
-        return formatter.format(now);
-    }
-
-    /**
-     * 序列化json
+     * 获取id字节
      *
-     * @param json
+     * @param uid
      * @return
      */
-    public static String serialJsonOrdered(JSONObject json) {
-        StringBuilder appender = new StringBuilder();
-        appender.append("{");
-        Iterator<String> keys = new TreeSet<>(json.keySet()).iterator();
-        boolean isFirstEle = true;
-        while (keys.hasNext()) {
-            if (!isFirstEle) {
-                appender.append(",");
-            }
-            String key = keys.next();
-            Object val = json.get(key);
-            if (val instanceof JSONObject) {
-                appender.append("\"").append(key).append("\":");
-                appender.append(serialJsonOrdered((JSONObject) val));
-            } else if (val instanceof JSONArray) {
-                JSONArray jarray = (JSONArray) val;
-                appender.append("\"").append(key).append("\":[");
-                boolean isFirstArrEle = true;
-                for (int i = 0; i < jarray.size(); i++) {
-                    if (!isFirstArrEle) {
-                        appender.append(",");
-                    }
-                    Object obj = jarray.get(i);
-                    if (obj instanceof JSONObject) {
-                        appender.append(serialJsonOrdered((JSONObject) obj));
-                    } else {
-                        appender.append("\"" + replaceSlash(obj.toString()) + "\"");
-                    }
-                    isFirstArrEle = false;
-                }
-                appender.append("]");
-            } else {
-                String value = "";
-                if (val instanceof String) {
-                    value = "\"" + replaceSlash(val.toString()) + "\"";
-                } else {
-                    value = replaceSlash(val.toString());
-                }
-                appender.append("\"").append(key).append("\":").append(value);
-            }
-            isFirstEle = false;
-        }
-        appender.append("}");
-        return appender.toString();
-    }
-
-    private static String replaceSlash(String val1) {
-
-        StringBuilder buffer = new StringBuilder();
-        char[] arr = val1.toCharArray();
-        for (char c : arr) {
-            if (c == '\\') {
-                buffer.append(c).append(c);
-            } else if (c == '\"') {
-                buffer.append('\\').append(c);
-            } else if (c == '\r') {
-                buffer.append("\\r");
-            } else if (c == '\n') {
-                buffer.append("\\n");
-            } else if (c == '\b') {
-                buffer.append("\\b");
-            } else if (c == '\t') {
-                buffer.append("\\t");
-            } else if (c == '\f') {
-                buffer.append("\\f");
-            } else {
-                buffer.append(c);
-            }
-        }
-        return buffer.toString();
+    private static byte[] getID_IV(String uid) {
+        String userid = uid + "0000000000000000";
+        return userid.substring(0, 16).getBytes();
     }
 }

+ 26 - 0
happy-cloud-wisdom/happy-cloud-wisdom-biz/src/main/java/org/jeecg/common/zhutils/RsaUtils.java

@@ -50,6 +50,32 @@ public class RsaUtils {
     }
 
     /**
+     * 从文件中读取公钥
+     *
+     * @param filename 公钥保存路径,相对于classpath
+     * @return 公钥对象
+     * @throws Exception
+     */
+    public static String getPublicKeyStr(String filename) throws Exception {
+        Security.addProvider(new BouncyCastleProvider());
+        String crtBase64 = readFile(filename);
+        return crtBase64;
+    }
+
+    /**
+     * 从文件中读取密钥
+     *
+     * @param filename 私钥保存路径,相对于classpath
+     * @return 私钥对象
+     * @throws Exception
+     */
+    public static String getPrivateKeyStr(String filename) throws Exception {
+        Security.addProvider(new BouncyCastleProvider());
+        String crtBase64 = readFile(filename);
+        return crtBase64;
+    }
+
+    /**
      * 获取公钥
      *
      * @param crtBase64 公钥的字节形式

+ 7 - 7
happy-cloud-wisdom/happy-cloud-wisdom-biz/src/main/java/org/jeecg/modules/utils/PayRsaCommon.java

@@ -61,7 +61,7 @@ public class PayRsaCommon {
             //业务模式
             obj_body.put("busmod", hlwSubcontractor.getBusmod());
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");
@@ -118,7 +118,7 @@ public class PayRsaCommon {
             //查询条件
             obj_body.put("ntagtls2x", jsonArrayRequest);
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");
@@ -262,7 +262,7 @@ public class PayRsaCommon {
             obj_body.put("ntagcagcx1", jsonArrayRequest2);
             obj_body.put("ntagcdtly1", jsonArrayRequest3);
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");
@@ -327,7 +327,7 @@ public class PayRsaCommon {
             //查询条件
             obj_body.put("ntagcinyx1", jsonArrayRequest);
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");
@@ -387,7 +387,7 @@ public class PayRsaCommon {
             //查询条件
             obj_body.put("ntagdinfy1", jsonArrayRequest);
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");
@@ -455,7 +455,7 @@ public class PayRsaCommon {
             //查询标记,首次查询请输入0
             obj_body.put("begidx", "0");
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");
@@ -499,7 +499,7 @@ public class PayRsaCommon {
             //查询ID
             obj_body.put("taskid", taskId);
             String result = PayRequest.doRequest(obj_body, funCode, hlwSubcontractor.getUserId(), hlwSubcontractor.getPaymentUrl(),
-                    RsaUtils.getPublicKey(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKey(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
+                    RsaUtils.getPublicKeyStr(hlwSubcontractor.getPubKeyUrl()), RsaUtils.getPrivateKeyStr(hlwSubcontractor.getPriKeyUrl()), hlwSubcontractor.getAesKey());
             if (StringUtils.isNotBlank(result)) {
                 JSONObject jsonObject = JSONObject.parseObject(result);
                 JSONObject jsonObject1 = jsonObject.getJSONObject("response");