DriverQYTTravel/guns-admin/pom.xml
@@ -277,6 +277,11 @@ <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> DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -395,6 +395,11 @@ @Override public ResultUtil updateDriver(RegisteredWarpper registeredWarpper, Integer uid) throws Exception { Driver driver = this.selectById(uid); //调用中台接口校验实名信息 Boolean auth = UserUtil.idCardAuth(registeredWarpper.getName(), registeredWarpper.getIdCard()); if(!auth){ return ResultUtil.error("实名认证失败,请输入正确的姓名和身份证号码"); } driver.setName(registeredWarpper.getName()); driver.setSex(registeredWarpper.getSex()); driver.setIdCard(registeredWarpper.getIdCard()); @@ -453,7 +458,7 @@ boolean b = true; for(String t : split){ for(DriverService driverService : list){ if(driverService.getType() == Integer.valueOf(t)){ if(driverService.getType().equals(Integer.valueOf(t))){ b = false; break; } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java
@@ -204,4 +204,43 @@ StaffNodeInfo staffNodeInfo = object.getObject("data", StaffNodeInfo.class); return staffNodeInfo; } /** * 创建账号-同步证联开户信息 * @param request * @return 状态 0 成功 其他失败 */ public static Integer addAccountInfo(AddAccountInfoRequest request){ //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/addAccountInfo"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUID.randomUUID().toString().replaceAll("-", ""); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【创建账号-同步证联开户信息】请求地址:" + url); log.info("【创建账号-同步证联开户信息】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【创建账号-同步证联开户信息】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if (!"000000".equals(resCode)) { log.error("【创建账号-同步证联开户信息】请求失败:" + jsonObject.getString("resMsg")); return -1; } return jsonObject.getInteger("status"); } } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
@@ -271,4 +271,54 @@ } return list; } /** * 实名认证 * @param realName * @param cardNo * @return */ public static Boolean idCardAuth(String realName, String cardNo) { //请求路径 String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/idCardAuth"; //私钥文件 String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = qianYunTongConfig.getAppkey();//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUID.randomUUID().toString().replaceAll("-", ""); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); Map<String, String> map = new HashMap<>(); map.put("realName", realName); map.put("cardNo", cardNo); contentMap.put("content", JSON.toJSONString(map)); log.info("【身份证实名认证】请求地址:" + url); log.info("【身份证实名认证】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【身份证实名认证】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【身份证实名认证】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【身份证实名认证】失败:" + object.toJSONString()); return null; } JSONArray data = object.getJSONArray("data"); return true; } } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/AddAccountInfoRequest.java
New file @@ -0,0 +1,45 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 18:45 */ @Data public class AddAccountInfoRequest { /** * 易信编号 * (个人帐号传onconuuid, * 企业帐号传企业编号) */ private String custId; /** * 帐号编号 */ private String accountNo; /** * 帐户名称 */ private String accountName; /** * 租户标识: 黔南-522700 */ private String partnerId; /** * 场景编号:网约车-100 */ private String industryCode; /** * 支付方式: 501101 */ private String payModeId; /** * 支付模式: APP */ private String accessMode; /** * 司机手机号 */ private String mobile; } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/SM4Util.java
New file @@ -0,0 +1,95 @@ package com.stylefeng.guns.modular.system.util.zhenglian; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.Security; import java.util.Base64; /** * SM4国密工具类 * @author zhibing.pu * @Date 2025/7/24 15:29 */ public class SM4Util { private static final String ALGORITHM_NAME = "SM4"; private static final String ALGORITHM_MODE = "SM4/ECB/PKCS5Padding"; static { Security.addProvider(new BouncyCastleProvider()); } /** * 生成 SM4 密钥 * @return 密钥的 Base64 编码字符串 * @throws Exception 异常 */ public static String generateKey() throws Exception { KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, "BC"); kg.init(128); SecretKey secretKey = kg.generateKey(); return Base64.getEncoder().encodeToString(secretKey.getEncoded()); } /** * SM4 加密 * @param plainText 明文 * @param key 密钥的 Base64 编码字符串 * @return 密文的 Base64 编码字符串 * @throws Exception 异常 */ public static String encrypt(String plainText, String key) throws Exception { byte[] keyBytes = Base64.getDecoder().decode(key); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME); Cipher cipher = Cipher.getInstance(ALGORITHM_MODE, "BC"); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } /** * SM4 解密 * @param cipherText 密文的 Base64 编码字符串 * @param key 密钥的 Base64 编码字符串 * @return 明文 * @throws Exception 异常 */ public static String decrypt(String cipherText, String key) throws Exception { byte[] keyBytes = Base64.getDecoder().decode(key); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME); Cipher cipher = Cipher.getInstance(ALGORITHM_MODE, "BC"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] cipherBytes = Base64.getDecoder().decode(cipherText); byte[] decryptedBytes = cipher.doFinal(cipherBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } public static void main(String[] args) { try { // 生成密钥 String key = generateKey(); System.out.println("生成的密钥: " + key); // 明文 String plainText = "Hello, SM4!"; System.out.println("明文: " + plainText); // 加密 String cipherText = encrypt(plainText, key); System.out.println("密文: " + cipherText); // 解密 String decryptedText = decrypt(cipherText, key); System.out.println("解密后的明文: " + decryptedText); } catch (Exception e) { e.printStackTrace(); } } } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/TokenUtil.java
New file @@ -0,0 +1,44 @@ package com.stylefeng.guns.modular.system.util.zhenglian; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; 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.TokenRequest; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * @author zhibing.pu * @Date 2025/7/24 14:06 */ 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"); post.body("{}"); } } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java
New file @@ -0,0 +1,67 @@ package com.stylefeng.guns.modular.system.util.zhenglian; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; /** * @author zhibing.pu * @Date 2025/7/8 11:31 */ @Data @Component public class ZhengLianConfig { @Value("${spring.profiles.active}") private String activeProfile; /** * 接口地址 */ private String url; /** * appid */ private String appid; /** * 商户号 */ private String merchNo; /** * 加密证书序列号 */ private String encrpNo; /** * 签名证书序列号 */ private String signNo; /** * 获取不同环境的配置 * @return */ public ZhengLianConfig getZhengLianConfig() { if("dev".equals(activeProfile)){ this.url = "https://gatewaytest.zqpay.com"; this.appid = "F9BFEEA567196A92E053376010ACF004"; this.merchNo = "B00000871"; this.encrpNo = "123456"; this.signNo = "123456"; } if("test".equals(activeProfile)){ this.url = "https://gatewaytest.zqpay.com"; this.appid = "F9BFEEA567196A92E053376010ACF004"; this.merchNo = "B00000871"; this.encrpNo = "123456"; this.signNo = "123456"; } if("prod".equals(activeProfile)){ this.url = "https://gateway.zqpay.com"; this.appid = ""; this.merchNo = ""; this.encrpNo = ""; this.signNo = ""; } return this; } } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TokenRequest.java
New file @@ -0,0 +1,46 @@ package com.stylefeng.guns.modular.system.util.zhenglian.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 15:06 */ @Data public class TokenRequest { /** * 应用appid */ private String appid; /** * APP 端用户唯一标识 */ private String appUserId; /** * 姓名 */ private String userName; /** * 证件号码 */ private String certNo; /** * 手机号码 */ private String phone; /** * 访问类型 * 01 证联收银台支付 * 04 HOME 页 * 06 申请免密签约 * 07 商户收银台支付 * 08 开户(绑卡) * 09 开通支付账户 * 10 打开付款码 */ private String type; /** * 终端信息域 */ private TradeTerminalInfo tradeTerminalInfo; } DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/model/TradeTerminalInfo.java
New file @@ -0,0 +1,27 @@ package com.stylefeng.guns.modular.system.util.zhenglian.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 15:10 */ @Data public class TradeTerminalInfo { /** * 用于标识交易设 备 公 网 IP地 址 */ private String ip; /** * 终端类型: * 0:web * 1:ANDROID * 2:IOS * 3:其它 */ private String terminal; /** * 用于标识交易设备 MAC 地址 */ private String mac; } ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -133,7 +133,7 @@ @RequestMapping(value = "/logout", method = RequestMethod.GET) public String logOut(HttpServletRequest request) { request.getSession().invalidate(); HttpUtil.get("https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3F%0Alogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F"); HttpUtil.get("https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3Flogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F"); return REDIRECT + "/"; } ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html
@@ -47,7 +47,7 @@ </li> </ul> </div> <a href="https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3F%0Alogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F" class="roll-nav roll-right J_tabExit"><i class="fa fa fa-sign-out"></i> 退出</a> <a class="roll-nav roll-right J_tabExit" href="https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3Flogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F"><i class="fa fa fa-sign-out"></i> 退出</a> </div> <div class="row J_mainContent" id="content-main"> <iframe class="J_iframe" name="iframe0" width="100%" height="100%" src="${ctxPath}/blackboard?type=${type}" frameborder="0" data-id="${ctxPath}/blackboard" seamless></iframe> ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/common/_tab.html
@@ -22,7 +22,7 @@ <li><a class="J_menuItem" href="${ctxPath}/mgr/user_info">个人资料</a></li> <li><a class="J_menuItem" href="${ctxPath}/mgr/user_chpwd">修改密码</a></li> <li class="divider"></li> <li><a href="https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3F%0Alogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F">安全退出</a> <li><a href="https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3Flogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F">安全退出</a> </li> </ul> </div> UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -17,6 +17,7 @@ import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.util.qianyuntong.model.QYTPaymentCallback; import com.stylefeng.guns.modular.system.warpper.*; import com.stylefeng.guns.modular.taxi.model.OrderTaxi; import com.stylefeng.guns.modular.taxi.model.PaymentRecord; @@ -28,13 +29,11 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -47,7 +46,7 @@ * 订单控制器(综合) */ @Api //@CrossOrigin @Slf4j @RestController @RequestMapping("") public class OrderController { @@ -1988,65 +1987,46 @@ e.printStackTrace(); } } /** * 管理后台推单 * * @param orderType * @return */ @ResponseBody @PostMapping("/base/taxi/pushOrder") public ResultUtil pushOrder(Integer orderId, Integer orderType){ public ResultUtil pushOrder(Integer orderId, Integer orderType) { try { switch (orderType){ switch (orderType) { case 1: return orderPrivateCarService.pushOrderPrivateCar(orderId); case 2: return orderTaxiService.pushOrderTaxi(orderId); } return ResultUtil.success(); }catch (Exception e){ } catch (Exception e) { e.printStackTrace(); return ResultUtil.runErr(); } } // public void cloudPay(String total_fee,String transaction_id,int type) { // if(type==1){ // BigDecimal divide = new BigDecimal(total_fee).divide(new BigDecimal(100)); // total_fee=divide.toString(); // } // Company company = companyService.selectOne(new EntityWrapper<Company>() // .eq("type", 1) // .last("LIMIT 1")); // // 查询平台开户信息 // TEnterpriseWithdrawal enterpriseWithdrawal = enterpriseWithdrawalService.selectOne(new EntityWrapper<TEnterpriseWithdrawal>() // .eq("companyId", company.getId())); // DepositReq depositReq = new DepositReq(); // depositReq.setOutOrderNo(ToolUtil.getRandomString(32)); // depositReq.setTotalAmount(new BigDecimal(total_fee).multiply(new BigDecimal(100)).intValue()); // 总金额 // depositReq.setAmount(new BigDecimal(total_fee).multiply(new BigDecimal(100)).intValue()); // 支付金额 // depositReq.setDiscountAmount(0); // 优惠金额 // depositReq.setBalanceAcctId(enterpriseWithdrawal.getBalanceAcctId()); // depositReq.setDepositType("1"); // depositReq.setPaymentType(PaymentTypeEnum.CUP_APP.getCode()); // depositReq.setPaymentTradeNo(transaction_id); // 系统交易流水号 // depositReq.setPaymentSucceededAt(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(new Date())); // depositReq.setOrderNo(transaction_id); // depositReq.setOrderAmount(new BigDecimal(total_fee).multiply(new BigDecimal(100)).longValue()); // depositReq.setProductName("用户支付充值"); // depositReq.setProductCount(1); // // try { // DepositResp depositResp = DepositExample.create(depositReq); // System.err.println(depositResp); // } catch (Exception e) { // e.printStackTrace(); // } // } /** * 黔云通支付回调通知 * * @param qytPaymentCallback * @return */ @ResponseBody @PostMapping("/base/order/qytPaymentCallback") public String qytPaymentCallback(@RequestBody QYTPaymentCallback qytPaymentCallback) { log.info("【黔云通支付回调通知】请求参数:" + JSON.toJSONString(qytPaymentCallback)); if (null == qytPaymentCallback) { return "error"; } return "success"; } } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java
@@ -5,6 +5,7 @@ import com.google.gson.Gson; import com.open.common.util.OpenApiClient; import com.open.common.util.SystemParameterNames; import com.stylefeng.guns.modular.system.util.ResultUtil; import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; import lombok.extern.slf4j.Slf4j; @@ -16,19 +17,39 @@ /** * 企业员工工具类 * * @author zhibing.pu * @Date 2025/6/6 16:17 */ @Slf4j public class EmployeeUtil { public static void main(String[] args) { SaveStaffNodeRequest request = new SaveStaffNodeRequest(); request.setMobile("15828353127"); request.setEntercode("981100006005951"); request.setEmpName("蒲"); request.setEmpNickname("蒲"); request.setLoginNo("15828353125"); request.setEmpSex("男"); request.setMphone("15828353125"); request.setEmail("15828353125@qyt.com"); request.setDeptId(0); request.setPositionId(1); request.setSuperLevel(0); request.setHideMobile(0); ResultUtil<SaveStaffNode> resultUtil = EmployeeUtil.saveStaffNode(request); System.out.println(resultUtil.getData()); } /** * 企业增加员工 * * @param request * @return */ public static SaveStaffNode saveStaffNode(SaveStaffNodeRequest request){ public static ResultUtil<SaveStaffNode> saveStaffNode(SaveStaffNodeRequest request) { //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/saveStaffNode"; //私钥文件 @@ -56,16 +77,19 @@ String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【企业增加员工】请求失败:" + result); throw new RuntimeException("【企业增加员工】请求失败:" + result); String retMsg = jsonObject.getString("retMsg"); retMsg = retMsg.substring(retMsg.indexOf("{")); jsonObject = JSON.parseObject(retMsg); return ResultUtil.error("【企业增加员工】请求失败:" + jsonObject.getString("msg")); } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【企业增加员工】失败:" + object.toJSONString()); throw new RuntimeException("【企业增加员工】失败:" + object.toJSONString()); return ResultUtil.error("【企业增加员工】失败:" + object.getString("desc")); } SaveStaffNode saveStaffNode = jsonObject.getObject("object", SaveStaffNode.class); return saveStaffNode; SaveStaffNode saveStaffNode = object.getObject("data", SaveStaffNode.class); return ResultUtil.success(saveStaffNode); } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EnterpriseUtil.java
@@ -24,6 +24,20 @@ public class EnterpriseUtil { public static void main(String[] args) { // CheckEnterExist checkEnterNameExist = checkEnterNameExist("黔南云码通数字产业运营有限公司"); // System.err.println(checkEnterNameExist); CreateEnterpriseRequest request = new CreateEnterpriseRequest(); request.setName("成都喜望科技有限公司"); request.setNickName("成都喜望"); request.setIndustry_code("123456"); request.setMobile("15828353127"); CreateEnterprise enterprise = EnterpriseUtil.createEnterprise(request); System.out.println(enterprise); } /** * 根据社会信用代码判断企业是否已存在 * UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java
New file @@ -0,0 +1,471 @@ package com.stylefeng.guns.modular.system.util.qianyuntong; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.open.common.util.OpenApiClient; import com.open.common.util.SystemParameterNames; import com.stylefeng.guns.modular.system.util.UUIDUtil; import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; import lombok.extern.slf4j.Slf4j; import java.text.SimpleDateFormat; import java.util.*; /** * @author zhibing.pu * @Date 2025/7/24 9:34 */ @Slf4j public class OrderUtil { public static void main(String[] args) { CreateTravelItineraryRequest request = new CreateTravelItineraryRequest(); request.setScene(QianYunTongProperties.sceneId); request.setPartnerId("522700"); request.setOrderNo("123456"); request.setCustomerId("11448156"); request.setDriverId("11448158"); request.setSupplierShopId("981100006005951"); request.setServiceType(1); String travelItinerary = createTravelItinerary(request); System.err.println(travelItinerary); // CreateOrderRequest createOrderRequest = new CreateOrderRequest(); // createOrderRequest.setTreatShopId(""); // createOrderRequest.setOrderAppId("52270015"); // createOrderRequest.setScene("TRAFFIC"); // createOrderRequest.setPartnerId("522700"); // createOrderRequest.setField1("{\"profitSharing\":\"0\",\"isPromote\":\"0\"}"); // createOrderRequest.setCharge(new BigDecimal("0.01")); // createOrderRequest.setChannelSource("GRJYCXWXXCX"); // createOrderRequest.setOrderId(""); // createOrderRequest.setOrderNo(""); // createOrderRequest.setCustomerId(""); // OrderInfo orderInfo = tradeOrderCreate(createOrderRequest); } /** * 订单创建 * @param createOrderRequest * @return */ public static OrderInfo tradeOrderCreate(CreateOrderRequest createOrderRequest){ TradeRequest request = new TradeRequest<CreateOrderRequest>(); request.setSceneId(QianYunTongProperties.sceneId); request.setAppId(QianYunTongProperties.appId); request.setConfigVersion(1); request.setRequestId(UUIDUtil.getRandomCode()); request.setData(createOrderRequest); //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/tradeOrderCreate"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【订单创建】请求地址:" + url); log.info("【订单创建】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【订单创建】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【订单创建】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【订单创建】失败:" + jsonObject.getString("resMsg")); } JSONObject busiResp = jsonObject.getJSONObject("busiResp"); OrderInfo orderInfo = busiResp.getObject("orderInfo", OrderInfo.class); return orderInfo; } /** * 创建行程单 * @param request * @return 行程单ID */ public static String createTravelItinerary(CreateTravelItineraryRequest request){ //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/createTravelItinerary"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【创建行程单】请求地址:" + url); log.info("【创建行程单】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【创建行程单】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【创建行程单】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【创建行程单】失败:" + jsonObject.getString("resMsg")); } return jsonObject.getString("busiResp"); } /** * 修改行程单 * @param request */ public static Boolean modifyTravelItinerary(ModifyTravelItineraryRequest request){ //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/modifyTravelItinerary"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【修改行程单】请求地址:" + url); log.info("【修改行程单】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【修改行程单】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【修改行程单】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【修改行程单】失败:" + jsonObject.getString("resMsg")); } return true; } /** * 行程单列表查询 * @param request * @return */ public static ListPage<TravelItinerary> getTravelItineraryList(GetTravelItineraryListRequest request){ //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/getTravelItineraryList"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【行程单列表查询】请求地址:" + url); log.info("【行程单列表查询】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【行程单列表查询】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【行程单列表查询】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【行程单列表查询】失败:" + jsonObject.getString("resMsg")); } JSONObject busiResp = jsonObject.getJSONObject("busiResp"); Integer total = busiResp.getInteger("total"); Integer pageNum = busiResp.getInteger("pageNum"); Integer pageSize = busiResp.getInteger("pageSize"); JSONArray list = busiResp.getJSONArray("list"); List<TravelItinerary> travelItineraryList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { TravelItinerary object = list.getObject(i, TravelItinerary.class); travelItineraryList.add(object); } ListPage listPage = new ListPage<TravelItinerary>(); listPage.setTotal(total); listPage.setPageNum(pageNum); listPage.setPageSize(pageSize); listPage.setList(travelItineraryList); return listPage; } /** * 订单创建及拉起支付 * @param tradeOrderCreateData * @return */ public static TradeOrderCreate tradeOrderCreate1(TradeOrderCreateData tradeOrderCreateData){ TradeRequest request = new TradeRequest<TradeOrderCreateData>(); request.setSceneId(QianYunTongProperties.sceneId); request.setAppId(QianYunTongProperties.appId); request.setConfigVersion(1); request.setRequestId(UUIDUtil.getRandomCode()); request.setData(tradeOrderCreateData); //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/tradeOrderCreate"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【订单创建及拉起支付】请求地址:" + url); log.info("【订单创建及拉起支付】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【订单创建及拉起支付】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【订单创建及拉起支付】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【订单创建及拉起支付】失败:" + jsonObject.getString("resMsg")); } TradeOrderCreate busiResp = jsonObject.getObject("busiResp", TradeOrderCreate.class); return busiResp; } /** * (补偿单)拉起支付 * @param tradePayOffData * @return */ public static PayInfo tradePayOff(TradePayOffData tradePayOffData){ TradeRequest request = new TradeRequest<TradePayOffData>(); request.setSceneId(QianYunTongProperties.sceneId); request.setAppId(QianYunTongProperties.appId); request.setConfigVersion(1); request.setRequestId(UUIDUtil.getRandomCode()); request.setData(tradePayOffData); //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/tradePayOff"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【(补偿单)拉起支付】请求地址:" + url); log.info("【(补偿单)拉起支付】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【(补偿单)拉起支付】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【(补偿单)拉起支付】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【(补偿单)拉起支付】失败:" + jsonObject.getString("resMsg")); } JSONObject busiResp = jsonObject.getJSONObject("busiResp"); PayInfo payInfo = busiResp.getObject("payInfo", PayInfo.class); return payInfo; } /** * 拉起支付 * @param tradePayOff1Data * @return */ public static PayInfo tradePayOff1(TradePayOff1Data tradePayOff1Data){ TradeRequest request = new TradeRequest<TradePayOff1Data>(); request.setSceneId(QianYunTongProperties.sceneId); request.setAppId(QianYunTongProperties.appId); request.setConfigVersion(1); request.setRequestId(UUIDUtil.getRandomCode()); request.setData(tradePayOff1Data); //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/tradePayOff"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【拉起支付】请求地址:" + url); log.info("【拉起支付】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【拉起支付】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"000000".equals(resCode)){ log.error("【拉起支付】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【拉起支付】失败:" + jsonObject.getString("resMsg")); } JSONObject busiResp = jsonObject.getJSONObject("busiResp"); PayInfo payInfo = busiResp.getObject("payInfo", PayInfo.class); return payInfo; } /** * 查询支付单信息 * @param getPaymentInfoDataRequest * @return */ public static GetPaymentInfo paymentInfo(GetPaymentInfoDataRequest getPaymentInfoDataRequest){ GetPaymentInfoRequest request = new GetPaymentInfoRequest(); request.setRequstType("POST"); request.setBusType(1); request.setData(getPaymentInfoDataRequest); //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/paymentInfo"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【查询支付单信息】请求地址:" + url); log.info("【查询支付单信息】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【查询支付单信息】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("retCode"); if(!"0".equals(resCode)){ log.error("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); throw new RuntimeException("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); } JSONObject object = jsonObject.getJSONObject("object"); String retCode = object.getString("retCode"); if(!"000000".equals(retCode)){ log.error("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); throw new RuntimeException("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); } GetPaymentInfo payInfo = object.getObject("data", GetPaymentInfo.class); return payInfo; } /** * (补偿单)支付成功通知 * @param request * @return */ public static OrderInfo paymentOrder(PaymentOrderRequest request){ //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/paymentOrder"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUIDUtil.getRandomCode(); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); contentMap.put("content", new Gson().toJson(request)); log.info("【(补偿单)支付成功通知】请求地址:" + url); log.info("【(补偿单)支付成功通知】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); log.info("【(补偿单)支付成功通知】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String resCode = jsonObject.getString("resCode"); if(!"0".equals(resCode)){ log.error("【(补偿单)支付成功通知】失败:" + jsonObject.getString("resMsg")); throw new RuntimeException("【(补偿单)支付成功通知】失败:" + jsonObject.getString("resMsg")); } OrderInfo orderInfo = jsonObject.getObject("busiResp", OrderInfo.class); return orderInfo; } } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongProperties.java
@@ -8,41 +8,6 @@ */ public interface QianYunTongProperties { /************************************开发/测试start***********************************/ // /** // * appkey // */ // String appkey = "10001104"; // /** // * 私钥地址 // */ // String privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; // /** // * 私钥地址 // */ // String privateKeyPath = "/root/server/app/key/private_key_test.pem"; // /** // * 消费者账号 // */ // String userName = "xiaofei"; // /** // * 状态 // * 1:生产环境 // * 2:测试环境 // */ // String status = "1"; // /** // * API地址 // */ // String apiUrl = "https://test-zhongtai.stqcloud.com:10070"; // /** // * 桶名 // */ // String bucketName = "bucuTest0625"; /************************************开发/测试end***********************************/ /************************************生产start***********************************/ /** * appkey @@ -51,15 +16,15 @@ /** * 私钥地址 */ // String privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key.pem"; String privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; /** * 私钥地址 */ String privateKeyPath = "/root/server/app/key/private_key.pem"; // String privateKeyPath = "/root/server/app/key/private_key_test.pem"; /** * 消费者账号 */ String userName = "xiwang"; String userName = "xiaofei"; /** * 状态 * 1:生产环境 @@ -69,11 +34,54 @@ /** * API地址 */ String apiUrl = "http://jjzhongtai.stqcloud.com:10010"; String apiUrl = "https://test-zhongtai.stqcloud.com:10070"; /** * 桶名 */ String bucketName = "qyt20250702"; String bucketName = "bucuTest0625"; /** * 场景编号 */ String sceneId = "1948289607125864448"; /************************************开发/测试end***********************************/ /************************************生产start***********************************/ // /** // * appkey // */ // String appkey = "10001104"; // /** // * 私钥地址 // */ //// String privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key.pem"; // /** // * 私钥地址 // */ // String privateKeyPath = "/root/server/app/key/private_key.pem"; // /** // * 消费者账号 // */ // String userName = "xiwang"; // /** // * 状态 // * 1:生产环境 // * 2:测试环境 // */ // String status = "1"; // /** // * API地址 // */ // String apiUrl = "http://jjzhongtai.stqcloud.com:10010"; // /** // * 桶名 // */ // String bucketName = "qyt20250702"; // /** // * 场景编号 // */ // String sceneId = "1948289607125864448"; /************************************生产end***********************************/ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
@@ -22,6 +22,12 @@ public class UserUtil { public static void main(String[] args) { List<QYTUserInfo> userInfoByPhone = getUserInfoByPhone("15828353127", "981100006005951"); System.out.println(userInfoByPhone); } /** * 根据手机号码获取人员信息 * @@ -72,6 +78,63 @@ return list; } /** * 根据手机号码获取人员信息 * * @param mobile 手机号码 * @param enterNum 企业编号 */ public static List<QYTUserInfo> getUserInfoByPhone(String mobile, String enterNum) { //请求路径 String url = QianYunTongProperties.apiUrl + "/openapi/rest/1.0/getUserInfoByPhone"; //私钥文件 String skprivateKeyFile = QianYunTongProperties.privateKeyPath; //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 String appKey = QianYunTongProperties.appkey;//appkey Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json"); Map<String, Object> contentMap = new HashMap<String, Object>(); Date nowdate = new Date(); SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); String timeStamp = date.format(nowdate); String messageId = UUID.randomUUID().toString().replaceAll("-", ""); contentMap.put(SystemParameterNames.getAppKey(), appKey); contentMap.put(SystemParameterNames.getMessage_id(), messageId); contentMap.put(SystemParameterNames.getUserName(), QianYunTongProperties.userName); contentMap.put(SystemParameterNames.getStatus(), QianYunTongProperties.status); Map<String, String> map = new HashMap<>(); map.put("mobile", mobile); if (null != enterNum) { map.put("enterNum", enterNum); } contentMap.put("content", JSON.toJSONString(map)); log.info("【根据手机号码获取人员信息】请求地址:" + url); log.info("【根据手机号码获取人员信息】请求参数:" + JSON.toJSONString(contentMap)); String result = OpenApiClient.sendCommonHttpRequst(url, headers, "GET", skprivateKeyFile, timeStamp, contentMap); log.info("【根据手机号码获取人员信息】请求结果:" + result); JSONObject jsonObject = JSON.parseObject(result); String retCode = jsonObject.getString("retCode"); if (!"0".equals(retCode)) { log.error("【根据手机号码获取人员信息】请求失败:" + result); return null; } JSONObject object = jsonObject.getJSONObject("object"); String status = object.getString("status"); if (!"0".equals(status)) { log.error("【根据手机号码获取人员信息】失败:" + object.toJSONString()); return null; } JSONArray data = object.getJSONArray("data"); List<QYTUserInfo> list = new ArrayList<>(); for (int i = 0; i < data.size(); i++) { data.getJSONObject(i).getString("enter_code"); QYTUserInfo userInfo = data.getObject(i, QYTUserInfo.class); list.add(userInfo); } return list; } /** * 根据手机号注册用户 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateOrderRequest.java
New file @@ -0,0 +1,53 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2025/7/24 9:35 */ @Data public class CreateOrderRequest { /** * 司机id */ private String treatShopId; /** * 应用场景标识 */ private String orderAppId; /** * 场景标识 */ private String scene; /** * 租户ID。地区行政编码。黔南州传522700 */ private String partnerId; /** * 结算信息json串。其中结算分账标识(profitSharing:0:不分账,1:分账)、是否推广单标识(isPromote:1、是、0、否)必传。例:{"profitSharing":"0",”isPromote”:”0”} */ private String field1; /** * 订单总金额,单位元 */ private BigDecimal charge; /** * 订单渠道。小程序传GRJYCXWXXCX,贵人家园传GRJY */ private String channelSource; /** * 行程单ID */ private String orderId; /** * 业务侧订单号 */ private String orderNo; /** * 下单人ID */ private String customerId; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateTravelItineraryRequest.java
New file @@ -0,0 +1,43 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 16:31 */ @Data public class CreateTravelItineraryRequest { /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 租户ID。地区行政编码。黔南州传522700 */ private String partnerId; /** * 业务侧订单号 */ private String orderNo; /** * 乘客ID */ private String customerId; /** * 司机ID */ private String driverId; /** * 推广员ID */ private String promoterId; /** * 服务商商户ID */ private String supplierShopId; /** * 场景服务类型。1、出租;2、网约车;3、城际;4、顺风车 */ private Integer serviceType; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfo.java
New file @@ -0,0 +1,45 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2025/7/24 18:24 */ @Data public class GetPaymentInfo { /** * 支付流水号 */ private String payId; /** * 订单中心行程单ID */ private String partnerPayId; /** * 接入模式:PC H5 APP */ private String accessMode; /** * 用户标识 */ private String customerId; /** * 商户标识 */ private String partnerId; /** * 币种 */ private String currency; /** * 支付总金额 */ private String totalFee; /** * 商品信息 */ private List<GoodsInfoRequest> goodsInfo; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoDataRequest.java
New file @@ -0,0 +1,19 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 17:08 */ @Data public class GetPaymentInfoDataRequest { /** * 支付单标识。传行程单ID */ private String partnerPayId; /** * 商户号,由支付中心分配 */ private String partnerId; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoRequest.java
New file @@ -0,0 +1,23 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 17:03 */ @Data public class GetPaymentInfoRequest { /** * 默认传POST */ private String requstType; /** * 默认传1 */ private Integer busType; /** * 业务参数 */ private GetPaymentInfoDataRequest data; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetTravelItineraryListRequest.java
New file @@ -0,0 +1,47 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 16:31 */ @Data public class GetTravelItineraryListRequest { /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 租户ID。地区行政编码。黔南州传522700 */ private String partnerId; /** * 业务侧订单号 */ private String orderNo; /** * 乘客ID */ private String customerId; /** * 司机ID */ private String driverId; /** * 推广员ID */ private String promoterId; /** * 服务商商户ID */ private String supplierShopId; /** * 每页条数 */ private Integer pageSize; /** * 当前页码 */ private Integer pageNum; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfo.java
New file @@ -0,0 +1,27 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:35 */ @Data public class GoodsInfo { /** * 商户号 */ private String merchantCode; /** * 付款商户号 */ private String custId; /** * 付款方名称 */ private String custName; /** * 分账标识。0:不分账,1:分账 */ private String profitSharing; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfoRequest.java
New file @@ -0,0 +1,27 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:13 */ @Data public class GoodsInfoRequest { /** * 企业ID(补偿场景新创建的订单支付传备用金企业ID) */ private String id; /** * 子商户微信appId(证联预下单支付必填) */ private String subAppId; /** * 付款人的openId(证联预下单支付必填) */ private String subOpenId; /** * 分账标识。0:不分账,1:分账 */ private String profitSharing; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ListPage.java
New file @@ -0,0 +1,27 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 16:45 */ @Data public class ListPage<T> { /** * 总条数 */ private Integer total; /** * 当前页码 */ private Integer pageNum; /** * 每页条数 */ private Integer pageSize; /** * 数据列表 */ private T list; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ModifyTravelItineraryRequest.java
New file @@ -0,0 +1,39 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 16:31 */ @Data public class ModifyTravelItineraryRequest { /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 租户ID。地区行政编码。黔南州传522700 */ private String partnerId; /** * 行程单ID */ private String orderId; /** * 行程单状态。2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消,11=改派中 */ private Integer status; /** * 司机ID */ private String driverId; /** * 推广员ID */ private String promoterId; /** * 服务商商户ID */ private String supplierShopId; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderInfo.java
New file @@ -0,0 +1,19 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 9:44 */ @Data public class OrderInfo { /** * 订单id */ private String orderId; /** * 订单状态 */ private String status; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfo.java
New file @@ -0,0 +1,31 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:18 */ @Data public class PayInfo { /** * 证联返回码000000:请求成功 */ private String retCode; /** * 证联返回信息 */ private String retMsg; /** * true、false */ private String success; /** * 证联返回数据 */ private PayInfoData data; /** * 签名 */ private String sign; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfoData.java
New file @@ -0,0 +1,42 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2025/7/24 10:18 */ @Data public class PayInfoData { /** * 收银台链接 */ private String redirectUrl; /** * 支付流水号 */ private String payId; /** * 支付工单状态 * 0 待支付 * 1 部分支付成功 * 2 支付成功 * 3 支付失败 */ private String status; /** * 支付时间,格式:yyyy-MM-dd HH:mm:ss */ private String payTime; /** * 扣款金额 单位分 */ private String payFee; /** * 支付信息 */ private List<PaymentInfo> paymentInfos; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfo.java
New file @@ -0,0 +1,31 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:32 */ @Data public class PaymentInfo { /** * 支付模式。此场景下默认传501212(测试和生产一致) */ private String payModeId; /** * 支付交易明细标识 */ private String payItemId; /** * 支付金额 */ private String payFee; /** * 支付状态 */ private String status; /** * 支付时间 */ private String payTime; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfoRequest.java
New file @@ -0,0 +1,15 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:32 */ @Data public class PaymentInfoRequest { /** * 支付模式。此场景下默认传501212(测试和生产一致) */ private String payModeId; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentOrderRequest.java
New file @@ -0,0 +1,57 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2025/7/24 18:29 */ @Data public class PaymentOrderRequest { /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 场景应用标识。默认52270015 */ private String mhltiCenterAppId; /** * 支付流水明细 */ private String payItemId; /** * 支付明细json串 */ private String paymentInfo; /** * 订单ID */ private String orderId; /** * 支付金额,单位元 */ private BigDecimal charge; /** * 支付时间 */ private String payTime; /** * 支付流水号 */ private String paymentSerialNumber; /** * 付款类型,4、线上支付 */ private Integer payType; /** * 付款方式,6:微信 7:支付宝 8:银行卡 9:银联二维码 10银联购物车收银台 */ private Integer payChannel; /** * 是否补偿单。1、是,0、否 */ private Integer isCompensate; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallback.java
New file @@ -0,0 +1,27 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 19:31 */ @Data public class QYTPaymentCallback { /** * 加密字符串 */ private String sign; /** * 时间戳 */ private String timeStamp; /** * 请求调用唯一标识 */ private String messageId; /** * 支付结果信息 */ private QYTPaymentCallbackData data; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallbackData.java
New file @@ -0,0 +1,41 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2025/7/24 19:34 */ @Data public class QYTPaymentCallbackData { /** * 商户单标识。行程单ID */ private String partnerPayId; /** * 支付中心商户号 */ private String partnerId; /** * 支付工单标识 */ private String payId; /** * 支付状态。1.未支付 2已支付 */ private String status; /** * 支付时间,格式:YYYY-MM-DD HH:mm:ss */ private String payTime; /** * 扣款总金额 单位分 */ private String payFee; /** * 支付详细信息 */ private List<QYTPaymentInfoCallback> paymentInfos; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentInfoCallback.java
New file @@ -0,0 +1,35 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 19:37 */ @Data public class QYTPaymentInfoCallback { /** * 支付交易明细标识 */ private String payItemId; /** * 支付模式 */ private String payModeId; /** * 支付金额,单位分 */ private String payFee; /** * 实付金额,单位分 */ private String realFee; /** * 支付状态。1.未支付 2已支付 */ private String status; /** * 支付时间,格式:YYYY-MM-DD HH:mm:ss */ private String payTime; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreate.java
New file @@ -0,0 +1,19 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:17 */ @Data public class TradeOrderCreate { /** * 订单信息 */ private OrderInfo orderInfo; /** * 支付接口调用信息 */ private PayInfo payInfo; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreateData.java
New file @@ -0,0 +1,95 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.math.BigDecimal; import java.util.List; /** * @author zhibing.pu * @Date 2025/7/24 10:03 */ @Data public class TradeOrderCreateData { /** * 司机id */ private String treatShopId; /** * 应用场景标识 */ private String orderAppId; /** * 场景标识 */ private String scene; /** * 租户ID。地区行政编码。黔南州传522700 */ private String partnerId; /** * 结算信息json串。其中结算分账标识(profitSharing:0:不分账,1:分账)、是否推广单标识(isPromote:1、是、0、否)必传。例:{"profitSharing":"0",”isPromote”:”0”} */ private String field1; /** * 订单总金额,单位元 */ private BigDecimal charge; /** * 订单渠道。小程序传GRJYCXWXXCX,贵人家园传GRJY */ private String channelSource; /** * 行程单ID */ private String orderId; /** * 业务侧订单号 */ private String orderNo; /** * 下单人ID */ private String customerId; /** * 商户号,由支付中心分配。测试环境5400004 */ private String payPartnerId; /** * 商户单标识。订单中心行程单号,每次请求请保持唯一性。 */ private String partnerPayId; /** * 币种。RMB(人民币);USD(美元) */ private String currency; /** * 交易总金额,单位分。 */ private String totalFee; /** * 前台通知URL地址。 */ private String retUrl; /** * 用户IP */ private String clientIp; /** * Y代表要登录,跳到标准收银台 * N代表不需要登录,跳到无支付帐号收银台 */ private String needLoginFlag; /** * 支付单描述 */ private String orderDesc; /** * 接入模式:PC、H5、APP */ private String accessMode; /** * 支付信息 */ private List<GoodsInfoRequest> goodsInfo; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOff1Data.java
New file @@ -0,0 +1,58 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2025/7/24 10:23 */ @Data public class TradePayOff1Data { /** * 商户号,由支付中心分配。测试环境5400004 */ private String partnerId; /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 商户单标识。订单中心订单号,每次请求请保持唯一性。 */ private String partnerPayId; /** * 币种。RMB(人民币);USD(美元) */ private String currency; /** * 交易总金额,单位分。 */ private String totalFee; /** * 前台通知URL地址。 */ private String retUrl; /** * 用户IP */ private String clientIp; /** * Y代表要登录,跳到标准收银台 * N代表不需要登录,跳到无支付帐号收银台 */ private String needLoginFlag; /** * 支付单描述 */ private String orderDesc; /** * 接入模式:PC、H5、APP */ private String accessMode; /** * 商品描述信息。Json数组 */ private List<GoodsInfoRequest> goodsInfo; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOffData.java
New file @@ -0,0 +1,62 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2025/7/24 10:23 */ @Data public class TradePayOffData { /** * 商户号,由支付中心分配。测试环境5400004 */ private String partnerId; /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 商户单标识。订单中心订单号,每次请求请保持唯一性。 */ private String partnerPayId; /** * 币种。RMB(人民币);USD(美元) */ private String currency; /** * 交易总金额,单位分。 */ private String totalFee; /** * 前台通知URL地址。 */ private String retUrl; /** * 用户IP */ private String clientIp; /** * Y代表要登录,跳到标准收银台 * N代表不需要登录,跳到无支付帐号收银台 */ private String needLoginFlag; /** * 支付单描述 */ private String orderDesc; /** * 接入模式:PC、H5、APP */ private String accessMode; /** * 支付信息 */ private List<PaymentInfoRequest> paymentInfos; /** * 商品描述信息。Json数组 */ private List<GoodsInfo> goodsInfo; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeRequest.java
New file @@ -0,0 +1,31 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 10:22 */ @Data public class TradeRequest<T> { /** * 场景编号.交易中心提供。测试环境:1948289607125864448 */ private String sceneId; /** * 应用编号。中台应用appKey */ private String appId; /** * 场景版本。交易中心提供。测试环境1 */ private Integer configVersion; /** * 请求ID。每次调用唯一标识 */ private String requestId; /** * 业务数据 */ private T data; } UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TravelItinerary.java
New file @@ -0,0 +1,64 @@ package com.stylefeng.guns.modular.system.util.qianyuntong.model; import lombok.Data; /** * @author zhibing.pu * @Date 2025/7/24 16:48 */ @Data public class TravelItinerary { /** * 场景标识。交通场景传”TRAFFIC” */ private String scene; /** * 租户ID。地区行政编码。黔南州传522700 */ private String partnerId; /** * 业务侧订单号 */ private String orderNo; /** * 乘客ID */ private String customerId; /** * 司机ID */ private String driverId; /** * 订单号 */ private String orderId; /** * 推广员ID */ private String promoterId; /** * 服务商商户ID */ private String supplierShopId; /** * 场景服务类型。1、出租;2、网约车;3、城际;4、顺风车 */ private Integer serviceType; /** * 订单状态。1、待支付,11、已完结(可结算) */ private Integer orderStatus; /** * 行程单状态。2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消,11=改派中 */ private Integer status; /** * 创建时间 */ private String createTime; /** * 更新时间 */ private String updateTime; }