1
0

4 Commity dad4b9b272 ... cd6a746841

Autor SHA1 Správa Dátum
  xyx cd6a746841 Merge remote-tracking branch 'origin/master' 1 mesiac pred
  xyx 926db81f44 赤峰润元堂初始化数据 1 mesiac pred
  xyx 0bd2e483d4 Merge remote-tracking branch 'origin/master' 1 mesiac pred
  xyx 5aca6865d4 红衫健康加密工具类 1 mesiac pred

+ 284 - 0
fs-common/src/main/java/com/fs/common/utils/RedwoodCryptoUtil.java

@@ -0,0 +1,284 @@
+package com.fs.common.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.TreeMap;
+
+/**
+ * 红杉健康开放平台加解密工具类
+ * 遵循文档规则:AES-256-CBC加密内容 + RSA加密AES密钥 + MD5签名
+ */
+public class RedwoodCryptoUtil {
+
+    // 加密算法配置(与文档一致)
+    private static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding";
+    private static final String AES_KEY_ALGORITHM = "AES";
+    private static final int AES_KEY_LENGTH = 256;
+    private static final String RSA_ALGORITHM = "RSA/ECB/PKCS1Padding";
+    private static final String RSA_KEY_ALGORITHM = "RSA";
+    private static final String SIGN_ALGORITHM = "MD5";
+
+    // 配置参数(需根据实际环境替换)
+    private final String appSecret; // 平台提供的应用秘钥(作为AES初始化向量IV)
+    private final String platformPublicKey; // 红杉平台RSA公钥(加密AES密钥用)
+    private final String thirdPrivateKey; // 三方平台RSA私钥(解密响应密钥用)
+
+    /**
+     * 构造函数:初始化配置参数
+     *
+     * @param appSecret         平台应用秘钥(文档中appsecret)
+     * @param platformPublicKey 红杉平台RSA公钥(Base64编码)
+     * @param thirdPrivateKey   三方平台RSA私钥(Base64编码)
+     */
+    public RedwoodCryptoUtil(String appSecret, String platformPublicKey, String thirdPrivateKey) {
+        this.appSecret = appSecret;
+        this.platformPublicKey = platformPublicKey;
+        this.thirdPrivateKey = thirdPrivateKey;
+    }
+
+    /**
+     * 加密请求参数:生成接口所需的content、key、sign
+     *
+     * @param plainParam 明文请求参数(Map格式)
+     * @return 加密后的请求参数Map(包含content、key、sign)
+     * @throws Exception 加密异常
+     */
+    public Map<String, String> encryptRequest(Map<String, Object> plainParam) throws Exception {
+        // 1. 参数按ASCII码排序并转为JSON字符串(不转义Unicode)
+        Map<String, Object> sortedMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+        sortedMap.putAll(plainParam);
+        String contentStr = new String(
+                JSON.toJSONBytes(sortedMap, SerializerFeature.BrowserCompatible)
+        );
+
+        // 2. 生成32位随机AES密钥(randStr)
+        String aesKey = generateRandomAesKey();
+
+        // 3. AES-256-CBC加密contentStr(IV为appSecret)
+        String encryptedContent = aesEncrypt(contentStr, aesKey, appSecret);
+
+        // 4. MD5生成签名(对原始contentStr)
+        String sign = generateSign(contentStr);
+
+        // 5. 用平台公钥加密AES密钥(RSA-PKCS1-SHA256)
+        String encryptedAesKey = rsaEncrypt(aesKey, platformPublicKey);
+
+        // 6. 返回加密结果(Base64编码后)
+        Map<String, String> encryptedParam = new HashMap<>();
+        encryptedParam.put("content", Base64.encodeBase64String(encryptedContent.getBytes()));
+        encryptedParam.put("key", Base64.encodeBase64String(encryptedAesKey.getBytes()));
+        encryptedParam.put("sign", sign);
+        return encryptedParam;
+    }
+
+    /**
+     * 解密响应参数:从content、key、sign中还原明文
+     *
+     * @param encryptedResponse 加密响应参数(包含content、key、sign)
+     * @return 明文响应结果(Map格式)
+     * @throws Exception 解密异常
+     */
+    public Map<String, Object> decryptResponse(Map<String, String> encryptedResponse) throws Exception {
+        // 1. 提取加密字段并Base64解码
+        String encryptedContent = new String(Base64.decodeBase64(encryptedResponse.get("content")));
+        String encryptedAesKey = new String(Base64.decodeBase64(encryptedResponse.get("key")));
+        String sign = encryptedResponse.get("sign");
+
+        // 2. 用三方私钥解密AES密钥
+        String aesKey = rsaDecrypt(encryptedAesKey, thirdPrivateKey);
+
+        // 3. AES-256-CBC解密content(IV为appSecret)
+        String contentStr = aesDecrypt(encryptedContent, aesKey, appSecret);
+
+        // 4. 验证签名(防止数据篡改)
+        if (!verifySign(contentStr, sign)) {
+            throw new SecurityException("签名验证失败,数据可能被篡改");
+        }
+
+        // 5. 解析JSON为Map返回
+        return JSON.parseObject(contentStr, Map.class);
+    }
+
+    /**
+     * AES加密(AES-256-CBC)
+     */
+    private String aesEncrypt(String content, String key, String iv) throws Exception {
+        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), AES_KEY_ALGORITHM);
+        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
+        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
+        byte[] encryptedBytes = cipher.doFinal(content.getBytes("UTF-8"));
+        return Base64.encodeBase64String(encryptedBytes);
+    }
+
+    /**
+     * AES解密(AES-256-CBC)
+     */
+    private String aesDecrypt(String encryptedContent, String key, String iv) throws Exception {
+        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), AES_KEY_ALGORITHM);
+        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
+        Cipher cipher = Cipher.getInstance(AES_ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
+        byte[] decryptedBytes = cipher.doFinal(Base64.decodeBase64(encryptedContent));
+        return new String(decryptedBytes, "UTF-8");
+    }
+
+    /**
+     * RSA加密(用公钥加密AES密钥)
+     */
+    private String rsaEncrypt(String content, String publicKeyStr) throws Exception {
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
+        PublicKey publicKey = KeyFactory.getInstance(RSA_KEY_ALGORITHM).generatePublic(keySpec);
+        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        byte[] encryptedBytes = cipher.doFinal(content.getBytes("UTF-8"));
+        return Base64.encodeBase64String(encryptedBytes);
+    }
+
+    /**
+     * RSA解密(用私钥解密AES密钥)
+     */
+    private String rsaDecrypt(String encryptedContent, String privateKeyStr) throws Exception {
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
+        PrivateKey privateKey = KeyFactory.getInstance(RSA_KEY_ALGORITHM).generatePrivate(keySpec);
+        Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+        byte[] decryptedBytes = cipher.doFinal(Base64.decodeBase64(encryptedContent));
+        return new String(decryptedBytes, "UTF-8");
+    }
+
+    /**
+     * 生成MD5签名
+     */
+    private String generateSign(String content) throws Exception {
+        MessageDigest md5 = MessageDigest.getInstance(SIGN_ALGORITHM);
+        byte[] signBytes = md5.digest(content.getBytes("UTF-8"));
+        return bytesToHex(signBytes);
+    }
+
+    /**
+     * 验证MD5签名
+     */
+    private boolean verifySign(String content, String sign) throws Exception {
+        String generatedSign = generateSign(content);
+        return generatedSign.equalsIgnoreCase(sign);
+    }
+
+    /**
+     * 生成32位随机AES密钥(字母+数字)
+     */
+    private String generateRandomAesKey() {
+        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+        StringBuilder sb = new StringBuilder(32);
+        Random random = new SecureRandom();
+        for (int i = 0; i < 32; i++) {
+            sb.append(chars.charAt(random.nextInt(chars.length())));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 字节数组转16进制字符串
+     */
+    private String bytesToHex(byte[] bytes) {
+        StringBuilder hex = new StringBuilder();
+        for (byte b : bytes) {
+            String hexStr = Integer.toHexString(b & 0xFF);
+            if (hexStr.length() == 1) {
+                hex.append("0");
+            }
+            hex.append(hexStr);
+        }
+        return hex.toString();
+    }
+
+    /**
+     * 生成RSA密钥对,用于platformPublicKey和thirdPrivateKey
+     */
+    public static void generateRSAKeyPair() throws Exception {
+        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
+        keyPairGenerator.initialize(2048); // 使用2048位密钥长度
+        KeyPair keyPair = keyPairGenerator.generateKeyPair();
+
+        PublicKey publicKey = keyPair.getPublic();
+        PrivateKey privateKey = keyPair.getPrivate();
+
+        // 获取Base64编码的公钥和私钥
+        String publicKeyStr = Base64.encodeBase64String(publicKey.getEncoded());
+        String privateKeyStr = Base64.encodeBase64String(privateKey.getEncoded());
+
+        System.out.println("公钥 (platformPublicKey):");
+        System.out.println(wrapPublicKey(publicKeyStr));
+        System.out.println();
+        System.out.println("私钥 (thirdPrivateKey):");
+        System.out.println(privateKeyStr);
+    }
+
+    /**
+     * 将公钥包装成PEM格式
+     */
+    private static String wrapPublicKey(String publicKey) {
+        return "-----BEGIN PUBLIC KEY-----\n" +
+                splitLines(publicKey) +
+                "\n-----END PUBLIC KEY-----";
+    }
+
+    /**
+     * 将长Base64字符串按64字符分行
+     */
+    private static String splitLines(String base64Str) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < base64Str.length(); i += 64) {
+            if (sb.length() > 0) sb.append("\n");
+            sb.append(base64Str.substring(i, Math.min(i + 64, base64Str.length())));
+        }
+        return sb.toString();
+    }
+
+    // ------------------------------ 测试示例 ------------------------------
+    public static void main(String[] args) throws Exception {
+        // 1. 配置参数(替换为文档中的测试参数或实际环境参数)
+        String appSecret = "uuRKVwbfSutCpFTv"; // 文档中测试appsecret
+        String platformPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk2oCpi9eSMqcmqO3rrMN\n" +
+                "b9fqEFMckcRkU520PXyxFalzA2mfLNgNPe8TB9mBSqn7xPxLBBBOSaFwEAeAAs4E\n" +
+                "AojMVilbfrTXJh3ucyKlGvTpX3lMKgJaYG7asEzKVbw5V4j8oTBtNh3s20jP7zBm\n" +
+                "Y61opsLTIW0qiuvMxezJS8wHc6ajY99RHWBASd3AGozsc3cFLSgIUyh2BhcbB2l7\n" +
+                "V8UyDQj7+QI1BwNpkvGxYhP0DF4Yu7buaaf61gygkeeOZ/8JOjcDWBfVB6Q6wEja\n" +
+                "os0E9U+rYXN6v90va1wrRp+zRev4sMBWesvwc6uzcuYO/RfSJ19FDMUreCScm8tk\n" +
+                "PQIDAQAB"; // 文档中测试红杉密钥-公钥
+        String thirdPrivateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCTagKmL15Iypyao7eusw1v1+oQUxyRxGRTnbQ9fLEVqXMDaZ8s2A097xMH2YFKqfvE/EsEEE5JoXAQB4ACzgQCiMxWKVt+tNcmHe5zIqUa9OlfeUwqAlpgbtqwTMpVvDlXiPyhMG02HezbSM/vMGZjrWimwtMhbSqK68zF7MlLzAdzpqNj31EdYEBJ3cAajOxzdwUtKAhTKHYGFxsHaXtXxTINCPv5AjUHA2mS8bFiE/QMXhi7tu5pp/rWDKCR545n/wk6NwNYF9UHpDrASNqizQT1T6thc3q/3S9rXCtGn7NF6/iwwFZ6y/Bzq7Ny5g79F9InX0UMxSt4JJyby2Q9AgMBAAECggEAEqfp6eo4vnGV3CQ4DM3wN2VV4/cAuJnoMITW2Kk9KAan3ZiyYlR9aIcnG2k1aaOVj1p2i+8cWUkrC3xHgRNdgoyZf5YAVErCp7pGASAzUPQJzOFm+DIQCgA9gO5W9P67Kw7VGfks+RpUbXQLjLPNYXQCuIgTfDl6ltY8the/ae4Y/a4dyhBhQ+Q/sygACk/Woiq7B78pc/qCaeMyZyik42aVuC7ZMuIgzERSOBFDrerI/upBWmLE4faeUk4h/PE1Hrj+H2RJ9aM5j4Idn/AJ4H4r8TjzT5m+ldQBfErs37HAVbyP1lQJjmO+VBBvqFchGNDtU1yGIRpxfU5mJI5dQQKBgQDRFPe+IKsheKNF2z0EUke/hU+XIDNc3Qwvp+2ok78G3LiKLRM61II/k+N0PLmJii0JEjqF0figj83Cyr4nnbhymOKIIplftgv085E1ed6QH0m54AwJBCLLA6gHiHin1t21Xh7o38FF6pHQ6EnQjfnVCODkTKxQEihvV3oAv/UBeQKBgQC0fnDPZ29YcIdI2W6xteDFaBfWLTw9usHDu2NnZBPEa+E5Whvcnw6xCgYEI+yasGEt9wOG6tnMEaxIMHRtn7LXaa7nrYxvqE5yTCLpjle3NM3KJRoCxZvOzJwlGWKFRPVpxBe1Sm0DB/IfTbBqzYCVkKQgpnqcpyI91TvxBL/r5QKBgA/bETaf75poNamUiLoNK1fA2lpRnNOMB+KNT56bJb91eaEw7eZmO0JrCrLD8CYYDnZDpaCEXeB/R1FgYq9KbLR0F6nPReZWPe3jkr2FcnVnigXIkeEVKTZQHqwDk3LW/pVEf/+VCGku8sPu+boRKkMXm0Z08hRYbCyVa7Em3YOxAoGAOomzfqC2TQGZ7reOHha1wnBjIrRjEEYsp5VzxMmBW7f9QMOHu8LeWe69SsR37Sd9LRIq06wBXRzyOit050TfFNwSvNLddC0q3AjzXbormqCGiaQEzpdWU/iqP6H/AOf/jADsC4EK3+vIy/w/VjQ2GsvhXzF/HKVcBp/Mo/t9Xz0CgYACKTI8f7z43g6MHy0+QOYBJ4BBDS8SzhLdNIXoUnc4O8kySTospxNVRzZGUMKJ4R8T7bpfR+50H6nCxBZo125eD4lcMHL3Dd/JwabKSer7Nzjt7+UMbgncQIs3m9FjtP1rvYuHvHI7RbxFH+hrYVWMKysWpbS9xtMThF9BosmufA=="; // 文档中测试三方密钥-私钥
+
+        // 2. 创建工具类实例
+        RedwoodCryptoUtil cryptoUtil = new RedwoodCryptoUtil(appSecret, platformPublicKey, thirdPrivateKey);
+
+        // 3. 加密请求参数示例(模拟购药问诊申请参数)
+        Map<String, Object> plainParam = new HashMap<>();
+        plainParam.put("prescription_type", 1);
+        plainParam.put("register_type", "picture");
+        plainParam.put("union_code", "TEST20250819001");
+        // 其他参数按接口要求补充...
+
+        Map<String, String> encryptedParam = cryptoUtil.encryptRequest(plainParam);
+        System.out.println("加密后的请求参数:" + encryptedParam);
+
+        // 4. 解密响应参数示例(模拟接口返回的加密数据)
+        Map<String, String> mockEncryptedResponse = new HashMap<>();
+        mockEncryptedResponse.put("content", "加密后的content");
+        mockEncryptedResponse.put("key", "加密后的key");
+        mockEncryptedResponse.put("sign", "加密后的sign");
+
+        Map<String, Object> plainResponse = cryptoUtil.decryptResponse(mockEncryptedResponse);
+        System.out.println("解密后的响应结果:" + plainResponse);
+    }
+}

