package com.nova.sankuai.infra.utils.hht; import cn.hutool.core.util.IdUtil; import cn.hutool.crypto.SecureUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.nova.sankuai.domain.api.aliyunIP.AliyunUtil; import com.nova.sankuai.domain.api.aliyunIP.CustomerIpInfo; import com.nova.sankuai.domain.api.hht.HhtIncomeResponse; import com.nova.sankuai.domain.api.hjqb.HjqbResponse; import com.nova.sankuai.domain.entity.*; import com.nova.sankuai.domain.enums.capitalInfo.CapitalInfoTypeCodeEnum; import com.nova.sankuai.domain.vo.capitalresult.LvdiPushResultVo; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.mapper.CityMapper; import com.nova.sankuai.infra.mapper.CustomerCapitalResultMapper; import com.nova.sankuai.infra.mapper.CustomerMapper; import com.nova.sankuai.infra.utils.RbUtil; import com.nova.sankuai.infra.utils.ResultJson; import com.nova.sankuai.infra.utils.UserUtil; import com.nova.sankuai.security.HttpClientUtil; import com.nova.sankuai.security.UserDetail; import com.nova.sankuai.service.IChannelInfoService; import com.nova.sankuai.service.ICustomerScyIncomeService; import com.nova.sankuai.service.ICustomerUserService; import com.nova.sankuai.service.IPlatformCapitalService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.DigestUtils; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import static java.util.Map.Entry.comparingByKey; import static java.util.stream.Collectors.toMap; /** * 好汇推对接 */ @Component @RequiredArgsConstructor public class HhtUtil { private static final Logger log = LoggerFactory.getLogger("capitalLogger"); private static final String CHARSET_NAME = "utf8"; private static final Long capitalId = 41L; @Value("${hht.zkUrl}") private String zkUrl; @Value("${hht.jkUrl}") private String jkUrl; @Value("${hht.channelCode}") private String channelCode; @Value("${hht.version}") private String version; @Value("${hht.aesKey}") private String aesKey; @Value("${hht.secretKey}") private String secretKey; @Value("${hht.personalAuthorizationUrl}") private String personalAuthorizationUrl; private String getJobAage(String workStartTime, String workEndTime) { if (StringUtils.isBlank(workStartTime)) {// 若为空,则不取该条数据 return ""; } workStartTime = workStartTime.substring(0, 10); LocalDate endDate = null; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate startDate = LocalDate.parse(workStartTime, formatter); if (StringUtils.isNotBlank(workEndTime)) { workEndTime = workEndTime.substring(0, 10); endDate = LocalDate.parse(workEndTime, formatter); } else { endDate = LocalDate.now(); } long month = ChronoUnit.MONTHS.between(startDate, endDate); // F:0-6个月 G:6-12个月 H:12个月以上 if (month < 6) { return "F"; } else if (month >= 6 && month < 12) { return "G"; } return "H"; } private final CustomerMapper customerMapper; private final CustomerCapitalResultMapper capitalResultMapper; private final IPlatformCapitalService platformCapitalService; private final ICustomerUserService customerUserService; private final ICustomerScyIncomeService customerZcyIncomeService; private final CityMapper cityMapper; //I:3万-5万 J:5万-10万 K:10万-30万 M:30万-50万 N:50万-100万 public static String checkValue(double value) { if (value >= 30000 && value < 50000) { return "I"; // 3万到5万 } else if (value >= 50000 && value < 100000) { return "J"; // 5万到10万 } else if (value >= 100000 && value < 300000) { return "K"; // 10万到30万 } else if (value >= 300000 && value < 500000) { return "L"; // 30万到50万 } else if (value >= 500000 && value < 1000000) { return "M"; // 50万到100万 }else { return "I"; } } private final IChannelInfoService channelInfoService; private JSONObject getParam(Customer customer) { // 获取source_channel Integer sourceChannel = customer.getSourceChannel(); Integer version2Type = 0;//判断是否2.0开关子参数 if (!Objects.isNull(sourceChannel)) { ChannelInfo channelInfo = channelInfoService.getOne(new LambdaQueryWrapper().eq(ChannelInfo::getCode, sourceChannel).last(" limit 1 ")); version2Type = channelInfo.getVersion2Type(); } Random random = new Random(); String[] values; int randomIndex; JSONObject param = new JSONObject(); /*社保*/ String soci = "BB"; /*公积金*/ String accu = "FF"; /*信用卡 WW:无信用卡 MMM:1万及以下 NNN:1万以上*/ String creditCard = "WW"; if (version2Type == 1) { //线上放款 /*社保 在"Z:连续6个月以下 AA:连续6个月"中随机匹配*/ values = new String[]{"Z", "AA"}; soci = values[random.nextInt(values.length)]; /*公积金 均在"DD:连续6个月以下 FF:连续6个月"中随机匹配*/ values = new String[]{"DD", "EE"}; accu = values[random.nextInt(values.length)]; /*信用卡 均在"MMM:1万及以下 NNN:1万以上"中随机匹配*/ values = new String[]{"MMM", "NNN"}; creditCard = values[random.nextInt(values.length)]; }else { //银行直贷 /*社保 Z:连续6个月以下 AA:连续6个月 BB:无本地社保*/ Integer social = customer.getSocialSecurity(); int soc = Objects.isNull(social) ? 0 : social.intValue(); if (soc == 1) { soci = "Z"; } else if (soc == 2) { soci = "AA"; } /*公积金 DD:连续6个月以下 EE:连续6个月 FF:无本地公积金*/ Integer accumulation = customer.getProvidentFund(); int at = Objects.isNull(accumulation) ? 0 : accumulation.intValue(); if (at == 1) accu = "DD"; else if (at == 2) accu = "EE"; /*信用卡 WW:无信用卡 MMM:1万及以下 NNN:1万以上*/ Integer cc = customer.getCreditCard(); int ccV = Objects.isNull(cc) ? 0 : cc.intValue(); if (ccV == 3) { creditCard = "MMM"; } else if (ccV == 4 || ccV == 5) { creditCard = "NNN"; } } param.put("socialSecurity", soci); param.put("providentFund", accu); param.put("creditCard", creditCard); param.put("name", customer.getName()); param.put("ip", !StringUtils.isEmpty(customer.getClientIp()) ? customer.getClientIp() : "127.0.0.1"); /*系统类型 android :安卓 ios:苹果*/ param.put("osType", !StringUtils.isEmpty(customer.getOs()) ? customer.getOs() : "android"); /*系统版本 如Android 6.0 iPhone OS 13_2_3 等*/ param.put("osVersion", !StringUtils.isEmpty(customer.getDeviceOsVersion()) ? customer.getDeviceOsVersion() : "Android 14"); /*性别 SM:男 SW:女*/ String sex = RbUtil.getGenderByIDCard(customer.getIdCard()); param.put("sex", "男".equals(sex) ? "SM" : "SW"); /*年龄 10-99的正整数。如34*/ param.put("age", RbUtil.calculateAgeFromIdNumber(customer.getIdCard())); /*用户所在城市区划代码 */ String cityCode = customer.getCity(); if (StringUtils.isEmpty(cityCode)) { City cityInfo = cityMapper.selectOne(new LambdaQueryWrapper(). likeRight(City::getName, customer.getCityName()).last(" limit 1 ")); if (cityInfo != null) { cityCode = cityInfo.getCityId(); } } if (StringUtils.isEmpty(cityCode)) { cityCode = "310100"; } param.put("cityCode", cityCode.substring(0, 6)); /*职业身份 A:上班族 B:个体户 C:自由职业 BS:企业主*/ Integer pi = customer.getProfessionInfo(); int professionInfo = 1;// 默认自由职业 String job = ""; if (!Objects.isNull(pi)) { professionInfo = pi.intValue(); } if (professionInfo == 1) { job = "C"; } else if (professionInfo == 2) { job = "A"; } else if (professionInfo == 3) { job = "BS"; }else { values = new String[]{"A", "B", "C", "BS"}; randomIndex = random.nextInt(values.length); job = values[randomIndex]; } param.put("profession", job); if ("A".equals(job)) { /*工资发放方式 D:银行卡 E:现金*/ values = new String[]{"D", "E"}; randomIndex = random.nextInt(values.length); param.put("payType", values[randomIndex]); /* 工龄 F:0-6个月 G:6-12个月 H:12个月以上*/ values = new String[]{"F", "G", "H"}; randomIndex = random.nextInt(values.length); param.put("workingAge", values[randomIndex]); } /*当职业身份为B时必填 */ if ("B".equals(job)) { /*营业执照信息 BBB:有营业执照 CCC:无营业执照*/ values = new String[]{"BBB", "CCC"}; randomIndex = random.nextInt(values.length); param.put("license", values[randomIndex]); } /*当职业身份为BS时必填 */ if ("BS".equals(job)) { /*企业注册时长 RT1:1年以内 RT2:2-3年 RT3:3-5年 RT4:5年以上*/ values = new String[]{"RT1", "RT2", "RT3", "RT4"}; // 随机选择一个索引 randomIndex = random.nextInt(values.length); // 获取随机选择的值 param.put("registerTime", values[randomIndex]); /*企业纳税总金额 TAXES1:0元-5000元 TAXES2:5000元-10万元 TAXES3:10万元-100万元 TAXES4:100万元以上*/ values = new String[]{"TAXES1", "TAXES2", "TAXES3", "TAXES4"}; randomIndex = random.nextInt(values.length); param.put("taxes", values[randomIndex]); /* 企业开票月份数 INVOICING1:18个月以上 INVOICING2:12个月以上 INVOICING3:9个月以上 INVOICING4:9个月以下*/ values = new String[]{"INVOICING1", "INVOICING2", "INVOICING3", "INVOICING4"}; randomIndex = random.nextInt(values.length); param.put("invoicing", values[randomIndex]); } /*借款金额(借多少) I:3万-5万 J:5万-10万 K:10万-30万 M:30万-50万 N:50万-100万*/ param.put("loan", checkValue(customer.getLoanAmount())); /*借款时间(借多久) L:3个月 O:6个月 P:12个月 Q:24个月 R:36个月*/ values = new String[]{"L", "O", "P", "Q", "R"}; randomIndex = random.nextInt(values.length); param.put("loanTime", values[randomIndex]); /*文化程度 S:小学 T:初中 U:高中 V:中专 W:专科 X:本科及以上*/ String et = customer.getEducation(); String education = "S"; if ("01".equals(et)) { values = new String[]{"S", "T", "U", "V"}; education = values[random.nextInt(values.length)]; } else if ("02".equals(et)) { education = "W"; } else{ education = "X"; } param.put("education", education); /** * 房产 GG:有房产,接受抵押 HH:有房产,不接受抵押 II:无房产 无论选什么,均在"GG:有房产,接受抵押HH:有房产,不接受抵押"中随机匹配 */ values = new String[]{"GG", "HH"}; param.put("estate", values[random.nextInt(values.length)]); /** * 当房产为:GG,HH时必填 房产类型 EEE:商品房 FFF:自建房 随机生成"EEE:商品房 FFF:自建房" */ values = new String[]{"EEE", "FFF"}; param.put("estateType", values[random.nextInt(values.length)]); /* 车产 JJ:有车,可接受抵押 KK:有车,不接受抵押 LL:无车产 无论选什么,均在"JJ:有车,可接受抵押 KK:有车,不接受抵押"中随机匹配 */ values = new String[]{"JJ", "KK"}; param.put("car", values[random.nextInt(values.length)]); /*当车产为:JJ,KK时必填 车产类型 GGG:全款车 HHH:贷款车 随机生成"GGG:全款车 HHH:贷款车" */ values = new String[]{"GGG", "HHH"}; param.put("carType", values[random.nextInt(values.length)]); /*当车产为:JJ,KK时必填 车产估值 III:估值9万以上 JJJ:估值9万以下 随机生成"III:估值9万以上 JJJ:估值9万以下" */ values = new String[]{"III", "JJJ"}; param.put("carAmount", values[random.nextInt(values.length)]); /*个人保险 NN:无保单 KKK:6个月及以下 LLL:6个月以上 * "无论选什么,均在""KKK:6个月及以下LLL:6个月以上""中随机匹配" * */ values = new String[]{"KKK", "LLL"}; param.put("personalInsurance", values[random.nextInt(values.length)]); /*芝麻分 OO:600以下 PP:600-650 DDD:650-700 QQ:700以上 RR:无*/ Integer customerSesame = customer.getSesame(); int cus = Objects.isNull(customerSesame) ? 1 : customerSesame.intValue(); String sesame = "PP";// 默认 1 无 if (cus == 2) { sesame = "PP"; } else if (cus == 3) { sesame = "DDD"; } else if (cus == 4) { sesame = "QQ"; } param.put("creditScore", sesame); /*微粒贷借款额度 UU:无 SS:5000以下 TT:5000以上*/ values = new String[]{"SS", "TT"}; param.put("wldLoan", values[random.nextInt(values.length)]); values = new String[]{"YY", "ZZ", "AAA"}; /*信用记录 XX:无贷款记录 YY:信用良好,无逾期 ZZ:1年内逾期少于3次 AAA:1年内逾期超过3次*/ //param.put("creditRecord", values[random.nextInt(values.length)]); param.put("creditRecord", "YY"); /*京东白条 QQQ:无京东白条 OOO:5000及以下 PPP:5000以上*/ values = new String[]{"OOO", "PPP"}; param.put("jdWhite", values[random.nextInt(values.length)]); /* 花呗 TTT:无花呗 RRR:5000及以下 SSS:5000以上*/ values = new String[]{"RRR", "SSS"}; param.put("aliBei", values[random.nextInt(values.length)]); return param; } /** * 中诚易数据推送到好汇推操作 */ public boolean zcyPushToHht(Customer customer, String logNumber) { boolean isSucc = false; log.info("日志编号:" + logNumber + ",手机号:{},中诚易数据推送到好汇推流程开始", customer.getPhone()); try { JSONObject param = getParam(customer); isSucc = push(customer, param, logNumber); Integer hht = 0; if (!isSucc) { log.error("日志编号:" + logNumber + ",手机号:{},中诚易数据推送到好汇推失败", customer.getPhone()); } else { hht = 1; } saveStatus(customer, hht); } catch (Exception ex) { log.error("日志编号:" + logNumber + ",手机号:{},中诚易数据推送到好汇推失败", customer.getPhone()); } return isSucc; } /** * 我来贷数据推送到好汇推操作 */ public boolean wldPushToHht(Customer customer, String logNumber) { boolean isSucc = false; log.info("日志编号:" + logNumber + ",手机号:{},【我来贷】数据推送到好汇推流程开始", customer.getPhone()); try { JSONObject param = getParam(customer); isSucc = push(customer, param, logNumber); Integer hht = 0; if (!isSucc) { log.error("日志编号:" + logNumber + ",手机号:{},【我来贷】数据推送到好汇推失败", customer.getPhone()); } else { hht = 1; } saveStatus(customer, hht); if (isSucc) { isSucc = wldIncomeToHht(customer, param, logNumber); } } catch (Exception ex) { log.error("日志编号:" + logNumber + ",手机号:{},【我来贷】数据推送到好汇推失败:{}", customer.getPhone(), ex.getMessage()); isSucc = false; } return isSucc; } /** * 我来贷进件数据给好汇推操作 */ public boolean wldIncomeToHht(Customer customer, JSONObject param, String logNumber) { boolean isSucc = false; log.info("日志编号:{},手机号:{},【我来贷】数据进件到好汇推流程开始", logNumber, customer.getPhone()); try { Integer hht = 3; isSucc = getWldPushResult(logNumber, param, customer); if (!isSucc) { log.error("日志编号:{},手机号:{},【我来贷】数据进件到好汇推失败", logNumber, customer.getPhone()); } else { hht = 4; log.info("日志编号:{},手机号:{},【我来贷】数据进件到好汇推成功", logNumber, customer.getPhone()); } saveStatus(customer, hht); } catch (Exception ex) { log.error("日志编号:{},手机号:{},【我来贷】数据进件到好汇推失败: {}", logNumber, customer.getPhone(), ex.getMessage()); } return isSucc; } public LvdiPushResultVo hhtPush(CustomerUser customerUser, String channelCode) { String logNumber = IdUtil.randomUUID(); log.info("日志编号:" + logNumber + "好汇推 channelCode:" + channelCode + " 推送流程开始"); Customer customer = customerMapper.getLatestCustomerRecord(customerUser.getPhone()); CustomerCapitalResult capitalResult = capitalResultMapper.selectOne(new LambdaQueryWrapper() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.HHT.getCode())); if (capitalResult == null) { log.info("日志编号:" + logNumber + " 手机号:" + customerUser.getPhone() + " 好汇推数据库结果不存在, customerUser id:" + customerUser.getId() + " customer id:" + customer.getId()); throw new CommonException("资方对接结果不存在"); } JSONObject param = getParam(customer); // 开始撞库 boolean isSucc = push(customer, param, logNumber); if (!isSucc) { return null; } // 开始进件操作 // 转成 LvdiPushResultVo LvdiPushResultVo result = new LvdiPushResultVo(); result.setCheckResult(true); result.setUrlType("1");// APP下载链接 return result; } /** * 撞库 * @param customer * @param body * @param logNumber * @return */ private boolean push(Customer customer, JSONObject body, String logNumber) { // 撞库签名参数 String timestamp = String.valueOf(System.currentTimeMillis()); JSONObject zkJsonObject = new JSONObject(); String md5Phone = DigestUtils.md5DigestAsHex(customer.getPhone().getBytes()).toUpperCase(); zkJsonObject.put("md5Phone", md5Phone); zkJsonObject.put("timestamp", timestamp); // 撞库签名 body.put("sign", getSignStr(zkJsonObject)); body.put("md5Phone", md5Phone); body.put("timestamp", timestamp); log.info("日志编号:" + logNumber + " 手机号为:" + customer.getPhone() + ",【好汇推】撞库请求的参数:{}", body); JSONObject jsonData = new JSONObject(); jsonData.put("channelCode", channelCode); jsonData.put("version", version); // 撞库内容加密 jsonData.put("content", encrypt(body.toJSONString())); String result = null; try { // 撞库 result = HttpClientUtil.getInstance().postJsonData(zkUrl, jsonData.toJSONString()); log.info("日志编号:" + logNumber + " 手机号为:" + customer.getPhone() + ",【好汇推】撞库返回参数:{}", result); } catch (Exception ex) { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】撞库失败,传参:{} ex:{}", customer.getPhone(), jsonData, ex.getMessage()); } try { HhtIncomeResponse res = JSON.parseObject(result, HhtIncomeResponse.class); if ("000000".equals(res.getHead().getReturnCode())) { log.info("日志编号:" + logNumber + " 手机号为:" + customer.getPhone() + ",【好汇推】推送成功"); // 解析 返回的body String signsResult = JSON.toJSONString(res.getBody()); log.info("日志编号:" + logNumber + " 手机号为:" + customer.getPhone() + ",【好汇推】推送成功: 返回的body转字符串: {}", signsResult); if (res.getBody().getResult()) { PlatformCapital platformCapital = JSON.parseObject(signsResult, PlatformCapital.class); // 删除同一资方的同一用户数据 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(PlatformCapital::getCustomerId, customer.getId()); wrapper.eq(PlatformCapital::getCapitalId, capitalId); platformCapitalService.remove(wrapper); // 录入到数据库 platformCapital.setCustomerId(customer.getId()); platformCapital.setCapitalId(capitalId); platformCapital.setLogoUrl(res.getBody().getLogo()); platformCapitalService.save(platformCapital); return true; } } else { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】推送失败:返回参数:{},jsonData:{}", customer.getPhone(), res,jsonData); } } catch (Exception ex) { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】推送原始返回参数转换失败,jsonData:{} ex:{}", customer.getPhone(), jsonData , ex.getMessage()); } return false; } /** * 中诚易进件数据给好汇推操作 */ public void zcyIncomeToHht(Customer customer, String logNumber) { log.info("日志编号:" + logNumber + ",手机号:{},中诚易数据进件到好汇推流程开始", customer.getPhone()); try { Integer hht = 3; ResultJson rs = getPushResult(logNumber, customer); if (rs == null) { log.error("日志编号:" + logNumber + ",手机号:{},中诚易数据进件到好汇推失败", customer.getPhone()); } else { hht = 4; log.info("日志编号:" + logNumber + ",手机号:{},中诚易数据进件到好汇推成功", customer.getPhone()); } saveStatus(customer, hht); } catch (Exception ex) { log.error("日志编号:" + logNumber + ",手机号:{},中诚易数据进件到好汇推失败", customer.getPhone()); } } private void saveStatus(Customer customer, Integer hht) { // 录入或更新到customer_scy_income表 LambdaQueryWrapper wr = new LambdaQueryWrapper<>(); wr.eq(CustomerScyIncome::getCustomerZcyId, customer.getId()); wr.last(" limit 1 "); CustomerScyIncome csi = customerZcyIncomeService.getOne(wr); if (Objects.isNull(csi)) { csi = new CustomerScyIncome(); } csi.setCustomerZcyId(customer.getId()); csi.setHht(hht); customerZcyIncomeService.saveOrUpdate(csi); } /** * 进件 */ public ResultJson income(HttpServletRequest request) { String logNumber = IdUtil.randomUUID(); log.info("日志编号:" + logNumber + " 【好汇推】进件流程开始"); String token = request.getHeader("Authorization"); UserDetail user = UserUtil.getUser(token); if (user == null) { log.info("日志编号:" + logNumber + " 好汇推进件失败,原因:用户Token无效"); throw new CommonException("用户Token无效"); } Customer customer = customerMapper.getLatestCustomerRecord(user.getPhone()); LambdaQueryWrapper wr = new LambdaQueryWrapper<>(); wr.eq(CustomerUser::getPhone, user.getPhone()); wr.eq(CustomerUser::getDeleteFlag, 0); wr.last(" limit 1 "); CustomerUser customerUser = customerUserService.getOne(wr); if (customerUser == null) { log.info("日志编号:" + logNumber + " 手机号:" + user.getPhone() + " 好汇推进件失败,原因:用户不存在"); throw new CommonException("用户不存在"); } CustomerCapitalResult capitalResult = capitalResultMapper.selectOne(new LambdaQueryWrapper() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.HHT.getCode())); if (capitalResult == null) { log.info("日志编号:" + logNumber + " 手机号:" + customerUser.getPhone() + "进件失败,原因:【好汇推】数据库结果不存在, customerUser id:" + customerUser.getId() + " customer id:" + customer.getId()); throw new CommonException("资方对接结果不存在"); } return getPushResult(logNumber, customer); } @Nullable private ResultJson getPushResult(String logNumber, Customer customer) { // 判断是否数据库中是否有数据,有过数据就不推送了 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(PlatformCapital::getCustomerId, customer.getId()); wrapper.eq(PlatformCapital::getCapitalId, capitalId); wrapper.last(" limit 1 "); PlatformCapital platformCapital = platformCapitalService.getOne(wrapper); if (Objects.isNull(platformCapital)) {// 若没有数据 log.info("日志编号:" + logNumber + " 手机号:" + customer.getPhone() + "进件失败,原因:【好汇推】推送结果不存在, customer id:" + customer.getId()); throw new CommonException("资方推送结果不存在"); } if (platformCapital.getIncomeStatus() == 1) {// 已进件成功 log.info("日志编号:" + logNumber + " 手机号:" + customer.getPhone() + "进件失败,原因:【好汇推】已经进件成功过,不再进件, customer id:" + customer.getId()); return null; } JSONObject param = getParam(customer); String phone = customer.getPhone(); /*身份证号 等*/ String idCardNo = customer.getIdCard(); param.put("idCardNo", idCardNo); // 进件签名 String timestamp = String.valueOf(System.currentTimeMillis()); JSONObject orderJsonObject = new JSONObject(); orderJsonObject.put("channelUserId", customer.getPhone()); orderJsonObject.put("timestamp", timestamp); orderJsonObject.put("name", customer.getName()); orderJsonObject.put("phone", customer.getPhone()); param.put("sign", getSignStr(orderJsonObject)); param.put("channelUserId", customer.getPhone()); param.put("timestamp", timestamp); param.put("phone", customer.getPhone()); String protoclUrl = StringUtils.replace(personalAuthorizationUrl, "id_str", platformCapital.getId() + ""); param.put("personalAuthorizationUrl", protoclUrl); log.info("日志编号:" + logNumber + " 手机号:" + customer.getPhone() + "【好汇推】,进件参数:{}", param); // 进件内容加密 JSONObject jsonData = new JSONObject(); jsonData.put("content", encrypt(param.toJSONString())); jsonData.put("channelCode", channelCode); jsonData.put("version", version); log.info("日志编号:" + logNumber + " 手机号:" + customer.getPhone() + "开始进件给资方【好汇推】,参数:{}", jsonData); String result = null; try { // 进件 result = HttpClientUtil.getInstance().postJsonData(jkUrl, jsonData.toJSONString()); log.info("日志编号:" + logNumber + " 手机号为:" + customer.getPhone() + ",【好汇推】进件原始返回参数:{}", result); } catch (Exception ex) { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】进件失败,传参:{} ex:{}", customer.getPhone(), jsonData, ex); } if (StringUtils.isBlank(result)) { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】进件返回数据为空,传参:{} ", customer.getPhone(), jsonData); } try { HhtIncomeResponse res = JSON.parseObject(result, HhtIncomeResponse.class); if ("000000".equals(res.getHead().getReturnCode())) { if (res.getHead().getResult()) { log.info("日志编号:" + logNumber + " 手机号为:" + customer.getPhone() + ",【好汇推】进件成功"); // 更新数据库 platformCapital.setIncomeStatus(1); platformCapitalService.updateById(platformCapital); LvdiPushResultVo rs = new LvdiPushResultVo(); rs.setCheckResult(true); rs.setUrlType("1");// APP下载链接 return ResultJson.ok(rs); } } else { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】进件失败:{},jsonData:{}", customer.getPhone(), res.getHead().getReturnMessage(),jsonData); } } catch (Exception ex) { log.error("日志编号:" + logNumber + " 手机号为:{},【好汇推】进件原始返回参数转换失败,jsonData:{} ex:{}", customer.getPhone(), jsonData , ex); } return null; } private boolean getWldPushResult(String logNumber, JSONObject param, Customer customer) { // 判断是否数据库中是否有数据,有过数据就不推送了 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(PlatformCapital::getCustomerId, customer.getId()); wrapper.eq(PlatformCapital::getCapitalId, capitalId); wrapper.last(" limit 1 "); PlatformCapital platformCapital = platformCapitalService.getOne(wrapper); if (Objects.isNull(platformCapital)) {// 若没有数据 log.info("日志编号:{} 手机号:{}进件失败,原因:【好汇推】推送结果不存在, customer id: {}", logNumber, customer.getPhone(), customer.getId()); return false; } if (platformCapital.getIncomeStatus() == 1) {// 已进件成功 log.info("日志编号:{} 手机号:{}进件失败,原因:【好汇推】已经进件成功过,不再进件, customer id: {}", logNumber, customer.getPhone(), customer.getId()); return false; } /*身份证号 等*/ String idCardNo = customer.getIdCard(); param.put("idCardNo", idCardNo); // 进件签名 String timestamp = String.valueOf(System.currentTimeMillis()); JSONObject orderJsonObject = new JSONObject(); orderJsonObject.put("channelUserId", customer.getPhone()); orderJsonObject.put("timestamp", timestamp); orderJsonObject.put("name", customer.getName()); orderJsonObject.put("phone", customer.getPhone()); param.put("sign", getSignStr(orderJsonObject)); param.put("channelUserId", customer.getPhone()); param.put("timestamp", timestamp); param.put("phone", customer.getPhone()); String protoclUrl = StringUtils.replace(personalAuthorizationUrl, "id_str", platformCapital.getId() + ""); protoclUrl = StringUtils.replace(protoclUrl, "getProtocolInfo", "getProtocolInfoWld"); param.put("personalAuthorizationUrl", protoclUrl); log.info("日志编号:{} 手机号:{}【好汇推】,进件参数:{}", logNumber, customer.getPhone(), param); // 进件内容加密 JSONObject jsonData = new JSONObject(); jsonData.put("content", encrypt(param.toJSONString())); jsonData.put("channelCode", channelCode); jsonData.put("version", version); log.info("日志编号:{} 手机号:{}开始进件给资方【好汇推】,参数:{}", logNumber, customer.getPhone(), jsonData); String result = null; try { // 进件 result = HttpClientUtil.getInstance().postJsonData(jkUrl, jsonData.toJSONString()); log.info("日志编号:{}, 手机号为:{},【好汇推】进件原始返回参数:{}", logNumber, customer.getPhone(), result); } catch (Exception ex) { log.error("日志编号:{}, 手机号为:{},【好汇推】进件失败,传参:{} ex:{}", logNumber, customer.getPhone(), jsonData, ex); } if (StringUtils.isBlank(result)) { log.error("日志编号:{}, 手机号为:{},【好汇推】进件返回数据为空,传参:{} ", logNumber, customer.getPhone(), jsonData); } try { HhtIncomeResponse res = JSON.parseObject(result, HhtIncomeResponse.class); if ("000000".equals(res.getHead().getReturnCode())) { if (res.getHead().getResult()) { log.info("日志编号:{}, 手机号为:{},【好汇推】进件成功", logNumber, customer.getPhone()); // 更新数据库 platformCapital.setIncomeStatus(1); platformCapitalService.updateById(platformCapital); LvdiPushResultVo rs = new LvdiPushResultVo(); rs.setCheckResult(true); rs.setUrlType("1");// APP下载链接 return true; } } else { log.error("日志编号:{}, 手机号为:{},【好汇推】进件失败:{},jsonData:{}", logNumber, customer.getPhone(), res.getHead().getReturnMessage(),jsonData); } } catch (Exception ex) { log.error("日志编号:{}, 手机号为:{},【好汇推】进件原始返回参数转换失败,jsonData:{} ex:{}", logNumber, customer.getPhone(), jsonData , ex.getMessage()); } return false; } /** * 加密 * * @param input 输入 * @return {@code String} */ private String encrypt(String input) { byte[] crypted = null; try { SecretKeySpec skey = new SecretKeySpec(aesKey.getBytes(CHARSET_NAME), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); cipher.init(Cipher.ENCRYPT_MODE, skey); crypted = cipher.doFinal(input.getBytes(CHARSET_NAME)); } catch (Exception e) { log.error("aes加密错误,原因是:", e); } Base64.Encoder encoder = Base64.getEncoder(); return encoder.encodeToString(crypted); } public String decrypt(String input) { byte[] output = null; try { Base64.Decoder decoder = Base64.getDecoder(); SecretKeySpec skey = new SecretKeySpec(aesKey.getBytes(CHARSET_NAME), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); cipher.init(Cipher.DECRYPT_MODE, skey); output = cipher.doFinal(decoder.decode(input.getBytes(CHARSET_NAME))); } catch (Exception e) { log.error("aes解密错误,原因是:", e); } return new String(output); } public String getSignStr(JSONObject json) { String signContent = getSignContent(json); return SecureUtil.md5(signContent).toUpperCase(); } /** * 1.第json的key 字典排序 * 2.按排完序的key 获取对应的 value 拼接成字符串 * * @param json * @return */ public String getSignContent(JSONObject json) { Map map = new HashMap<>(json.size()); json.forEach((s, v) -> { if (!"sign".equals(s)) { map.put(s, v); } }); // 按值排序 升序 Map sortMap = map .entrySet() .stream() .sorted(comparingByKey()) .collect( toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new)); sortMap.put("secretKey", secretKey); StringBuilder sb = new StringBuilder(); sortMap.forEach((key, value) -> { sb.append(key).append("=").append(value).append("&"); }); String result = sb.toString(); if (result.length() > 2) { result = result.substring(0, result.length() - 1); } return result; } // 我的测试 public String test() { Long id = 1826907441992253441L; String idStr = id + ""; String url = StringUtils.replace(personalAuthorizationUrl, "id_str", idStr); return url; } }