DriverQYTTravel/guns-admin/lib/ncoss-java-sdk-1.0.5.jarBinary files differ
DriverQYTTravel/guns-admin/lib/zl-util-security-1.2.2.jarBinary 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>