Forráskód Böngészése

渤海 报价实体

wks 2 éve
szülő
commit
cc62d9b997

+ 10 - 0
src/main/java/com/ydtech/config/properties/BohaiApiConfigurationProperties.java

@@ -13,5 +13,15 @@ public class BohaiApiConfigurationProperties {
     // 请求地址
     private String url;
 
+    // 我司公钥
+    private String selfPublicKey;
 
+    // 我司私钥
+    private String selfPrivateKey;
+
+    // 渤海方公钥
+    private String boHaiPublicKey;
+
+    // 配置code
+    private String sysSourceCode;
 }

+ 46 - 0
src/main/java/com/ydtech/modules/order/entity/api/bohai/constants/RequestType.java

@@ -0,0 +1,46 @@
+package com.ydtech.modules.order.entity.api.bohai.constants;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * @description: 渤海财险 请求类型代码
+ * @author: wenks
+ * @date: 2024/3/6 11:52
+ **/
+@Getter
+@AllArgsConstructor
+public enum RequestType {
+
+    Z00001("Z00001", "获取初始化参数"),
+    Z00002("Z00002", "生成订单号"),
+    Z00003("Z00003", "获取交管查询校验码"),
+    Z00004("Z00004", "车型查询"),
+    Z00005("Z00005", "车辆确认"),
+    Z00006("Z00006", "报价"),
+    Z00007("Z00007", "核保"),
+    Z00008("Z00008", "支付申请"),
+    Z00009("Z00009", "撤销核保"),
+    Z00010("Z00010", "获取短信验证码"),
+    Z00011("Z00011", "回收短信验证码"),
+    Z00012("Z00012", "客户信息审核"),
+    Z00013("Z00013", "电子签名支付"),
+    Z00014("Z00014", "公共影像上传"),
+    Z00015("Z00015", "人工审核"),
+    Z00016("Z00016", "投保单继续支付"),
+    Z00017("Z00017", "续保查询"),
+    Z00018("Z00018", "车+X产品查询"),
+    Z00019("Z00019", "车+X产品详情查询"),
+    Z00020("Z00020", "电子保单下载"),
+    Z00021("Z00021", "单证状态查询"),
+    Z00022("Z00022", "支付信息回调"),
+    Z00023("Z00023", "保单结果回调"),
+    Z00024("Z00024", "人工审核信息回调");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 21 - 0
src/main/java/com/ydtech/modules/order/entity/api/bohai/request/ElectronicPolicyRequest.java

@@ -0,0 +1,21 @@
+package com.ydtech.modules.order.entity.api.bohai.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class ElectronicPolicyRequest extends BohaiBaseRequest{
+
+    private static final long serialVersionUID = 6662090847203132477L;
+
+    @JsonProperty("policyNo")
+    private String policyNo;
+
+    @JsonProperty("policyType")
+    private String policyType;
+
+}

+ 30 - 0
src/main/java/com/ydtech/modules/order/entity/api/bohai/response/ElectronicPolicyResponse.java

@@ -0,0 +1,30 @@
+package com.ydtech.modules.order.entity.api.bohai.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class ElectronicPolicyResponse extends BohaiBaseResponse{
+
+    private static final long serialVersionUID = -6579348094955612464L;
+
+
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+
+        @JsonProperty("trafficEPolicyUrl")
+        private String trafficEPolicyUrl;
+
+        @JsonProperty("businessEPolicyUrl")
+        private String businessEPolicyUrl;
+
+    }
+}

+ 17 - 0
src/main/java/com/ydtech/modules/order/entity/config/BoHaiConfigureParameters.java

@@ -0,0 +1,17 @@
+package com.ydtech.modules.order.entity.config;
+
+import lombok.Data;
+
+@Data
+public class BoHaiConfigureParameters implements ConfigureParameters {
+
+    // 二级机构编码
+    private String insurerBranchCode;
+
+    // 中介机构代码
+    private String franchiserInstitutionCode;
+
+    // 机构渠道id
+    private String franchiserChannelId;
+
+}

+ 334 - 0
src/main/java/com/ydtech/modules/order/utils/SignatureUtils.java

