Pu Zhibing
5 天以前 072d5dbd7642935056857268af4ab187035d7eec
添加证联集成
9个文件已修改
3个文件已删除
6个文件已添加
955 ■■■■ 已修改文件
DriverQYTTravel/guns-admin/lib/ncoss-java-sdk-1.0.5.jar 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/lib/zl-util-security-1.2.2.jar 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/pom.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/NCOSSUtil.java 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/CallbackUtil.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/SM4Util.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/TokenUtil.java 93 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZLHttpClientUtil.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianUtil.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/MessageBody.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/OpenAccountCallbackRequest.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TokenRequest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/lib/ncoss-java-sdk-1.0.5.jar
Binary files differ
DriverQYTTravel/guns-admin/lib/zl-util-security-1.2.2.jar
Binary files differ
DriverQYTTravel/guns-admin/pom.xml
@@ -80,19 +80,6 @@
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>compile</scope>
<!--            <scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--shiro依赖-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
@@ -132,11 +119,11 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.16.8</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.redisson</groupId>-->
<!--            <artifactId>redisson-spring-boot-starter</artifactId>-->
<!--            <version>3.14.0</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
@@ -145,7 +132,7 @@
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
@@ -228,19 +215,19 @@
            <artifactId>commons-codec</artifactId>
            <version>1.13</version>
        </dependency>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <!--中台sdk-->
        <dependency>
            <groupId>com.zhongtai</groupId>
@@ -261,21 +248,20 @@
            <scope>system</scope>
            <systemPath>${pom.basedir}/lib/javabase64-1.3.1.jar</systemPath>
        </dependency>
        <!--证联sdk-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <groupId>zl</groupId>
            <artifactId>security</artifactId>
            <version>1.2.2</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/lib/zl-util-security-1.2.2.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
    </dependencies>
    <build>
        <!--打包jar包方式-->
        <plugins>
@@ -288,7 +274,7 @@
                </configuration>
            </plugin>
        </plugins>
        <!--打包war包引入本地jar的打包方式-->
        <!--        <plugins>-->
        <!--            <plugin>-->
