From 40dc81837107f06da1411b0555cab1012207416b Mon Sep 17 00:00:00 2001
From: heheng <heheng@123456>
Date: 星期一, 17 二月 2025 11:15:05 +0800
Subject: [PATCH] 测试

---
 exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSign.java                |  147 ++++++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/config/SdkConfig.java        |   99 ++++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/DemoUtils.java               |  276 +++++++++++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/ClientFactory.java           |  245 ++++++++++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/ISignCommond.java            |    6 
 exam-system/src/main/java/com/gkhy/exam/pay/utils/ResponseDataVo.java          |  105 ++++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/SignatureFileVo.java         |   55 ++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java                 |   80 +-
 exam-system/src/main/java/com/gkhy/exam/pay/utils/config/StringUtil.java       |   89 +++
 exam-system/src/main/java/com/gkhy/exam/pay/utils/UploadXmlReponseDataVo.java  |   46 +
 exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesUtil.java   |  218 +++++++++
 exam-system/src/main/resources/sdk.properties                                  |   20 
 exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSignException.java       |   27 +
 exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesConfig.java |   18 
 14 files changed, 1,387 insertions(+), 44 deletions(-)

diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSign.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSign.java
new file mode 100644
index 0000000..3d509ec
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSign.java
@@ -0,0 +1,147 @@
+package com.gkhy.exam.pay.utils;
+
+import org.apache.commons.io.FileUtils;
+import org.dom4j.*;
+
+import java.io.File;
+import java.io.IOException;
+
+public class BillSign {
+    ISignCommond signCommond;
+    private static final String HEADER_TAG = "Header";
+    private static final String EINVOICE_TAG = "EInvoiceData";
+
+
+    public BillSign(ISignCommond signCommond) {
+        /*  28 */
+        this.signCommond = signCommond;
+
+    }
+
+
+    public String signBill(byte[] bytes) throws BillSignException {
+        /*  41 */
+        return signBill(new String(bytes));
+
+    }
+
+
+    public String signBill(File file) throws BillSignException {
+        /*  54 */
+        if (!file.exists()) {
+            /*  55 */
+            throw new BillSignException("文件不存在。文件名称" + file.getAbsolutePath());
+
+        }
+
+
+        try {
+            /*  59 */
+            byte[] bytes = FileUtils.readFileToByteArray(file);
+            /*  60 */
+            return signBill(new String(bytes));
+            /*  61 */
+        } catch (IOException e) {
+            /*  62 */
+            throw new BillSignException("文件读取失败。文件名称" + file.getAbsolutePath(), e);
+
+        }
+
+    }
+
+
+    public String signBill(String xml) throws BillSignException {
+        /*  78 */
+        Document xmlDoc = null;
+
+        try {
+            /*  80 */
+            xmlDoc = DocumentHelper.parseText(xml);
+            /*  81 */
+        } catch (DocumentException e) {
+            /*  82 */
+            throw new BillSignException("解析票据文件失败。", e);
+
+        }
+
+
+        /*  86 */
+        String plain = readRefSignDto(xmlDoc);
+
+
+        /*  89 */
+        Node signNode = genUnitSignNode(plain);
+
+
+        /*  92 */
+        addUnitSign(xmlDoc, signNode);
+
+        /*  94 */
+        return xmlDoc.asXML();
+
+    }
+
+
+    private Node genUnitSignNode(String plain) {
+        /* 100 */
+        SignDto signDto = this.signCommond.signSm3Detach(plain);
+
+        /* 102 */
+        Document document = DocumentHelper.createDocument();
+        /* 103 */
+        Element signature = document.addElement("Signature");
+        /* 104 */
+        signature.addAttribute("id", "InvoicingParty");
+
+        /* 106 */
+        Element signedInfo = signature.addElement("SignedInfo");
+        /* 107 */
+        signedInfo.addElement("Reference").addAttribute("URI", "/EInvoice/Header|/EInvoice/EInvoiceData");
+        /* 108 */
+        signedInfo.addElement("SignatureAlgorithm").setText(signDto.getSignatureAlgorithm());
+        /* 109 */
+        signedInfo.addElement("SignatureFormat").setText(signDto.getSignatureFormat());
+
+        /* 111 */
+        signature.addElement("SignatureTime").setText(signDto.getSignatureTime());
+        /* 112 */
+        signature.addElement("SignatureValue").setText(signDto.getSignatureValue());
+
+        /* 114 */
+        Element keyInfo = signature.addElement("KeyInfo");
+        /* 115 */
+        keyInfo.addElement("SerialNumber").setText(signDto.getSerialNumber());
+        /* 116 */
+        keyInfo.addElement("X509IssuerName").setText(signDto.getIssuerDn());
+        /* 117 */
+        return (Node) signature;
+
+    }
+
+
+    private String readRefSignDto(Document xmlDoc) throws BillSignException {
+        /* 130 */
+        Element root = xmlDoc.getRootElement();
+        /* 131 */
+        if (root.element("Header") == null || root.element("EInvoiceData") == null) {
+            /* 132 */
+            throw new BillSignException("票据文件格式不正确");
+
+        }
+        /* 134 */
+        return root.element("Header").asXML() + root.element("EInvoiceData").asXML();
+
+    }
+
+
+    private void addUnitSign(Document xmlDoc, Node signNode) {
+        /* 146 */
+        Element eInvoiceSignature = xmlDoc.getRootElement().addElement("EInvoiceSignature");
+        /* 147 */
+        eInvoiceSignature.add(signNode);
+
+    }
+
+}
+
+
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSignException.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSignException.java
new file mode 100644
index 0000000..2521925
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/BillSignException.java
@@ -0,0 +1,27 @@
+package com.gkhy.exam.pay.utils;
+
+
+public class BillSignException
+        extends Exception {
+    private static final long serialVersionUID = -7628601258343504944L;
+
+    public BillSignException() {
+    }
+
+    public BillSignException(String message) {
+        /* 21 */
+        super(message);
+    }
+
+    public BillSignException(String message, Throwable cause) {
+        /* 25 */
+        super(message, cause);
+    }
+
+    public BillSignException(Throwable cause) {
+        /* 29 */
+        super(cause);
+    }
+}
+
+
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/ClientFactory.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/ClientFactory.java
new file mode 100644
index 0000000..641ea71
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/ClientFactory.java
@@ -0,0 +1,245 @@
+/*     */
+package com.gkhy.exam.pay.utils;
+/*     */
+/*     */
+
+
+import com.gkhy.exam.pay.utils.config.SdkConfig;
+import com.gkhy.exam.pay.utils.config.StringUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */ public class ClientFactory
+        /*     */ {
+    /*     */   private static boolean onReady = false;
+
+    /*     */
+    /*     */
+    public static void initConfig() {
+        /*  25 */
+        if (!onReady) {
+            /*  26 */
+            InputStream read = null;
+            /*     */
+            try {
+                /*  28 */
+                read = ClientFactory.class.getClassLoader().getResourceAsStream("config.properties");
+                /*     */
+                /*  30 */
+                if (read != null) {
+                    /*  31 */
+                    Properties properties = new Properties();
+                    /*  32 */
+                    properties.load(read);
+                    /*  33 */
+                    String appId = properties.getProperty("appId");
+                    /*  34 */
+                    String fsServiceUrl = properties.getProperty("remote.fsweb.service");
+                    /*  35 */
+                    String fsPublicUrl = properties.getProperty("remote.fsweb.public");
+                    /*  36 */
+                    sdkConfig(appId, fsServiceUrl, fsPublicUrl);
+                    /*     */
+                } else {
+                    /*     */
+                    /*  39 */
+                    if (SdkConfig.appId == null) {
+                        /*  40 */
+                        SdkConfig.loadSDKProperties();
+                        /*     */
+                    }
+                    /*  42 */
+                    openClient();
+                    /*     */
+                }
+                /*  44 */
+            } catch (Exception e) {
+                /*  45 */
+                e.printStackTrace();
+                /*  46 */
+                throw new RuntimeException("加载配置文件错误!");
+                /*     */
+            } finally {
+                /*     */
+                try {
+                    /*  49 */
+                    if (read != null) {
+                        /*  50 */
+                        read.close();
+                        /*     */
+                    }
+                    /*  52 */
+                } catch (IOException e) {
+                    /*  53 */
+                    e.printStackTrace();
+                    /*  54 */
+                    throw new RuntimeException("加载配置文件错误!");
+                    /*     */
+                }
+                /*     */
+            }
+            /*     */
+        }
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    public static ResponseDataVo<?> sdkConfig(String appId, String fsServiceUrl, String fsPublicUrl) {
+        /*  70 */
+        if (!StringUtil.verificationEmpty(appId) && !StringUtil.verificationEmpty(fsServiceUrl) &&
+                /*  71 */       !StringUtil.verificationEmpty(fsPublicUrl)) {
+            /*  72 */
+            SdkConfig.appId = appId;
+            /*  73 */
+            SdkConfig.fsServiceUrl = fsServiceUrl;
+            /*  74 */
+            SdkConfig.fsPublicUrl = fsPublicUrl;
+            /*  75 */
+            openClient();
+            /*  76 */
+            return new ResponseDataVo("0000", null, "设置成功");
+            /*     */
+        }
+        /*  78 */
+        return new ResponseDataVo("1111", null, "设置失败");
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    public static void logConfig(String logPath, String logMaxFileSize, String logTotalSizeCap, boolean logAdditive) {
+        /*  83 */
+        if (logPath != null) {
+            /*  84 */
+            SdkConfig.logPath = logPath;
+            /*     */
+        }
+        /*  86 */
+        if (logMaxFileSize != null) {
+            /*  87 */
+            SdkConfig.logMaxFileSize = logMaxFileSize;
+            /*     */
+        }
+        /*  89 */
+        if (logTotalSizeCap != null) {
+            /*  90 */
+            SdkConfig.logTotalSizeCap = logTotalSizeCap;
+            /*     */
+        }
+        /*  92 */
+        SdkConfig.logAdditive = logAdditive;
+        /*     */
+        /*  94 */
+        // LoggerBuilder.reLoad();
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    static void openClient() {
+        /* 104 */
+        onReady = true;
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    static void closeClient() {
+        /* 114 */
+        onReady = false;
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+//    public static BillClient getBillClient() {
+//        /* 124 */
+//        initConfig();
+//        /*     */
+//        /* 126 */
+//        if (!onReady) {
+//            /* 127 */
+//            throw new RuntimeException(
+//                    /* 128 */           "Your configuration item verification failed. Please call the sdkconfig function to set");
+//            /*     */
+//        }
+//        /*     */
+//        /* 131 */
+//        BillClient billClient = (BillClient) (new ClientValidatorAndLogProxy(new BillClientImpl())).newProxyInstance();
+//        /* 132 */
+//        return billClient;
+//        /*     */
+//    }
+//
+//    /*     */
+//    /*     */
+//    /*     */
+//    /*     */
+//    /*     */
+//    /*     */
+//    /*     */
+//    /*     */
+//    public static PaymentClient getPaymentClient() {
+//        /* 142 */
+//        initConfig();
+//        /* 143 */
+//        if (!onReady) {
+//            /* 144 */
+//            throw new RuntimeException(
+//                    /* 145 */           "Your configuration item verification failed. Please call the sdkconfig function to set");
+//            /*     */
+//        }
+//        /*     */
+//        /* 148 */
+//        PaymentClient paymentClient = (PaymentClient) (new ClientValidatorAndLogProxy(new PaymentClientImpl()))
+///* 149 */.newProxyInstance();
+//        /* 150 */
+//        return paymentClient;
+//        /*     */
+//    }
+    /*     */
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sdk\client\impl\ClientFactory.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/DemoUtils.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/DemoUtils.java
new file mode 100644
index 0000000..685fa28
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/DemoUtils.java
@@ -0,0 +1,276 @@
+package com.gkhy.exam.pay.utils;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSONObject;
+import org.apache.commons.codec.binary.Base64;
+import sun.misc.BASE64Encoder;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class DemoUtils {
+
+
+    public JSONObject faqiV2(JSONObject res) {
+        System.out.println("发起接到参数===" + res.toJSONString());
+        String certNo = res.getString("certNo");
+        String payerType = res.getString("payerType");
+        String payUser = res.getString("payUser");
+        String checker = res.getString("checker");
+
+        String enterCode = res.getString("enterCode");
+        String busCode = res.getString("busCode");
+        BigDecimal price = res.getBigDecimal("price");
+
+        String handlingPerson = res.getString("handlingPerson");
+        String orderDesc = res.getString("orderDesc");
+        String invoiceSocialCode = res.getString("invoiceSocialCode");
+        int amount = res.getIntValue("amount");
+        String orderNo = "dadadad";
+        Double money = Double.valueOf(amount * price.doubleValue());
+
+        String reqdatastr = "{\"desc\": \"" + orderDesc + "\",\"payerType\": \"" + payerType + "\",\"checker\": \"" + checker + "\",\"amount\": 2,\"orderNo\": \"" + orderNo + "\",\"feeDatas\": [{\"amount\": " + amount + ",\"price\": " + (amount * price.doubleValue()) + ",\"busCode\": \"" + busCode + "\"}],\"money\": " + money + ",\"certNo\": \"" + certNo + "\",\"handlingPerson\": \"" + handlingPerson + "\",\"invoiceSocialCode\": \"" + invoiceSocialCode + "\",\"enterCode\": \"" + enterCode + "\",\"payerName\": \"" + payUser + "\"}";
+
+
+        String mac = getMD5("A1749891493E4CDDBFE4506357B1F0AB||" + getBase64(reqdatastr));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("appid", "A1749891493E4CDDBFE4506357B1F0AB");
+        jsonObject.put("mac", mac);
+        jsonObject.put("reqdata", getBase64(reqdatastr));
+        Map<String, String> header = new HashMap<>();
+        header.put("Accept", "application/json;charset=utf-8");
+        header.put("Content-Type", "application/json;charset=utf-8");
+        String resultStr = HttpUtil.post("http://finpt.xjcz.gov.cn/fs-service/fs-pay/invoice.do ", (Map) jsonObject);
+        System.out.println("发起入参===" + jsonObject);
+        JSONObject result = JSONObject.parseObject(resultStr);
+        System.out.println("发起回参===" + result);
+        result.put("postData", reqdatastr);
+
+        JSONObject jsonObject2 = result.getJSONObject("respdata");
+
+        String signfile = jsonObject2.getString("fileData");
+        String orderNo1 = jsonObject2.getString("orderNo");
+        String xmlFilePath = "F:/nginx-1.15.8/files/payH5/" + orderNo1 + ".xml";
+        generateBase64StringToFile(signfile, xmlFilePath);
+        String trr2 = "";
+        try {
+            File file2 = new File(xmlFilePath);
+            FileReader reader1 = new FileReader(file2);
+            BufferedReader bReader = new BufferedReader(reader1);
+            StringBuilder sb = new StringBuilder();
+            String s = "";
+            while ((s = bReader.readLine()) != null) {
+                sb.append(s);
+            }
+            bReader.close();
+            trr2 = sb.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        String jmsignfile = signFilejdnew(trr2);
+        String zuizhongpath = montageXmlV3(xmlFilePath, jmsignfile);
+        String zzsignfile = convertFileToBase64(zuizhongpath);
+
+        uploadXml(orderNo1, zzsignfile);
+        File file = new File(xmlFilePath);
+        file.delete();
+        File file1 = new File(zuizhongpath);
+        file1.delete();
+        return result;
+    }
+
+    public String getMD5(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] messageDigest = md.digest(input.getBytes());
+            StringBuilder hexString = new StringBuilder();
+            for (byte b : messageDigest) {
+                hexString.append(String.format("%02x", new Object[]{Byte.valueOf(b)}));
+            }
+            return hexString.toString();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public String getBase64(String str) {
+        String encodedStr = Base64.encodeBase64String(str.getBytes());
+        return encodedStr;
+    }
+
+
+    public static boolean generateBase64StringToFile(String fileStr, String fileFilePath) {
+        if (fileStr == null) {
+            return false;
+        }
+
+        try {
+            byte[] b = Base64.decodeBase64(fileStr);
+            for (int i = 0; i < b.length; i++) {
+
+                if (b[i] < 0) {
+                    b[i] = (byte) (b[i] + 256);
+                }
+            }
+
+            OutputStream out = new FileOutputStream(fileFilePath);
+            out.write(b);
+            out.flush();
+            out.close();
+            return true;
+        } catch (Exception e) {
+
+            return false;
+        }
+    }
+
+    public String signFilejdnew(String plain) {
+        BillSign sign = new BillSign((ISignCommond) new Object());
+        try {
+            String xx = sign.signBill(plain);
+            return xx;
+        } catch (BillSignException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    public String uploadXml(String orderNo, String signFile) {
+        ResponseDataVo<?> res = ClientFactory.sdkConfig("A1749891493E4CDDBFE4506357B1F0AB", "http://finpt.xjcz.gov.cn/fs-service", "http://finpt.xjcz.gov.cn/fs-service");
+        SignatureFileVo signatureFile = new SignatureFileVo();
+        signatureFile.setFileData(signFile);
+        signatureFile.setOrderNo(orderNo);
+//        BillClient billClient = ClientFactory.getBillClient();
+//        ResponseDataVo<UploadXmlReponseDataVo> response = billClient.uploadXml(signatureFile);
+//
+//        String mac = getMD5("A1749891493E4CDDBFE4506357B1F0AB||" + getBase64(signatureFile.toString()));
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("appid", "A1749891493E4CDDBFE4506357B1F0AB");
+//        jsonObject.put("mac", mac);
+//        jsonObject.put("reqdata", getBase64(signatureFile.toString()));
+        return null;
+    }
+
+//    public JSONObject signFileV2(JSONObject job) throws Exception {
+//        JSONObject xysfResult = new JSONObject();
+//        String certId = "11650000MB1957293J";
+//        String plain = job.getString("data").trim();
+//        MOFSignResult result = null;
+//        Map<String, Object> mmp = new HashMap<>();
+//
+//        try {
+//            String filePath = "F:/cssconfig.properties";
+//            System.out.println("配置文件路径:" + filePath);
+//
+//            MOFClient client = new MOFClient(filePath);
+//            System.out.println("证书标识为:" + certId);
+//            System.out.println("待签名数据:" + plain);
+//
+//
+//            result = client.sign(certId, plain.getBytes(StandardCharsets.UTF_8));
+//            /* 323 */
+//            System.out.println("签名返回结果:" + JSONObject.toJSONString(result));
+//
+//            /* 325 */
+//            byte[] signData = result.getSignData();
+//
+//            /* 327 */
+//            String base64Str = new String(Base64.encode(signData));
+//            /* 328 */
+//            mmp.put("signResult", base64Str);
+//
+//            /* 330 */
+//            MOFVerifyResult resultVer = client.verifySign(signData, plain.getBytes(StandardCharsets.UTF_8));
+//            /* 331 */
+//            System.out.println("验签结果为:" + JSONObject.toJSONString(resultVer));
+//
+//            /* 333 */
+//            mmp.put("issure", resultVer.getIssure());
+//            /* 334 */
+//            mmp.put("sn", resultVer.getSn());
+//            /* 335 */
+//            mmp.put("signTime", resultVer.getSignTime());
+//
+//            /* 337 */
+//            xysfResult.put("success", Boolean.valueOf(true));
+//            /* 338 */
+//            xysfResult.put("content", mmp);
+//            /* 339 */
+//            return xysfResult;
+//        }
+//        /* 341 */ catch (NewCSSException e) {
+//            /* 342 */
+//            System.out.println("****签名失败****");
+//            /* 343 */
+//            System.out.println("错误号为:" + e.getCode());
+//            /* 344 */
+//            System.out.println("错误描述为:" + e.getDescription());
+//            /* 345 */
+//            xysfResult.put("success", Boolean.valueOf(false));
+//            /* 346 */
+//            xysfResult.put("msg", "系统错误");
+//            /* 347 */
+//            return xysfResult;
+//        }
+//    }
+
+
+    public static String montageXmlV3(String ywfilePath, String xmlStr) {
+        try {
+            /* 358 */
+            String outputxmlpath = ywfilePath.replace(".xml", "_3.xml");
+
+            /* 360 */
+            xmlStr = xmlStr.trim().replace("\n", "");
+            /* 361 */
+            FileWriter writer = new FileWriter(outputxmlpath);
+            /* 362 */
+            writer.write(xmlStr);
+            /* 363 */
+            writer.close();
+            /* 364 */
+            return outputxmlpath;
+        }
+        /* 366 */ catch (Exception e) {
+            /* 367 */
+            e.printStackTrace();
+
+            /* 369 */
+            return null;
+        }
+    }
+
+    public static String convertFileToBase64(String imgPath) {
+        /* 374 */
+        byte[] data = null;
+
+        try {
+            /* 377 */
+            InputStream in = new FileInputStream(imgPath);
+            /* 378 */
+            data = new byte[in.available()];
+            /* 379 */
+            in.read(data);
+            /* 380 */
+            in.close();
+            /* 381 */
+        } catch (IOException e) {
+            /* 382 */
+            e.printStackTrace();
+        }
+
+        /* 385 */
+        BASE64Encoder encoder = new BASE64Encoder();
+        /* 386 */
+        String base64Str = encoder.encode(data);
+        /* 387 */
+        return base64Str;
+    }
+
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/ISignCommond.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/ISignCommond.java
new file mode 100644
index 0000000..7bebad5
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/ISignCommond.java
@@ -0,0 +1,6 @@
+package com.gkhy.exam.pay.utils;
+
+public interface ISignCommond {
+    SignDto signSm3Detach(String paramString);
+}
+
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/ResponseDataVo.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/ResponseDataVo.java
new file mode 100644
index 0000000..f52ebc7
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/ResponseDataVo.java
@@ -0,0 +1,105 @@
+/*    */
+package com.gkhy.exam.pay.utils;
+
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */ public class ResponseDataVo<T>
+        /*    */ {
+    /*    */   private String respcode;
+    /*    */   private String respmsg;
+    /*    */   private T respdata;
+
+    /*    */
+    /*    */
+    public String getRespcode() {
+        /* 21 */
+        return this.respcode;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public void setRespcode(String respcode) {
+        /* 25 */
+        this.respcode = respcode;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public String getRespmsg() {
+        /* 29 */
+        return this.respmsg;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public void setRespmsg(String respmsg) {
+        /* 33 */
+        this.respmsg = respmsg;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public T getRespdata() {
+        /* 37 */
+        return this.respdata;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public void setRespdata(T respdata) {
+        /* 41 */
+        this.respdata = respdata;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    public ResponseDataVo() {
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    public ResponseDataVo(String respcode, String respmsg, T respdata) {
+        /* 50 */
+        this.respcode = respcode;
+        /* 51 */
+        this.respmsg = respmsg;
+        /* 52 */
+        this.respdata = respdata;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    public String toString() {
+        /* 57 */
+        return "ResponseData [respcode=" + this.respcode + ", respmsg=" + this.respmsg + ", respdata=" + this.respdata + "]";
+        /*    */
+    }
+    /*    */
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sdk\model\ResponseDataVo.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java
index a61014e..ceaa02d 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignDto.java
@@ -2,7 +2,6 @@
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.Locale;
 import java.util.TimeZone;
 
 public class SignDto {
@@ -10,73 +9,66 @@
     private String signatureFormat;
     private String signatureTime;
     private String signatureValue;
-    private String serialNumber;
     private String issuerDn;
+    private String serialNumber;
+    private static final String UTC_DATE_TIME = "dd MMM yyyy HH:mm:ss z";
 
-    private static final String UTC_DATE_TIME = "dd MM yyyy HH:mm:ss z";
-
-
-    public static String formatWithTime(Date date) {
-        SimpleDateFormat sdf = new SimpleDateFormat(UTC_DATE_TIME, Locale.CHINA);
+    public static String formatWithTimeZone(Date date) {
+        /* 48 */
+        SimpleDateFormat sdf = new SimpleDateFormat();
+        /* 49 */
         sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+        /* 50 */
+        sdf.applyPattern("dd MMM yyyy HH:mm:ss z");
+        /* 51 */
         return sdf.format(date);
     }
 
-    public SignDto(String signatureAlgorithm, String signatureFormat, Date signatureTime, String signatureValue, String serialNumber, String issuerDn) {
-        this.signatureAlgorithm = signatureAlgorithm;
-        this.signatureFormat = signatureFormat;
-        this.signatureTime = formatWithTime(signatureTime);
+
+    public SignDto(Date signatureTime, String signatureValue, String issuerDn, String serialNumber) {
+        /* 56 */
+        this.signatureAlgorithm = "sm3";
+        /* 57 */
+        this.signatureFormat = "DETACH";
+        /* 58 */
+        this.signatureTime = formatWithTimeZone(signatureTime);
+        /* 59 */
         this.signatureValue = signatureValue;
-        this.serialNumber = serialNumber;
+        /* 60 */
         this.issuerDn = issuerDn;
+        /* 61 */
+        this.serialNumber = serialNumber;
     }
 
-    // Getters and Setters
     public String getSignatureAlgorithm() {
-        return signatureAlgorithm;
-    }
-
-    public void setSignatureAlgorithm(String signatureAlgorithm) {
-        this.signatureAlgorithm = signatureAlgorithm;
+        /* 65 */
+        return this.signatureAlgorithm;
     }
 
     public String getSignatureFormat() {
-        return signatureFormat;
-    }
-
-    public void setSignatureFormat(String signatureFormat) {
-        this.signatureFormat = signatureFormat;
+        /* 69 */
+        return this.signatureFormat;
     }
 
     public String getSignatureTime() {
-        return signatureTime;
-    }
-
-    public void setSignatureTime(String signatureTime) {
-        this.signatureTime = signatureTime;
+        /* 73 */
+        return this.signatureTime;
     }
 
     public String getSignatureValue() {
-        return signatureValue;
-    }
-
-    public void setSignatureValue(String signatureValue) {
-        this.signatureValue = signatureValue;
-    }
-
-    public String getSerialNumber() {
-        return serialNumber;
-    }
-
-    public void setSerialNumber(String serialNumber) {
-        this.serialNumber = serialNumber;
+        /* 77 */
+        return this.signatureValue;
     }
 
     public String getIssuerDn() {
-        return issuerDn;
+        /* 81 */
+        return this.issuerDn;
     }
 
-    public void setIssuerDn(String issuerDn) {
-        this.issuerDn = issuerDn;
+    public String getSerialNumber() {
+        /* 85 */
+        return this.serialNumber;
     }
 }
+
+
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignatureFileVo.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignatureFileVo.java
new file mode 100644
index 0000000..403ce62
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/SignatureFileVo.java
@@ -0,0 +1,55 @@
+package com.gkhy.exam.pay.utils;
+
+/*    */ public class SignatureFileVo
+        /*    */ {
+    /*    */
+//    @Validator(validatorType = 2, rangeInt = {1, 50})
+    /*    */ private String orderNo;
+    /*    */
+//    @Validator(validatorType = 1)
+    /*    */ private String fileData;
+
+    /*    */
+    /*    */
+    public String getOrderNo() {
+        /* 24 */
+        return this.orderNo;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public void setOrderNo(String orderNo) {
+        /* 28 */
+        this.orderNo = orderNo;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public String getFileData() {
+        /* 32 */
+        return this.fileData;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public void setFileData(String fileData) {
+        /* 36 */
+        this.fileData = fileData;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    public String toString() {
+        /* 41 */
+        return "SignatureFile [orderNo=" + this.orderNo + ", fileData=" + this.fileData + "]";
+        /*    */
+    }
+    /*    */
+}
+
+
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/UploadXmlReponseDataVo.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/UploadXmlReponseDataVo.java
new file mode 100644
index 0000000..2a4d972
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/UploadXmlReponseDataVo.java
@@ -0,0 +1,46 @@
+/*    */
+package com.gkhy.exam.pay.utils;
+
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */ public class UploadXmlReponseDataVo
+        /*    */ {
+    /*    */   private String orderId;
+
+    /*    */
+    /*    */
+    public String getOrderId() {
+        /* 14 */
+        return this.orderId;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    public void setOrderId(String orderId) {
+        /* 18 */
+        this.orderId = orderId;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    public String toString() {
+        /* 23 */
+        return "UploadXmlReponseData [orderId=" + this.orderId + "]";
+        /*    */
+    }
+    /*    */
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sdk\model\UploadXmlReponseDataVo.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesConfig.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesConfig.java
new file mode 100644
index 0000000..d0fd044
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesConfig.java
@@ -0,0 +1,18 @@
+package com.gkhy.exam.pay.utils.config;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface PropertiesConfig {
+    String fileName() default "";
+
+    String name() default "";
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sdk\annotation\PropertiesConfig.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesUtil.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesUtil.java
new file mode 100644
index 0000000..2a98e26
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/PropertiesUtil.java
@@ -0,0 +1,218 @@
+/*     */
+package com.gkhy.exam.pay.utils.config;
+/*     */
+/*     */
+
+import com.xjhys.edu.fee.sdk.annotation.PropertiesConfig;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.sql.Date;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Properties;
+
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */
+/*     */ public class PropertiesUtil
+        /*     */ {
+    /*     */   public static final String PROPERTIES_SUFFIX_NAME = "properties";
+    /*     */   public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /*     */   public static final String RESOURCES_PATH = "/";
+    /*     */   public static final String INT_NAME = "int";
+    /*     */   public static final String DOUBLE_NAME = "double";
+    /*     */   public static final String FLOAT_NAME = "float";
+    /*     */   public static final String LONG_NAME = "long";
+    /*     */   public static final String METHOD_SET = "set";
+
+    /*     */
+    /*     */
+    public static Properties loadPropertiesFile(InputStream in) throws IOException {
+        /*  43 */
+        Properties p = new Properties();
+        /*  44 */
+        p.load(in);
+        /*  45 */
+        return p;
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    public static void loadData(Object propertiesBean) throws IOException {
+        /*  56 */
+        if (propertiesBean == null) {
+            /*     */
+            return;
+            /*     */
+        }
+        /*  59 */
+        PropertiesConfig pc = propertiesBean.getClass().<PropertiesConfig>getAnnotation(PropertiesConfig.class);
+        /*  60 */
+        String fileNmae = pc.fileName();
+        /*  61 */
+        loadData(fileNmae, propertiesBean);
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    public static void loadData(String fileNmae, Object propertiesBean) throws IOException {
+        /*  75 */
+        if (propertiesBean == null) {
+            /*     */
+            return;
+            /*     */
+        }
+        /*  78 */
+        URL url = PropertiesUtil.class.getResource("/" + fileNmae);
+        /*  79 */
+        InputStream openStream = url.openStream();
+        /*  80 */
+        Properties p = loadPropertiesFile(openStream);
+        /*  81 */
+        Field[] fs = propertiesBean.getClass().getDeclaredFields();
+        /*  82 */
+        for (int i = 0; i < fs.length; i++) {
+            /*  83 */
+            Field field = fs[i];
+            /*  84 */
+            PropertiesConfig pc = field.<PropertiesConfig>getAnnotation(PropertiesConfig.class);
+            /*  85 */
+            String pKey = field.getName();
+            /*  86 */
+            String value = null;
+            /*  87 */
+            if (pc != null) {
+                /*  88 */
+                value = p.getProperty(pc.name());
+                /*     */
+            } else {
+                /*  90 */
+                value = p.getProperty(pKey);
+                /*     */
+            }
+            /*  92 */
+            if (value != null) {
+                /*  93 */
+                field.setAccessible(true);
+                /*     */
+                try {
+                    /*  95 */
+                    field.set(propertiesBean, conversion(value, field.getType()));
+                    /*  96 */
+                } catch (IllegalArgumentException e) {
+                    /*     */
+                    /*  98 */
+                    e.printStackTrace();
+                    /*  99 */
+                } catch (IllegalAccessException e) {
+                    /*     */
+                    /* 101 */
+                    e.printStackTrace();
+                    /*     */
+                }
+                /*     */
+            }
+            /*     */
+        }
+        /*     */
+    }
+
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    /*     */
+    public static Object conversion(String value, Class<?> type) {
+        /* 118 */
+        if (value == null) {
+            /* 119 */
+            return null;
+            /*     */
+        }
+        /* 121 */
+        if ("int".equals(type.getName()) || type.getName().equals(Integer.class.getName()))
+            /* 122 */ return Integer.valueOf(value);
+        /* 123 */
+        if ("double".equals(type.getName()) || type.getName().equals(Double.class.getName()))
+            /* 124 */ return Double.valueOf(value);
+        /* 125 */
+        if ("float".equals(type.getName()) || type.getName().equals(Float.class.getName()))
+            /* 126 */ return Float.valueOf(value);
+        /* 127 */
+        if ("long".equals(type.getName()) || type.getName().equals(Long.class.getName()))
+            /* 128 */ return Long.valueOf(value);
+        /* 129 */
+        if (type.getName().equals(Date.class.getName())) {
+            /* 130 */
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            /*     */
+            try {
+                /* 132 */
+                return format.parse(value);
+                /* 133 */
+            } catch (ParseException e) {
+                /*     */
+                /* 135 */
+                e.printStackTrace();
+                /*     */
+            }
+            /*     */
+        }
+        /*     */
+        /* 139 */
+        return value;
+        /*     */
+    }
+    /*     */
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sd\\utils\PropertiesUtil.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/SdkConfig.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/SdkConfig.java
new file mode 100644
index 0000000..36fbf07
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/SdkConfig.java
@@ -0,0 +1,99 @@
+/*    */
+package com.gkhy.exam.pay.utils.config;
+/*    */
+/*    */
+
+
+import java.io.File;
+import java.io.IOException;
+
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+@PropertiesConfig(fileName = "sdk.properties")
+/*    */ public class SdkConfig
+        /*    */ {
+    /*    */   static {
+        /* 20 */
+        loadSDKProperties();
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    /* 25 */   public static final String tempPath = String.valueOf(System.getProperty("java.io.tmpdir")) + File.separator;
+    /*    */
+    /*    */
+    /*    */   public static int connectionRequestTimeOut;
+    /*    */
+    /*    */
+    /*    */   public static int connectionTimeout;
+    /*    */
+    /*    */
+    /*    */   public static int socketTimeOut;
+    /*    */
+    /*    */
+    /*    */   public static String logPath;
+    /*    */
+    /*    */
+    /*    */   public static String logMaxFileSize;
+    /*    */
+    /*    */
+    /*    */   public static String logTotalSizeCap;
+    /*    */
+    /*    */
+    /*    */   public static int logMaxHistory;
+    /*    */
+    /*    */   public static boolean logAdditive = true;
+    /*    */
+    /*    */
+    @PropertiesConfig(name = "appId")
+    /*    */ public static String appId;
+    /*    */
+    /*    */
+    @PropertiesConfig(name = "remote.fsweb.service")
+    /*    */ public static String fsServiceUrl;
+    /*    */
+    /*    */
+    @PropertiesConfig(name = "remote.fsweb.public")
+    /*    */ public static String fsPublicUrl;
+
+    /*    */
+    /*    */
+    /*    */
+    public static void loadSDKProperties() {
+        /*    */
+        try {
+            /* 62 */
+            PropertiesUtil.loadData(new SdkConfig());
+            /*    */
+            /* 64 */
+            logPath = StringUtil.appendMsg(new String[]{tempPath, logPath});
+            /*    */
+            /* 66 */
+            fsPublicUrl = StringUtil.getUrl(fsPublicUrl);
+            /* 67 */
+            fsServiceUrl = StringUtil.getUrl(fsServiceUrl);
+            /* 68 */
+        } catch (IOException e) {
+            /* 69 */
+            e.printStackTrace();
+            /*    */
+        }
+        /*    */
+    }
+    /*    */
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sdk\config\SdkConfig.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/StringUtil.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/StringUtil.java
new file mode 100644
index 0000000..24f52bf
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/config/StringUtil.java
@@ -0,0 +1,89 @@
+/*    */
+package com.gkhy.exam.pay.utils.config;
+
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */
+/*    */ public class StringUtil
+        /*    */ {
+    /*    */
+    public static String appendMsg(String... values) {
+        /* 17 */
+        StringBuilder sb = new StringBuilder();
+        /* 18 */
+        if (values != null && values.length > 0) {
+            /* 19 */
+            for (int i = 0; i < values.length; i++) {
+                /* 20 */
+                sb.append(values[i]);
+                /*    */
+            }
+            /*    */
+        }
+        /* 23 */
+        return sb.toString();
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    public static String getUrl(String url) {
+        /* 31 */
+        if (url == null) {
+            /* 32 */
+            return null;
+            /*    */
+        }
+        /* 34 */
+        url = url.replaceAll("[\\t\\n\\r\\s+]", "").replaceAll("/+", "/").replaceFirst("/", "//").replaceAll("/+$", "");
+        /* 35 */
+        return url;
+        /*    */
+    }
+
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    /*    */
+    public static boolean verificationEmpty(String value) {
+        /* 43 */
+        if (value == null) {
+            /* 44 */
+            return true;
+            /*    */
+        }
+        /* 46 */
+        value = value.replaceAll("[\\t\\n\\r\\s+]", "");
+        /* 47 */
+        if ("".equals(value)) {
+            /* 48 */
+            return true;
+            /*    */
+        }
+        /* 50 */
+        return false;
+        /*    */
+    }
+    /*    */
+}
+
+
+/* Location:              D:\jar\sign_util-1.0-SNAPSHOT.20240227.jar!\BOOT-INF\lib\SNAPSHOT-1.0.0.jar!\com\xjhys\edu\fee\sd\\utils\StringUtil.class
+ * Java compiler version: 8 (52.0)
+ * JD-Core Version:       1.1.3
+ */
\ No newline at end of file
diff --git a/exam-system/src/main/resources/sdk.properties b/exam-system/src/main/resources/sdk.properties
new file mode 100644
index 0000000..7b62133
--- /dev/null
+++ b/exam-system/src/main/resources/sdk.properties
@@ -0,0 +1,20 @@
+#从连接池中获取连接的超时时间(单位:ms)
+connectionRequestTimeOut=5000
+#与服务器连接的超时时间(单位:ms) 
+connectionTimeout=5000
+#从服务器获取响应数据的超时时间(单位:ms) 
+socketTimeOut=10000
+#日志地址
+logPath=sdklog
+#日志文件最大值 2GB
+logMaxFileSize=2MB
+#日志总量最大值
+logTotalSizeCap=20MB
+#最大历史记录数量
+logMaxHistory=15
+#网站接入码
+appId=4896FAE0994B46B0A29237DC575C0CCD
+#非税业务平台地址
+remote.fsweb.service=http://finpt.xjcz.gov.cn/fs-service-test
+#非税支付平台地址
+remote.fsweb.public=http://finpt.xjcz.gov.cn/fs-public-test
\ No newline at end of file

--
Gitblit v1.9.2