+ 95 - 0
fs-service/src/main/resources/application-config-druid-cfryt.yml

@@ -0,0 +1,95 @@
+baidu:
+  token: 1
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: w   #中康智慧
+        secret: 5
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+      - appid: w   #中康未来智慧药房
+        secret: 9
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwb
+    appConfigs:
+      - agentId: 100005
+        secret: ec7okROXJqkNafq66aKNv0asTzQIG0CYrj3vyBbo
+        token: PPKOdAloMO
+        aesKey: PKvaxtpSvNGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId: wx #微信公众号或者小程序等的appid
+    mchId: 1611045 #微信支付商户号
+    mchKey: 8cab128997a3547c10898b877f38 #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://usepp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+      - appId: wx17f36a56c701bdea # 第一个公众号的appid   //公众号名称
+        secret: 185030bbe7f8d7a0c16b94dd9d4ea542 # 公众号的appsecret
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVcw03qZy6Wllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17ef358c610dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+#  account: tcloud
+#  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://159.75.111.224:8010
+  h5CommonApi: http://159.75.111.224:8010
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: syysy-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: syysy
+cloud_host:
+  company_name: 赤峰润
+  projectCode: SYYSY
+#看课授权时显示的头像
+headerImg:
+  imgUrl: https://ysy-1329817240.cos.ap-guangzhou.myqcloud.com/ysy/20250820/2c47e4f105b641b4a49df50a77338e32.png
+ipad:
+  ipadUrl: http://ipad.ysya.top
+  aiApi: http://49.232.181.28:3000/api
+  voiceApi:
+  commonApi:
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+# 聚水潭API配置
+jst:
+  app_key: 5dea3c46f0214985b1fd43d6428b2b12 #聚水潭2025-09-03
+  app_secret: 3f382758a4f4470e80932a24912be0ce #聚水潭2025-09-0
+  authorization_code: 999999
+  shop_code: "18886784"

+ 172 - 0
fs-service/src/main/resources/application-druid-cfryt.yml

@@ -0,0 +1,172 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-cfryt,common
+    # redis 配置
+    redis:
+        host: r-2zenxuh8uodh6yqsbw.redis.rds.aliyuncs.com
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrz_tM8
+        # 连接超时时间
+        timeout: 10s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 8
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+        #        clickhouse:
+        #            type: com.alibaba.druid.pool.DruidDataSource
+        #            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+        #            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+        #            username: rt_2024
+        #            password: Yzx_19860213
+        #            initialSize: 10
+        #            maxActive: 100
+        #            minIdle: 10
+        #            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://rm-2ze62885pk08tlkf7.mysql.rds.aliyuncs.com:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_tM818782145I@
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    url: jdbc:mysql://rm-2ze62885pk08tlkf7.mysql.rds.aliyuncs.com:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_tM818782145I@
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 2000
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://rm-2ze62885pk08tlkf7.mysql.rds.aliyuncs.com:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                    username: root
+                    password: Ylrz_tM818782145I@
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 200
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+    producer:
+        group: my-producer-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+    consumer:
+        group: voice-group
+        access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+        secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+custom:
+    token: "1o62d3YxvdHd4LEUiltnu7sK"
+    encoding-aes-key: "UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU"
+    corp-id: "ww51717e2b71d5e2d3"
+    secret: "6ODAmw-8W4t6h9mdzHh2Z4Apwj8mnsyRnjEDZOHdA7k"
+    private-key-path: "privatekey.pem"
+    webhook-url: "https://your-server.com/wecom/archive"
+# token配置
+token:
+    # 令牌自定义标识
+    header: Authorization
+    # 令牌密钥
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 令牌有效期(默认30分钟)
+    expireTime: 180
+openIM:
+    secret: openIM123
+    userID: imAdmin
+    url: https://web.im.ysya.top/api
+#是否使用新im
+im:
+    type: OPENIM
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: true
+