@@ -317,8 +303,8 @@
        <!--                </configuration>-->
        <!--            </plugin>-->
        <!--        </plugins>-->
        <resources>
            <resource>
                <directory>${project.basedir}/lib</directory>
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
@@ -25,6 +25,11 @@
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.WeChatUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.QianYunTongConfig;
import com.stylefeng.guns.modular.system.util.zhenglian.CallbackUtil;
import com.stylefeng.guns.modular.system.util.zhenglian.TokenUtil;
import com.stylefeng.guns.modular.system.util.zhenglian.model.MessageBody;
import com.stylefeng.guns.modular.system.util.zhenglian.model.TokenRequest;
import com.stylefeng.guns.modular.system.util.zhenglian.model.TradeTerminalInfo;
import com.stylefeng.guns.modular.system.warpper.*;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
@@ -128,6 +133,9 @@
    
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private WeChatUtil weChatUtil;
    
    /**
     * 获取短信验证码
@@ -1737,8 +1745,7 @@
        }
    }
    @Autowired
    private WeChatUtil weChatUtil;
    
    @ResponseBody
    @PostMapping("/api/driver/getDriverCode")
@@ -1817,40 +1824,51 @@
        }
    }
    
//    @ResponseBody
//    @RequestMapping(value = "/base/driver/uploadImg", method = RequestMethod.POST)
//    @ApiOperation(value = "上传图片", tags = {"司机端-注册"}, notes = "")
//    public ResultUtil uploadImg(MultipartFile file) {
//        try {
//            String bucketName = "grjy_test";
//            Bucket grjyTest = NCOSSUtil.getBucketInfo(bucketName);
//            if (null == grjyTest) {
//                //创建桶
//                Boolean bucket = NCOSSUtil.createBucket(bucketName);
//                if (!bucket) {
//                    return ResultUtil.error("创建存储桶失败");
//                }
//                //设置桶策略
//                String policyText = "{\"Version\":\"2025-06-23\",\"Statement\":[{\"Sid\":\"Stmt20250623\",\"Action\":[\"GetObject\"]" +
//                        ",\"Effect\":\"Allow\",\"Resource\":[\"" + bucketName + "\"/*],\"Principal\":{*}}]}";
//                Boolean bucketPolicy = NCOSSUtil.setBucketPolicy(bucketName, policyText);
//                if (!bucketPolicy) {
//                    return ResultUtil.error("设置桶策略失败");
//                }
//            }
//            //上传对象
//            String key = "image/driver/" + UUID.randomUUID().toString() + ".png";
//            String object = NCOSSUtil.putObject(bucketName, key, file.getInputStream());
//            if (null == object) {
//                return ResultUtil.error("上传图片失败");
//            }
//
//            return ResultUtil.success("http://" + QianYunTongProperties.endPoint + "/" + key);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return ResultUtil.runErr();
//        }
//    }
    @ResponseBody
    @PostMapping("/api/driver/getZLToken")
    @ApiOperation(value = "获取证联token(黔云通)", tags = {"司机端-首页"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."),
            @ApiImplicitParam(value = "当前设备IP地址", name = "ip", required = true, dataType = "String"),
            @ApiImplicitParam(value = "当前设备mac地址", name = "mac", required = true, dataType = "String"),
    })
    public ResultUtil<String> getZLToken(String ip, String mac, HttpServletRequest request){
        try {
            Integer driverId = driverService.getUserIdFormRedis(request);
            if (null == driverId) {
                return ResultUtil.tokenErr();
            }
            Driver driver = driverService.selectById(driverId);
            TokenRequest tokenRequest = new TokenRequest();
            tokenRequest.setAppUserId(driver.getEmpId().toString());
            tokenRequest.setUserName(driver.getName());
            tokenRequest.setCertNo(driver.getIdCard());
            tokenRequest.setPhone(driver.getPhone());
            TradeTerminalInfo tradeTerminalInfo = new TradeTerminalInfo();
            tradeTerminalInfo.setIp(ip);
            tradeTerminalInfo.setTerminal("1");
            tradeTerminalInfo.setMac(mac);
            tokenRequest.setTradeTerminalInfo(tradeTerminalInfo);
            String token = TokenUtil.getToken(tokenRequest);
            return ResultUtil.success(token);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    /**
     * 证联通知回调
     * @param messageBody
     * @param request
     * @return
     */
    @ResponseBody
    @PostMapping("/base/driver/zlCallback")
    public void zlCallback(@RequestBody MessageBody messageBody, HttpServletRequest request){
        String callback = CallbackUtil.callback(messageBody);
        System.err.println("证联通知回调:" + callback);
        log.info("证联通知回调:" + callback);
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java
@@ -27,8 +27,6 @@
import com.stylefeng.guns.modular.system.warpper.OrderListWarpper;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
@@ -97,8 +95,8 @@
    @Autowired
    private IAdditionalFeeService additionalFeeService;
    
    @Autowired
    private RedissonClient redissonClient;
//    @Autowired
//    private RedissonClient redissonClient;
    @Autowired
    private IOpenCityService openCityService;
@@ -511,10 +509,10 @@
    public ResultUtil grabOrder(Integer orderId, Integer orderType, Integer uid) throws Exception {
        //专车和出租是批量下单,所以这里需要将两种类型的抢单操作通过一个锁来一起控制
        if(1 == orderType || 2 == orderType){
            RLock lock = redissonClient.getLock("grabOrder:" + orderId);
            if(!lock.tryLock()){
                return ResultUtil.error("抢单失败,请稍后重试");
            }
//            RLock lock = redissonClient.getLock("grabOrder:" + orderId);
//            if(!lock.tryLock()){
//                return ResultUtil.error("抢单失败,请稍后重试");
//            }
            try {
                if(1 == orderType){
                    return orderPrivateCarService.grabOrder(orderId, uid);
@@ -525,7 +523,7 @@
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
//                lock.unlock();
            }
        }
        switch (orderType){
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/NCOSSUtil.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/CallbackUtil.java
New file
@@ -0,0 +1,47 @@
package com.stylefeng.guns.modular.system.util.zhenglian;
import com.stylefeng.guns.modular.system.util.SpringContextsUtil;
import com.stylefeng.guns.modular.system.util.zhenglian.model.MessageBody;
import com.zlpay.assist.encrypt.sm4.SM4Util;
import com.zlpay.assist.sign.sm2.SM2Util;
import lombok.extern.slf4j.Slf4j;
/**
 * @author zhibing.pu
 * @Date 2025/7/28 14:25
 */
@Slf4j
public class CallbackUtil {
    private static ZhengLianConfig zhengLianConfig = SpringContextsUtil.getBean(ZhengLianConfig.class).getZhengLianConfig();
    public static String callback(MessageBody messageBody) {
        try {
            String data = messageBody.getData();
            String sign = messageBody.getSign();
            String secret = messageBody.getSecret();
            //加密对称加密的秘钥
            // 获取公钥
            String publicKey = ZhengLianUtil.getPublicKey();
            // 验签
            boolean checkResult = SM2Util.verify(publicKey, zhengLianConfig.getEncrpNo(), sign, data);
            System.out.println("验签结果:" + checkResult);
            // 获取私钥
            String privateKey = ZhengLianUtil.getPrivateKey();
            // 解密对称秘钥
            String k = SM2Util.decrypt(privateKey, secret);
            System.out.println("对称秘钥:" + k);
            // 解密业务报文
            String backData = SM4Util.sm4EcbDecrypt(k, data);
            System.out.println("业务报文:" + backData);
            return backData;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/SM4Util.java
File was deleted
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/TokenUtil.java
@@ -1,44 +1,89 @@
package com.stylefeng.guns.modular.system.util.zhenglian;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.stylefeng.guns.modular.system.util.SpringContextsUtil;
import com.stylefeng.guns.modular.system.util.UUIDUtil;
import com.stylefeng.guns.modular.system.util.zhenglian.model.MessageBody;
import com.stylefeng.guns.modular.system.util.zhenglian.model.TokenRequest;
import com.zlpay.assist.encrypt.sm4.SM4Util;
import com.zlpay.assist.sign.sm2.SM2Util;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @author zhibing.pu
 * @Date 2025/7/24 14:06
 */
@Slf4j
public class TokenUtil {
    private static ZhengLianConfig zhengLianConfig = SpringContextsUtil.getBean(ZhengLianConfig.class).getZhengLianConfig();
    
    public static void getToken(TokenRequest request){
        request.setAppid(zhengLianConfig.getAppid());
        HttpRequest post = HttpUtil.createPost(zhengLianConfig.getUrl());
        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        post.header("msgId", UUIDUtil.getRandomCode());
        post.header("merchNo", zhengLianConfig.getMerchNo());
        post.header("txCode","ZLPAY.ACC.T0001");
        post.header("version","1.0.1");
        post.header("encrp","1");
        post.header("signa","1");
        post.header("encrpNo","123456");
        post.header("signNo","123456");
        post.header("timestamp", timestamp);
        post.header("Content-Length", "");
        post.header("Content-Type", "application/json;charset=utf-8");
    public static String getToken(TokenRequest tokenRequest) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        Map<String,String> headerMap = new HashMap<String,String>();
        MessageBody body = new MessageBody();
        headerMap.put("msgId", UUIDUtil.getRandomCode());
        headerMap.put("merchNo", "B00000871");
        headerMap.put("txCode", "ZLPAY.ACC.T0001");
        headerMap.put("version", "1.0.1");
        headerMap.put("signa", "1");
        headerMap.put("signNo", zhengLianConfig.getSignNo());
        headerMap.put("encrp", "1");
        headerMap.put("encrpNo", zhengLianConfig.getEncrpNo());
        headerMap.put("timestamp", sdf.format(new Date()));
        
        
        tokenRequest.setAppId(zhengLianConfig.getAppid());
        tokenRequest.setType("04");
        String reqBO = JSON.toJSONString(tokenRequest);
        // 生成对称加密秘钥
        String key = ZhengLianUtil.generateKey(16);
        // 加密数据
        String jsonData = SM4Util.sm4EcbEncrypt(key, reqBO, "NoPadding");
        //加密对称加密的秘钥
        // 获取公钥
        String publicKey = ZhengLianUtil.getPublicKey();
        String secrtKey = SM2Util.encrypt(publicKey, key);
        
        post.body("{}");
        // 将密文放入body
        body.setData(jsonData);
        body.setSign(ZhengLianUtil.sign(jsonData));
        body.setSecret(secrtKey);
        String result = ZLHttpClientUtil.doPost(zhengLianConfig.getUrl(), headerMap, JSON.toJSONString(body));
        
        System.out.println("应答内容:"+ result);
        MessageBody respBody = JSON.parseObject(result,MessageBody.class);
        // 验签
        boolean checkResult = SM2Util.verify(publicKey, zhengLianConfig.getEncrpNo(), respBody.getSign(), respBody.getData());
        System.out.println("验签结果:" + checkResult);
        // 获取私钥
        String privateKey = ZhengLianUtil.getPrivateKey();
        // 解密对称秘钥
        String k = SM2Util.decrypt(privateKey, respBody.getSecret());
        System.out.println("对称秘钥:" + k);
        // 解密业务报文
        String backData = SM4Util.sm4EcbDecrypt(k, respBody.getData());
        System.out.println("返回业务报文:" + backData);
        JSONObject jsonObject = JSON.parseObject(backData);
        String sysRtnCode = jsonObject.getString("sysRtnCode");
        if(!"000000".equals(sysRtnCode)){
            log.error("获取token失败!{}", jsonObject.getString("sysRtnMsg"));
            throw new Exception(jsonObject.getString("sysRtnMsg"));
        }
        JSONObject bizData = jsonObject.getJSONObject("bizData");
        String resCode = bizData.getString("resCode");
        if(!"S010000".equals(resCode)){
            log.error("获取token失败!{}", bizData.getString("resMsg"));
            throw new Exception(jsonObject.getString("resMsg"));
        }
        return bizData.getString("token");
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZLHttpClientUtil.java
New file
@@ -0,0 +1,129 @@
package com.stylefeng.guns.modular.system.util.zhenglian;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
 * @author zhibing.pu
 * @Date 2025/7/28 14:23
 */
public class ZLHttpClientUtil {
    /**
     * 连接超时时间
     */
    private final static int CONNECT_TIMEOUT = 30000;
    /**
     * 请求超时时间
     */
    private final static int REQUEST_TIMEOUT = 50000;
    /**
     * socket超时时间
     */
    private final static int SOCKET_TIMEOUT = 50000;
    /**
     * 请求格式
     */
    private final static String FORMAT = "application/json";
    /**
     * 请求类型
     */
    private final static String POST_TYPE = "https://";
    public static String doPost(String url, Map<String, String> headerMap, String jsonData) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        if (url != null && url.startsWith(POST_TYPE)) {
            httpClient = sslClient();
        }
        HttpPost httpPost = new HttpPost(url);
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT)
                .setConnectionRequestTimeout(REQUEST_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).setRedirectsEnabled(true)
                .build();
        httpPost.setConfig(requestConfig);
        httpPost.setHeader("Content-Type", "application/json");
        if (headerMap != null) {
            Set<String> keys = headerMap.keySet();
            for (Iterator<String> i = keys.iterator(); i.hasNext();) {
                String key = (String) i.next();
                httpPost.addHeader(key, headerMap.get(key));
            }
        }
        try {
            httpPost.setEntity(new StringEntity(jsonData, ContentType.create(FORMAT, "UTF-8")));
            CloseableHttpResponse execute = httpClient.execute(httpPost);
            int statusCode = execute.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                return String.valueOf(EntityUtils.toString(execute.getEntity()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
    private static CloseableHttpClient sslClient() {
        try {
            X509TrustManager trustManager = new X509TrustManager() {
                @Override public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
                @Override public void checkClientTrusted(X509Certificate[] xcs, String str) {}
                @Override public void checkServerTrusted(X509Certificate[] xcs, String str) {}
            };
            SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
            ctx.init(null, new TrustManager[] { trustManager }, null);
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
            // 创建Registry
            RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT)
                    .setExpectContinueEnabled(Boolean.TRUE).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,AuthSchemes.DIGEST))
                    .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE)
                    .register("https",socketFactory).build();
            // 创建ConnectionManager,添加Connection配置信息
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager)
                    .setDefaultRequestConfig(requestConfig).build();
            return closeableHttpClient;
        } catch (KeyManagementException ex) {
            throw new RuntimeException(ex);
        } catch (NoSuchAlgorithmException ex) {
            throw new RuntimeException(ex);
        }
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java
@@ -34,6 +34,18 @@
     * 签名证书序列号
     */
    private String signNo;
    /**
     * 证书
     */
    private String cer;
    /**
     * 证书
     */
    private String sm2;
    /**
     *
     */
    private String password;
    
    /**
     * 获取不同环境的配置
@@ -44,15 +56,21 @@
            this.url = "https://gatewaytest.zqpay.com";
            this.appid = "F9BFEEA567196A92E053376010ACF004";
            this.merchNo = "B00000871";
            this.encrpNo = "123456";
            this.signNo = "123456";
            this.encrpNo = "1055490595";
            this.signNo = "1066348524";
            this.cer = "C:\\Users\\39373\\Desktop\\UAT-demo-公用\\1055490595.cer";
            this.sm2 = "C:\\Users\\39373\\Desktop\\UAT-demo-公用\\871_111111.sm2";
            this.password = "111111";
        }
        if("test".equals(activeProfile)){
            this.url = "https://gatewaytest.zqpay.com";
            this.appid = "F9BFEEA567196A92E053376010ACF004";
            this.merchNo = "B00000871";
            this.encrpNo = "123456";
            this.signNo = "123456";
            this.encrpNo = "1055490595";
            this.signNo = "1066348524";
            this.cer = "C:\\Users\\39373\\Desktop\\UAT-demo-公用\\1055490595.cer";
            this.sm2 = "C:\\Users\\39373\\Desktop\\UAT-demo-公用\\871_111111.sm2";
            this.password = "111111";
        }
        if("prod".equals(activeProfile)){
            this.url = "https://gateway.zqpay.com";
@@ -60,6 +78,9 @@
            this.merchNo = "";
            this.encrpNo = "";
            this.signNo = "";
            this.cer = "";
            this.sm2 = "";
            this.password = "";
        }
        return this;
    }
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianUtil.java
New file
@@ -0,0 +1,108 @@
package com.stylefeng.guns.modular.system.util.zhenglian;
import com.stylefeng.guns.modular.system.util.SpringContextsUtil;
import com.zlpay.assist.sign.sm2.SM2Cert;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.RandomStringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.cert.X509Certificate;
import java.util.Base64;
/**
 * @author zhibing.pu
 * @Date 2025/7/28 14:22
 */
@Slf4j
public class ZhengLianUtil {
    private static ZhengLianConfig zhengLianConfig = SpringContextsUtil.getBean(ZhengLianConfig.class).getZhengLianConfig();
    /**
     * @Description: 从公钥证书获取公钥串
     * @return
     * @return String
     * @throws
     * @author: tsl
     * @date: 2019年4月19日 下午9:07:56
     */
    public static String getPublicKey() {
        String publicKey = "";
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(new File(zhengLianConfig.getCer()));
            X509Certificate publicCert = SM2Cert.getPublicCert(inputStream);
            publicKey = Base64.getEncoder().encodeToString(publicCert.getEncoded());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return publicKey;
    }
    /**
     * @Description: 从私钥证书获取私钥传
     * @return
     * @return String
     * @throws
     * @author: tsl
     * @date: 2019年4月19日 下午9:08:00
     */
    public static String getPrivateKey() {
        String privateKey = "";
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(new File(zhengLianConfig.getSm2()));
            byte[] priBytes = SM2Cert.getPrivateCert(inputStream);
            privateKey = SM2Cert.getPrivateKey(zhengLianConfig.getPassword(), priBytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return privateKey;
    }
    /**
     * @Description: 生成对称加密秘钥
     * @return String
     * @throws
     * @author: syuf
     * @date: 2018年11月8日 下午5:50:05
     */
    public static String generateKey(int length) {
        return RandomStringUtils.randomAlphanumeric(length);
    }
    /**
     * @Description: 签名
     * @param data
     * @return String
     * @throws
     * @author: syuf
     * @date: 2018年11月15日 下午2:19:01
     */
    public static String sign(String data) {
        try {
            // 获取私钥
            String privateKey = getPrivateKey();
            return com.zlpay.assist.sign.sm2.SM2Util.sign(privateKey, zhengLianConfig.getSignNo(), data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/MessageBody.java
New file
@@ -0,0 +1,23 @@
package com.stylefeng.guns.modular.system.util.zhenglian.model;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/7/28 14:19
 */
@Data
public class MessageBody {
    /**
     * 业务数据
     */
    private String data;
    /**
     * 签名
     */
    private String sign;
    /**
     * 秘钥
     */
    private String secret;
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/OpenAccountCallbackRequest.java
New file
@@ -0,0 +1,11 @@
package com.stylefeng.guns.modular.system.util.zhenglian.model;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/7/28 14:18
 */
@Data
public class OpenAccountCallbackRequest {
}
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TokenRequest.java
@@ -11,7 +11,7 @@
    /**
     * 应用appid
     */
    private String appid;
    private String appId;
    /**
     * APP 端用户唯一标识
     */
DriverQYTTravel/guns-admin/src/main/resources/application-dev.yml
@@ -113,3 +113,8 @@
#交通部推送数据功能开关
pushMinistryOfTransport: false
---
rongyun:
    app_key: 111
    app_secret: 111
DriverQYTTravel/pom.xml
@@ -41,7 +41,7 @@
        <ehcache.core.version>2.6.11</ehcache.core.version>
        <mysql-connector-java.version>8.0.11</mysql-connector-java.version>
        <jwt.version>0.9.0</jwt.version>
        <hutool.version>4.1.1</hutool.version>
        <hutool.version>5.8.39</hutool.version>
    </properties>
    <dependencyManagement>
UserQYTTravel/guns-admin/pom.xml
@@ -226,6 +226,12 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>