@@ -0,0 +1,334 @@
+package com.ydtech.modules.order.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ydtech.exception.SystemException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.Base64Utils;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.*;
+
+/**
+ * 签名工具
+ */
+@Slf4j
+public class SignatureUtils {
+
+    private SignatureUtils(){
+        throw new IllegalStateException("Utility class");
+    }
+    /**
+     * 加密算法RSA
+     */
+    public static final String KEY_ALGORITHM = "RSA";
+
+    /**
+     * 签名算法
+     */
+    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
+
+    /**
+     * RSA最大加密明文大小
+     */
+    private static final int MAX_ENCRYPT_BLOCK = 117;
+
+    /**
+     * RSA最大解密密文大小
+     */
+    private static final int MAX_DECRYPT_BLOCK = 128;
+
+    /**
+     * 验签并解密
+     * <p>
+     * 对于<b>银保信</b>,publicKey是指合作方的公钥,privateKey是指银保信的私钥<br>
+     * 对于<b>合作方</b>,publicKey是指银保信的公钥,privateKey是指合作方的私钥<br>
+     *
+     * @param request     原始报文(JSON字符串)
+     * @param publicKey   公钥
+     * @param privateKey  私钥
+     * @param isCheckSign 是否验签
+     * @param isDecrypt   是否解密
+     * @return 解密后的明文,验签失败则异常抛出
+     */
+    public static String checkSignAndDecrypt(String request, String sign, String publicKey, String privateKey, boolean isCheckSign,
+                                             boolean isDecrypt) {
+        boolean verifyResult = false;
+        JSONObject requestJSONObject = JSONObject.parseObject(request);
+        String bizContent = requestJSONObject.getString("bizContent");// 获取的业务数据密文
+        String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+        if (isCheckSign) {
+            verifyResult = verify(signContent, sign, publicKey);
+        }
+        if (!isCheckSign) {
+            verifyResult = true;
+        }
+        if (isDecrypt && verifyResult) {
+            return decryptByPrivateKey(bizContent, privateKey);
+        }
+        return null;
+    }
+
+    public static String checkSignAndDecryptNew(String request, String sign, String publicKey, String privateKey, boolean isCheckSign,
+                                                boolean isDecrypt) throws Exception {
+        boolean verifyResult = false;
+        JSONObject requestJSONObject = JSONObject.parseObject(request);
+        String bizContent = requestJSONObject.getString("bizContent");// 获取的业务数据密文
+        String insurerCode = requestJSONObject.getString("insurerCode");
+        String sysSourceCode = requestJSONObject.getString("sysSourceCode");
+        String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+        if (isCheckSign) {
+            verifyResult = verify(signContent, sign, publicKey);
+        }
+        if (!isCheckSign) {
+            verifyResult = true;
+        }
+        if (isDecrypt && verifyResult) {
+            String json = decryptByPrivateKey(bizContent, privateKey);
+            String oldChar = "\\{";
+            String newChar = "{\"sysSourceCode\": \"" + sysSourceCode + "\",\"insurerCode\": \"" + insurerCode + "\",";
+            return json.replaceFirst(oldChar, newChar);
+        }
+        return null;
+    }
+
+    /**
+     * 加密并签名
+     * <p>
+     * 对于<b>银保信</b>,publicKey是指合作方的公钥,privateKey是指银保信的私钥<br>
+     * 对于<b>合作方</b>,publicKey是指银保信的公钥,privateKey是指合作方的私钥<br>
+     *
+     * @param publicKey      公钥
+     * @param requestContent 报文原文
+     * @param isCheckSign    是否签名
+     * @param isEncrypt      是否加密
+     * @return 加密加签后的返回报文
+     * @throws Exception
+     */
+    public static Map<String, String> encryptAndSign(String privateKey, String publicKey, String requestContent, boolean isCheckSign,
+                                                     boolean isEncrypt) throws Exception {
+        JSONObject requestJSONObject = JSONObject.parseObject(requestContent);
+        String bizContent = requestJSONObject.getString("bizContent");
+        Map<String, String> map = new HashMap<String, String>();
+        if (isEncrypt) {
+            //加密
+            String encryptBizContent = encryptByPublicKey(bizContent, publicKey);//对业务数据进行加密
+            requestJSONObject.put("bizContent", encryptBizContent);//将加密后的数据替换原有的明文
+            map.put("content", requestJSONObject.toJSONString());
+            if (isCheckSign) {
+                //加签
+                String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+                String sign = sign(signContent, privateKey);
+                map.put("signature", sign);
+            }
+        } else if (isCheckSign) {// 只加签、不加密
+            String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+            String sign = sign(signContent, privateKey);
+            map.put("signature", sign);
+        }
+        return map;
+    }
+
+    /**
+     * 封装待验签的内容
+     *
+     * @param sortedParam
+     * @return
+     */
+    public static String getSignContent(Map<String, Object> sortedParam) {
+        LinkedHashMap map = new LinkedHashMap();
+        List<String> keys = new ArrayList<String>(sortedParam.keySet());
+        Collections.sort(keys);
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = sortedParam.get(key).toString();
+            map.put(key, value);
+        }
+        return map.toString();
+    }
+
+    /**
+     * 验签
+     *
+     * @param request
+     * @param sign
+     * @param
+     * @return
+     */
+    public static boolean verify(String request, String sign, String publicKey) {
+        try {
+            return SignatureUtils.verify(request.getBytes(), publicKey, sign);
+        } catch (Exception e) {
+            log.error("验签异常,inputParams: {} and publicKey: {} and sign: {} and errorMessage: {}", request, publicKey, sign,
+                    e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * <p>
+     * 校验数字签名
+     * </p>
+     *
+     * @param data      已加密数据
+     * @param publicKey 公钥(BASE64编码)
+     * @param sign      数字签名
+     * @return
+     * @throws Exception
+     */
+    public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(publicKey.getBytes());
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        PublicKey publicK = keyFactory.generatePublic(keySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initVerify(publicK);
+        signature.update(data);
+        return signature.verify(Base64Utils.decode(sign.getBytes()));
+    }
+
+    /**
+     * 私钥对数据进行解密
+     *
+     * @param bizContent
+     * @param privateKey
+     * @return
+     */
+    public static String decryptByPrivateKey(String bizContent, String privateKey) {
+        try {
+            return new String(SignatureUtils.decryptByPrivateKey(Base64Utils.decode(bizContent.getBytes()), privateKey));
+        } catch (Exception e) {
+            log.error("私钥解密异常,inputParams: {} and privateKey: {}  and errorMessage: {}", bizContent, privateKey, e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * <P>
+     * 私钥解密
+     * </p>
+     *
+     * @param encryptedData 已加密数据
+     * @param privateKey    私钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(privateKey.getBytes());
+        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.DECRYPT_MODE, privateK);
+        int inputLen = encryptedData.length;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        int offSet = 0;
+        byte[] cache;
+        int i = 0;
+        // 对数据分段解密
+        while (inputLen - offSet > 0) {
+            if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+                cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
+            } else {
+                cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
+            }
+            out.write(cache, 0, cache.length);
+            i++;
+            offSet = i * MAX_DECRYPT_BLOCK;
+        }
+        byte[] decryptedData = out.toByteArray();
+        out.close();
+        return decryptedData;
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param request
+     * @param publicKey
+     * @return
+     */
+    public static String encryptByPublicKey(String request, String publicKey) throws Exception {
+        return new String(Base64Utils.encode(SignatureUtils.encryptByPublicKey(request.getBytes(), publicKey)));
+    }
+
+    /**
+     * <p>
+     * 公钥加密
+     * </p>
+     *
+     * @param data      源数据
+     * @param publicKey 公钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(publicKey.getBytes());
+        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Key publicK = keyFactory.generatePublic(x509KeySpec);
+        // 对数据加密
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.ENCRYPT_MODE, publicK);
+        int inputLen = data.length;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        int offSet = 0;
+        byte[] cache;
+        int i = 0;
+        // 对数据分段加密
+        while (inputLen - offSet > 0) {
+            if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+                cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+            } else {
+                cache = cipher.doFinal(data, offSet, inputLen - offSet);
+            }
+            out.write(cache, 0, cache.length);
+            i++;
+            offSet = i * MAX_ENCRYPT_BLOCK;
+        }
+        byte[] encryptedData = out.toByteArray();
+        out.close();
+        return encryptedData;
+    }
+
+    /**
+     * 加签
+     *
+     * @param
+     * @param privateKey
+     * @return
+     */
+    public static String sign(String request, String privateKey) {
+        try {
+            return SignatureUtils.sign(request.getBytes(), privateKey);
+        } catch (Exception e) {
+            log.error("加签异常,inputParams: {} and privateKey: {}  and errorMessage: {}", request, privateKey, e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * <p>
+     * 用私钥对信息生成数字签名
+     * </p>
+     *
+     * @param data       已加密数据
+     * @param privateKey 私钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static String sign(byte[] data, String privateKey) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(privateKey.getBytes());
+        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initSign(privateK);
+        signature.update(data);
+        return new String(Base64Utils.encode(signature.sign()));
+    }
+
+}

+ 4 - 0
src/main/resources/application-pre.yml

@@ -275,6 +275,10 @@ dajia:
 bohai:
   api:
     url: http://uatwhale.bpic.com.cn/app-intermediary/gatewayFromPlat
+    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGw4XAPHi+K+/F1yb4pP3MTSOurAWsV+o2bzeVLaI+L4AYeXWhMSZ/L5yEX1OvpZKkBRD6KeIzDFqlP+wZ3qgt4n8MoaeA4//Zj4TSXbyXVPtFAtpeTidd7oWBJWcydvhtcWXrhBRh9wErYZ6+hCwh10JBWmSbTcDm0qY8PyqusQIDAQAB
+    selfPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIbDhcA8eL4r78XXJvik/cxNI66sBaxX6jZvN5Utoj4vgBh5daExJn8vnIRfU6+lkqQFEPop4jMMWqU/7BneqC3ifwyhp4Dj/9mPhNJdvJdU+0UC2l5OJ13uhYElZzJ2+G1xZeuEFGH3ASthnr6ELCHXQkFaZJtNwObSpjw/Kq6xAgMBAAECgYB2odAwNgukfVEJvCjWYYf6PT3YGh60ZIANg0JO1GkqjO4anXFrgLT+6Y7DCJfG296G/N7BGfXCMnHpXqgc7eDlmSy2JVfKzvptgKJBLktP7Yfajg3oY9S8parSK+iyHT6qYqQv6wBmQ3Q9smOp/TM2ndBMDXu9MjoTkNJhrfMDsQJBANbWHciQhazb3Y2DY42hW/zBf7rmmJFrw7aOrEjzw5E+SnGs/vcr3LUWBbSRTYHcoJ+V/kudfwRMlz0SLkfMAvMCQQCglcjNRx35Zw6vNKHE4vTN/ny2gukjvtkzXpPeTUfblrXjK3w3x9aWBZ/MUiphVe5NB8CAtlfYZMo4UG+WMEjLAkA4yHsyydArMinK/5FOm/meQt6p3c0xkpQ2KlurJJLqTtaKWTlCx1scmeeEJGuiCViDFbgS8FvkHQJUZ/vHikq1AkAHbUX/MHXTbg/AzKdaqsB1snpkGoPb0lzLQmmGU36qSjsZSY6SKdzjzVjJo1cwbz/5Mg2WJljDuk2b8yRmBs+nAkEAzoEZmM031u/0KBpukSbqef8JgJOZ0Do9KDbf2P6YuBal6drUeNYVhImKBxQAbjETp9m5TxxW/dkKmHCnc3zqsA==
+    boHaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIC3wgJd+7Wue63Qjdh3/uscQSKec2m9gaeCq007kjEiSFES5Tfx75VPSxRj6qk6XN4umHOsHY+W9jkv+Cj4+z3XpPozsRdoj21oxPx8fPJzpVeaUHrEkZtj9Yvo/KhByBK5sRjKmlENXVF3wXVfAg48JZR2XUyUcBdZhR9aHhoQIDAQAB
+    sysSourceCode: 00000080
 
 
 knife4j:

+ 4 - 0
src/main/resources/application-prod.yml

@@ -274,6 +274,10 @@ dajia:
 bohai:
   api:
     url: http://uatwhale.bpic.com.cn/app-intermediary/gatewayFromPlat
+    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGw4XAPHi+K+/F1yb4pP3MTSOurAWsV+o2bzeVLaI+L4AYeXWhMSZ/L5yEX1OvpZKkBRD6KeIzDFqlP+wZ3qgt4n8MoaeA4//Zj4TSXbyXVPtFAtpeTidd7oWBJWcydvhtcWXrhBRh9wErYZ6+hCwh10JBWmSbTcDm0qY8PyqusQIDAQAB
+    selfPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIbDhcA8eL4r78XXJvik/cxNI66sBaxX6jZvN5Utoj4vgBh5daExJn8vnIRfU6+lkqQFEPop4jMMWqU/7BneqC3ifwyhp4Dj/9mPhNJdvJdU+0UC2l5OJ13uhYElZzJ2+G1xZeuEFGH3ASthnr6ELCHXQkFaZJtNwObSpjw/Kq6xAgMBAAECgYB2odAwNgukfVEJvCjWYYf6PT3YGh60ZIANg0JO1GkqjO4anXFrgLT+6Y7DCJfG296G/N7BGfXCMnHpXqgc7eDlmSy2JVfKzvptgKJBLktP7Yfajg3oY9S8parSK+iyHT6qYqQv6wBmQ3Q9smOp/TM2ndBMDXu9MjoTkNJhrfMDsQJBANbWHciQhazb3Y2DY42hW/zBf7rmmJFrw7aOrEjzw5E+SnGs/vcr3LUWBbSRTYHcoJ+V/kudfwRMlz0SLkfMAvMCQQCglcjNRx35Zw6vNKHE4vTN/ny2gukjvtkzXpPeTUfblrXjK3w3x9aWBZ/MUiphVe5NB8CAtlfYZMo4UG+WMEjLAkA4yHsyydArMinK/5FOm/meQt6p3c0xkpQ2KlurJJLqTtaKWTlCx1scmeeEJGuiCViDFbgS8FvkHQJUZ/vHikq1AkAHbUX/MHXTbg/AzKdaqsB1snpkGoPb0lzLQmmGU36qSjsZSY6SKdzjzVjJo1cwbz/5Mg2WJljDuk2b8yRmBs+nAkEAzoEZmM031u/0KBpukSbqef8JgJOZ0Do9KDbf2P6YuBal6drUeNYVhImKBxQAbjETp9m5TxxW/dkKmHCnc3zqsA==
+    boHaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIC3wgJd+7Wue63Qjdh3/uscQSKec2m9gaeCq007kjEiSFES5Tfx75VPSxRj6qk6XN4umHOsHY+W9jkv+Cj4+z3XpPozsRdoj21oxPx8fPJzpVeaUHrEkZtj9Yvo/KhByBK5sRjKmlENXVF3wXVfAg48JZR2XUyUcBdZhR9aHhoQIDAQAB
+    sysSourceCode: 00000080
 
 
 knife4j:

+ 4 - 0
src/main/resources/application-test.yml

@@ -359,6 +359,10 @@ qrcode:
 bohai:
   api:
     url: http://uatwhale.bpic.com.cn/app-intermediary/gatewayFromPlat
+    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGw4XAPHi+K+/F1yb4pP3MTSOurAWsV+o2bzeVLaI+L4AYeXWhMSZ/L5yEX1OvpZKkBRD6KeIzDFqlP+wZ3qgt4n8MoaeA4//Zj4TSXbyXVPtFAtpeTidd7oWBJWcydvhtcWXrhBRh9wErYZ6+hCwh10JBWmSbTcDm0qY8PyqusQIDAQAB
+    selfPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIbDhcA8eL4r78XXJvik/cxNI66sBaxX6jZvN5Utoj4vgBh5daExJn8vnIRfU6+lkqQFEPop4jMMWqU/7BneqC3ifwyhp4Dj/9mPhNJdvJdU+0UC2l5OJ13uhYElZzJ2+G1xZeuEFGH3ASthnr6ELCHXQkFaZJtNwObSpjw/Kq6xAgMBAAECgYB2odAwNgukfVEJvCjWYYf6PT3YGh60ZIANg0JO1GkqjO4anXFrgLT+6Y7DCJfG296G/N7BGfXCMnHpXqgc7eDlmSy2JVfKzvptgKJBLktP7Yfajg3oY9S8parSK+iyHT6qYqQv6wBmQ3Q9smOp/TM2ndBMDXu9MjoTkNJhrfMDsQJBANbWHciQhazb3Y2DY42hW/zBf7rmmJFrw7aOrEjzw5E+SnGs/vcr3LUWBbSRTYHcoJ+V/kudfwRMlz0SLkfMAvMCQQCglcjNRx35Zw6vNKHE4vTN/ny2gukjvtkzXpPeTUfblrXjK3w3x9aWBZ/MUiphVe5NB8CAtlfYZMo4UG+WMEjLAkA4yHsyydArMinK/5FOm/meQt6p3c0xkpQ2KlurJJLqTtaKWTlCx1scmeeEJGuiCViDFbgS8FvkHQJUZ/vHikq1AkAHbUX/MHXTbg/AzKdaqsB1snpkGoPb0lzLQmmGU36qSjsZSY6SKdzjzVjJo1cwbz/5Mg2WJljDuk2b8yRmBs+nAkEAzoEZmM031u/0KBpukSbqef8JgJOZ0Do9KDbf2P6YuBal6drUeNYVhImKBxQAbjETp9m5TxxW/dkKmHCnc3zqsA==
+    boHaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIC3wgJd+7Wue63Qjdh3/uscQSKec2m9gaeCq007kjEiSFES5Tfx75VPSxRj6qk6XN4umHOsHY+W9jkv+Cj4+z3XpPozsRdoj21oxPx8fPJzpVeaUHrEkZtj9Yvo/KhByBK5sRjKmlENXVF3wXVfAg48JZR2XUyUcBdZhR9aHhoQIDAQAB
+    sysSourceCode: 00000080
 
 xxl:
   job: