DriverJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/account/controller/UserWithdrawalController.java
@@ -1,5 +1,6 @@ package com.stylefeng.guns.modular.account.controller; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.model.TBankNext; @@ -10,6 +11,7 @@ import com.stylefeng.guns.modular.cloudPayment.req.AllocationReq; import com.stylefeng.guns.modular.cloudPayment.req.BalanceAcctReq; import com.stylefeng.guns.modular.cloudPayment.req.UserBankAccountReq; import com.stylefeng.guns.modular.huifu.biz.DouGongBasicDataBiz; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.IBankCardService; import com.stylefeng.guns.modular.system.service.ICompanyService; @@ -39,6 +41,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @Api(tags = "司机进件(提现操作)/创建电子账簿") @@ -55,9 +58,10 @@ private final IDriverService driverService; private final ICompanyService companyService; private final ITBankNextService bankNextService; private final DouGongBasicDataBiz douGongBasicDataBiz; @Autowired public UserWithdrawalController(ElectronicLedgerService electronicLedgerService, UserWithdrawalService userWithdrawalService, UserBankAccountService userBankAccountService, IBankCardService bankCardService, IDriverService driverService, ICompanyService companyService, ITBankNextService bankNextService) { public UserWithdrawalController(ElectronicLedgerService electronicLedgerService, UserWithdrawalService userWithdrawalService, UserBankAccountService userBankAccountService, IBankCardService bankCardService, IDriverService driverService, ICompanyService companyService, ITBankNextService bankNextService, DouGongBasicDataBiz douGongBasicDataBiz) { this.electronicLedgerService = electronicLedgerService; this.userWithdrawalService = userWithdrawalService; this.userBankAccountService = userBankAccountService; @@ -65,6 +69,7 @@ this.driverService = driverService; this.companyService = companyService; this.bankNextService = bankNextService; this.douGongBasicDataBiz = douGongBasicDataBiz; } @@ -82,8 +87,8 @@ userWithdrawalReq.setBankName(userWithdrawalReq.getBankName().replace("& #41;",")")); } userWithdrawalReq.setCopy1(userWithdrawalReq.getCopy1().replaceAll(" ","+")); userWithdrawalReq.setCopy2(userWithdrawalReq.getCopy2().replaceAll(" ","+")); //userWithdrawalReq.setCopy1(userWithdrawalReq.getCopy1().replaceAll(" ","+")); //userWithdrawalReq.setCopy2(userWithdrawalReq.getCopy2().replaceAll(" ","+")); // 用户进件 // 获取当前用户id Integer driverId = null; @@ -97,19 +102,28 @@ } // 查询司机 // Driver driver = driverService.selectById(id); Driver driver = driverService.selectById(driverId); List<UserWithdrawal> userWithdrawals = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("phone",driver.getPhone()).eq("type", 1)); if (CollUtil.isNotEmpty(userWithdrawals)) { return ResultUtil.error("该手机号已绑定进件信息"); } userWithdrawalReq.setOutRequestNo(ToolUtil.getRandomString(32)); UserWithdrawal userWithdrawal = new UserWithdrawal(); BeanUtils.copyProperties(userWithdrawalReq,userWithdrawal); String password = userWithdrawal.getTransactionAuthorizationCode(); //String password = userWithdrawal.getTransactionAuthorizationCode(); userWithdrawal.setOutRequestNo(ToolUtil.getRandomString(32)); try { // 司机进件 CusApplicationResp cusApplicationResp = CusApplicationExample.create(userWithdrawalReq); System.out.println(cusApplicationResp); Map<String, Object> resultMap = douGongBasicDataBiz.userBasicDataIndv(userWithdrawalReq); String respCode = (String) resultMap.get("resp_code"); if(!"00000000".equals(respCode)) { return ResultUtil.error((String) resultMap.get("resp_desc")); } //CusApplicationResp cusApplicationResp = CusApplicationExample.create(userWithdrawalReq); //System.out.println(cusApplicationResp); // 交易授权码加密,并保存司机进件信息 userWithdrawal.setTransactionAuthorizationCode(Base64Util.encode(userWithdrawal.getTransactionAuthorizationCode())); //userWithdrawal.setTransactionAuthorizationCode(Base64Util.encode(userWithdrawal.getTransactionAuthorizationCode())); // userWithdrawal.setUserId(userWithdrawal.getUserId()); userWithdrawal.setUserId(driverId); userWithdrawal.setUserType(2); @@ -117,6 +131,14 @@ userWithdrawal.setImgUrlOne(userWithdrawalReq.getIdCardReversePicture()); userWithdrawal.setIdCardFrontPicture(userWithdrawalReq.getCopy1()); userWithdrawal.setIdCardReversePicture(userWithdrawalReq.getCopy2()); userWithdrawal.setHuiFuId((String) resultMap.get("huifu_id")); //调用汇付业务入驻接口 Map<String, Object> map = douGongBasicDataBiz.userBusinessOpen(userWithdrawal); if (!"00000000".equals(map.get("resp_code"))){ return ResultUtil.error((String) map.get("resp_desc")); } String tokenNo = (String) map.get("token_no"); userWithdrawal.setTokenNo(tokenNo); userWithdrawalService.insert(userWithdrawal); // 通过司机进件信息封装银行卡信息进行数据库存储 @@ -127,48 +149,32 @@ userBankAccountService.insert(userBankAccount); // 判断是否开户成功 if("succeeded".equals(cusApplicationResp.getApplicationStatus())){ // 开户将司机进件返回的信息进行保存 userWithdrawalService.cusApplicationRespToUserWithdrawal(userWithdrawal,cusApplicationResp); userWithdrawalService.updateById(userWithdrawal); System.out.println("开户将司机进件返回的信息"); // 开户成功,开通电子账户,绑定账户 // 开通电子账簿 // 开户将司机进件返回的信息进行保存 //userWithdrawalService.cusApplicationRespToUserWithdrawal(userWithdrawal,cusApplicationResp); //userWithdrawalService.updateById(userWithdrawal); //System.out.println("开户将司机进件返回的信息"); // 开户成功,开通电子账户,绑定账户 // 开通电子账簿 // BalanceAcctReq balanceAcctReq = electronicLedgerService.createBalanceAcctReq(userWithdrawal.getCusId(),password); // BalanceAcctStoreResp balanceAcctStoreResp = BalanceAcctExample.create(balanceAcctReq); // 开通电子账簿成功,封装实体 ElectronicLedger electronicLedger = electronicLedgerService.createElectronicLedger(cusApplicationResp,userWithdrawal,password); System.out.println("开通电子账簿成功,封装实体11111"); electronicLedgerService.insert(electronicLedger); System.out.println("开通电子账簿成功,封装实体22222"); // 开通电子账簿成功,封装实体 //ElectronicLedger electronicLedger = electronicLedgerService.createElectronicLedger(cusApplicationResp,userWithdrawal,password); //System.out.println("开通电子账簿成功,封装实体11111"); //electronicLedgerService.insert(electronicLedger); //System.out.println("开通电子账簿成功,封装实体22222"); // 绑定银行卡 // 绑定银行卡 // UserBankAccountReq userBankAccountReq = electronicLedgerService.createUserBankAccountReq(bankCard,userWithdrawal.getCusId(),userWithdrawal.getCode()); // SettleAcctResp settleAcctResp = SettleAcctExample.create(userBankAccountReq); // 保存绑定银行卡返回信息 // 保存绑定银行卡返回信息 // bankCard.setVerifyStatus(settleAcctResp.getVerifyStatus()); // bankCard.setSettleAcctId(settleAcctResp.getSettleAcctId()); // bankCard.setAcctValidationFailureMsg(settleAcctResp.getAcctValidationFailureMsg()); // bankCard.setAcctValidationFinishedAt(settleAcctResp.getAcctValidationFinishedAt()); // bankCardService.updateById(bankCard); return ResultUtil.success(); } if("failed".equals(cusApplicationResp.getApplicationStatus())){ List<FailureMsgParam> failureMsgs = cusApplicationResp.getFailureMsgs(); if(failureMsgs != null && failureMsgs.size()>0){ return ResultUtil.error(failureMsgs.get(0).getReason()); } } return ResultUtil.success(); }catch (UpyztException e){ e.printStackTrace(); if(e.getCode().equals("100101")){ return ResultUtil.error(e.getIssue()); } return ResultUtil.error(e.getMessage()); } catch (Exception e){ return ResultUtil.error(e.getMessage()); } @@ -205,6 +211,7 @@ UserWithdrawal userWithdrawal1 = userWithdrawalService.selectOne(new EntityWrapper<UserWithdrawal>() .eq("userId",driver.getId()) .eq("userType",2) .eq("type", 1) .last("LIMIT 1")); if(Objects.isNull(userWithdrawal1)){ return ResultUtil.error("请先进行个人用户进件信息填写"); @@ -228,68 +235,62 @@ userWithdrawal.setCertificateExpireTime(certificateExpireTime); userWithdrawal.setOpenAccountName(openAccountName); userWithdrawal.setBankCardCode(bankCardCode); userWithdrawal.setCusId(userWithdrawal1.getCusId()); //userWithdrawal.setCusId(userWithdrawal1.getCusId()); userWithdrawal.setPhone(phone); userWithdrawal.setBankCode(bankCode); userWithdrawal.setBankBranchCode(bankBranchCode); userWithdrawal.setCode(code); System.out.println(userWithdrawal); CusApplicationResp renew = CusApplicationExample.renew(userWithdrawal); System.out.println("修改个人用户进件信息返回:{}"+renew); if("succeeded".equals(renew.getApplicationStatus())){ System.out.println("修改成功"); userWithdrawal1.setIdCardFrontPicture(copy1); userWithdrawal1.setIdCardReversePicture(copy2); userWithdrawal1.setImgUrl(idCardFrontPicture); userWithdrawal1.setImgUrlOne(idCardReversePicture); userWithdrawal1.setCertificateCode(certificateCode); userWithdrawal1.setCertificateName(certificateName); userWithdrawal1.setCertificateExpireTime(certificateExpireTime); userWithdrawal1.setOpenAccountName(openAccountName); userWithdrawal1.setBankCardCode(bankCardCode); userWithdrawal1.setBankCode(bankCode); userWithdrawal1.setBankBranchCode(bankBranchCode); userWithdrawal1.setPhone(phone); userWithdrawalService.updateById(userWithdrawal1); // 修改成功 查询该银行卡是否存在 如果不存在则添加 System.out.println("修改成功"); int count = bankCardService.selectCount(new EntityWrapper<BankCard>() .eq("code", bankCardCode) .eq("status",true)); System.out.println("查询该银行卡是否存在 如果不存在则添加"); if(count<1){ System.out.println("该银行卡不存在则添加"); BankCard bankCard = userBankAccountService.userWithdrawalToBankCard(userWithdrawal); bankCardService.insert(bankCard); System.out.println("该银行卡添加成功"); } System.out.println("查询该银行卡账户是否存在"); int count1 = userBankAccountService.selectCount(new EntityWrapper<UserBankAccount>() .eq("bankCardCode", bankCardCode) .eq("userType", 2) .eq("userId",driverId) .eq("status",true)); if(count1<1){ // 添加用户银行卡 System.out.println("该银行卡账户不存在则添加"); UserBankAccount userBankAccount = userBankAccountService.userWithdrawalToUserBankAccount(userWithdrawal); userBankAccountService.insert(userBankAccount); System.out.println("该银行卡账户添加成功"); } Map<String, Object> resultMap = douGongBasicDataBiz.userBasicDataIndvModify(userWithdrawal); //CusApplicationResp renew = CusApplicationExample.renew(userWithdrawal); //System.out.println("修改个人用户进件信息返回:{}"+renew); if (!"00000000".equals(resultMap.get("resp_code"))){ return ResultUtil.error((String) resultMap.get("resp_desc")); } if("failed".equals(renew.getApplicationStatus())){ List<FailureMsgParam> failureMsgs = renew.getFailureMsgs(); if(failureMsgs != null && failureMsgs.size()>0){ return ResultUtil.error(failureMsgs.get(0).getReason()); } //用户业务入驻修改 Map<String, Object> map = douGongBasicDataBiz.userBusinessOpenModify(userWithdrawal); if (!"00000000".equals(map.get("resp_code"))){ return ResultUtil.error((String) map.get("resp_desc")); } userWithdrawal1.setIdCardFrontPicture(copy1); userWithdrawal1.setIdCardReversePicture(copy2); userWithdrawal1.setImgUrl(idCardFrontPicture); userWithdrawal1.setImgUrlOne(idCardReversePicture); userWithdrawal1.setCertificateCode(certificateCode); userWithdrawal1.setCertificateName(certificateName); userWithdrawal1.setCertificateExpireTime(certificateExpireTime); userWithdrawal1.setOpenAccountName(openAccountName); userWithdrawal1.setBankCardCode(bankCardCode); userWithdrawal1.setBankCode(bankCode); userWithdrawal1.setBankBranchCode(bankBranchCode); userWithdrawal1.setPhone(phone); userWithdrawalService.updateById(userWithdrawal1); // 修改成功 查询该银行卡是否存在 如果不存在则添加 System.out.println("修改成功"); int count = bankCardService.selectCount(new EntityWrapper<BankCard>() .eq("code", bankCardCode) .eq("status",true)); System.out.println("查询该银行卡是否存在 如果不存在则添加"); if(count<1){ System.out.println("该银行卡不存在则添加"); BankCard bankCard = userBankAccountService.userWithdrawalToBankCard(userWithdrawal); bankCardService.insert(bankCard); System.out.println("该银行卡添加成功"); } System.out.println("查询该银行卡账户是否存在"); int count1 = userBankAccountService.selectCount(new EntityWrapper<UserBankAccount>() .eq("bankCardCode", bankCardCode) .eq("userType", 2) .eq("userId",driverId) .eq("status",true)); if(count1<1){ // 添加用户银行卡 System.out.println("该银行卡账户不存在则添加"); UserBankAccount userBankAccount = userBankAccountService.userWithdrawalToUserBankAccount(userWithdrawal); userBankAccountService.insert(userBankAccount); System.out.println("该银行卡账户添加成功"); } return ResultUtil.success(); }catch (UpyztException e){ e.printStackTrace(); if(e.getCode().equals("100101")){ return ResultUtil.error(e.getIssue()); } return ResultUtil.error(e.getMessage()); } catch (Exception e){ e.printStackTrace(); return ResultUtil.error(e.getMessage()); @@ -310,8 +311,7 @@ return ResultUtil.tokenErr(); } Driver driver = driverService.selectById(driverId); List<UserWithdrawal> userWithdrawals = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("userId",driver.getId()) .eq("userType",2)); List<UserWithdrawal> userWithdrawals = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("phone",driver.getPhone()).eq("type", 1)); if(userWithdrawals.size()==0){ return ResultUtil.success("yes"); } @@ -341,6 +341,7 @@ .eq("userId",driver.getId()) .eq("userType",2) .eq("applicationStatus","succeeded") .eq("type", 1) .last("LIMIT 1")); if(Objects.isNull(userWithdrawal)){ return ResultUtil.success(new Object()); @@ -370,7 +371,8 @@ // TODO 司机进件信息 List<UserWithdrawal> userWithdrawals = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>() .eq("userId", driver.getId()) .eq("userType",2)); .eq("userType",2) .eq("type", 1)); if(userWithdrawals.size()==0){ return ResultUtil.error("请先进行个人用户进件信息填写"); } DriverJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/huifu/biz/DouGongBasicDataBiz.java
New file @@ -0,0 +1,235 @@ package com.stylefeng.guns.modular.huifu.biz; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.huifu.bspay.sdk.opps.core.BasePay; import com.huifu.bspay.sdk.opps.core.config.MerConfig; import com.huifu.bspay.sdk.opps.core.net.BasePayRequest; import com.stylefeng.guns.core.util.RequestSeqUtil; import com.stylefeng.guns.modular.account.req.UserWithdrawalReq; import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties; import com.stylefeng.guns.modular.system.model.UserWithdrawal; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 斗拱进件业务 * @author mitao * @date 2025/11/14 */ @Slf4j @Component public class DouGongBasicDataBiz { @Autowired private HuiFuProperties huiFuProperties; /** * 个人用户基本信息开户 * @return * @throws Exception */ public Map<String, Object> userBasicDataIndv(UserWithdrawal userWithdrawal) throws Exception { // 1. 数据初始化,填入对应的商户配置 MerConfig merConfig = new MerConfig(); merConfig.setProcutId(huiFuProperties.getProductId()); merConfig.setSysId(huiFuProperties.getSysId()); merConfig.setRsaPrivateKey(huiFuProperties.getRsaPrivateKey()); merConfig.setRsaPublicKey(huiFuProperties.getRsaPublicKey()); BasePay.initWithMerConfig(merConfig); // 2.组装请求参数 Map<String, Object> paramsInfo = new HashMap<>(); // 请求流水号(动态生成,确保唯一性) paramsInfo.put("req_seq_id", RequestSeqUtil.generateForHuiFu()); // 请求日期 paramsInfo.put("req_date", DateUtil.format(new Date(),"yyyyMMdd")); // 个人证件类型 paramsInfo.put("cert_type", "00"); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 paramsInfo.put("cert_begin_date", startDateStr.replace("-", "")); // 个人证件有效期截止日期 String endDateStr = certificateExpireDateArr[1]; if (!"长期".equals(endDateStr)) { String formatEndDate = endDateStr.replace("-", ""); paramsInfo.put("cert_end_date", formatEndDate); // 个人证件有效期类型 paramsInfo.put("cert_validity_type", "0"); }else { // 个人证件有效期类型 paramsInfo.put("cert_validity_type", "1"); } // 手机号 paramsInfo.put("mobile_no", userWithdrawal.getPhone()); // 个人姓名 paramsInfo.put("name", userWithdrawal.getOpenAccountName()); // 个人证件号码 paramsInfo.put("cert_no", userWithdrawal.getCertificateCode()); // 是否发送短信标识 paramsInfo.put("sms_send_flag", "1"); // 3. 发起API调用 log.info("个人用户基本信息开户请求参数:{}", paramsInfo); Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/basicdata/indv", paramsInfo, null, false); log.info("个人用户基本信息开户返回参数:{}", response); return response; } /** * 个人用户基本信息修改 * @return * @throws Exception */ public Map<String, Object> userBasicDataIndvModify(UserWithdrawal userWithdrawal) throws Exception { // 1. 数据初始化,填入对应的商户配置 MerConfig merConfig = new MerConfig(); merConfig.setProcutId(huiFuProperties.getProductId()); merConfig.setSysId(huiFuProperties.getSysId()); merConfig.setRsaPrivateKey(huiFuProperties.getRsaPrivateKey()); merConfig.setRsaPublicKey(huiFuProperties.getRsaPublicKey()); BasePay.initWithMerConfig(merConfig); // 2.组装请求参数 Map<String, Object> paramsInfo = new HashMap<>(); // 请求流水号 paramsInfo.put("req_seq_id", RequestSeqUtil.generateForHuiFu()); // 请求日期 paramsInfo.put("req_date", DateUtil.format(new Date(),"yyyyMMdd")); // 汇付客户Id paramsInfo.put("huifu_id", userWithdrawal.getHuiFuId()); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 paramsInfo.put("cert_begin_date", startDateStr.replace("-", "")); // 个人证件有效期截止日期 String endDateStr = certificateExpireDateArr[1]; if (!"长期".equals(endDateStr)) { String formatEndDate = endDateStr.replace("-", ""); paramsInfo.put("cert_end_date", formatEndDate); // 个人证件有效期类型 paramsInfo.put("cert_validity_type", "0"); }else { // 个人证件有效期类型 paramsInfo.put("cert_validity_type", "1"); } // 手机号 paramsInfo.put("mobile_no", userWithdrawal.getPhone()); log.info("个人用户基本信息修改返回参数:{}", paramsInfo); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/basicdata/indv/modify", paramsInfo, null, false); log.info("个人用户基本信息修改返回参数:{}", response); return response; } /** * 用户业务入驻 * @return * @throws Exception */ public Map<String, Object> userBusinessOpen(UserWithdrawal userWithdrawal) throws Exception { // 1. 数据初始化,填入对应的商户配置 MerConfig merConfig = new MerConfig(); merConfig.setProcutId(huiFuProperties.getProductId()); merConfig.setSysId(huiFuProperties.getSysId()); merConfig.setRsaPrivateKey(huiFuProperties.getRsaPrivateKey()); merConfig.setRsaPublicKey(huiFuProperties.getRsaPublicKey()); BasePay.initWithMerConfig(merConfig); // 2.组装请求参数 Map<String, Object> paramsInfo = new HashMap<>(); // 汇付ID paramsInfo.put("huifu_id", userWithdrawal.getHuiFuId()); // 请求流水号 paramsInfo.put("req_seq_id", RequestSeqUtil.generateForHuiFu()); // 请求日期 paramsInfo.put("req_date", DateUtil.format(new Date(),"yyyyMMdd")); // 渠道商/商户汇付Id paramsInfo.put("upper_huifu_id", huiFuProperties.getUpperHuifuId()); //// 结算信息配置 //paramsInfo.put("settle_config", "{\"settle_cycle\":\"D1\",\"min_amt\":\"0.01\",\"remained_amt\":\"10.00\",\"settle_abstract\":\"结算摘要\",\"out_settle_flag\":\"2\",\"settle_batch_no\":\"300\",\"fixed_ratio\":\"2\"}"); // 结算卡信息 JSONObject cardInfo = new JSONObject(); cardInfo.put("card_type", "1"); cardInfo.put("card_name", userWithdrawal.getBindAcctName()); cardInfo.put("card_no", userWithdrawal.getBankCardCode()); cardInfo.put("prov_id", userWithdrawal.getBankCardProvinceCode()); cardInfo.put("area_id", userWithdrawal.getBankCardCityCode()); cardInfo.put("cert_type", "00"); cardInfo.put("cert_no", userWithdrawal.getCertificateCode()); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 cardInfo.put("cert_begin_date", startDateStr.replace("-", "")); // 个人证件有效期截止日期 String endDateStr = certificateExpireDateArr[1]; if (!"长期".equals(endDateStr)) { String formatEndDate = endDateStr.replace("-", ""); cardInfo.put("cert_end_date", formatEndDate); // 个人证件有效期类型 cardInfo.put("cert_validity_type", "0"); }else { // 个人证件有效期类型 cardInfo.put("cert_validity_type", "1"); } paramsInfo.put("card_info", cardInfo.toJSONString()); log.info("用户业务入驻返回参数:{}", paramsInfo); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/busi/open", paramsInfo, null, false);; log.info("用户业务入驻返回参数:{}", response); return response; } /** * 用户业务入驻 * @return * @throws Exception */ public Map<String, Object> userBusinessOpenModify(UserWithdrawal userWithdrawal) throws Exception { // 1. 数据初始化,填入对应的商户配置 MerConfig merConfig = new MerConfig(); merConfig.setProcutId(huiFuProperties.getProductId()); merConfig.setSysId(huiFuProperties.getSysId()); merConfig.setRsaPrivateKey(huiFuProperties.getRsaPrivateKey()); merConfig.setRsaPublicKey(huiFuProperties.getRsaPublicKey()); BasePay.initWithMerConfig(merConfig); // 2.组装请求参数 Map<String, Object> paramsInfo = new HashMap<>(); // 汇付ID paramsInfo.put("huifu_id", userWithdrawal.getHuiFuId()); // 请求流水号 paramsInfo.put("req_seq_id", RequestSeqUtil.generateForHuiFu()); // 请求日期 paramsInfo.put("req_date", DateUtil.format(new Date(),"yyyyMMdd")); // 渠道商/商户汇付Id paramsInfo.put("upper_huifu_id", huiFuProperties.getUpperHuifuId()); // 结算卡信息 JSONObject cardInfo = new JSONObject(); cardInfo.put("card_type", "1"); cardInfo.put("card_name", userWithdrawal.getBindAcctName()); cardInfo.put("card_no", userWithdrawal.getBankCardCode()); cardInfo.put("prov_id", userWithdrawal.getBankCardProvinceCode()); cardInfo.put("area_id", userWithdrawal.getBankCardCityCode()); cardInfo.put("cert_type", "00"); cardInfo.put("cert_no", userWithdrawal.getCertificateCode()); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 cardInfo.put("cert_begin_date", startDateStr.replace("-", "")); // 个人证件有效期截止日期 String endDateStr = certificateExpireDateArr[1]; if (!"长期".equals(endDateStr)) { String formatEndDate = endDateStr.replace("-", ""); cardInfo.put("cert_end_date", formatEndDate); // 个人证件有效期类型 cardInfo.put("cert_validity_type", "0"); }else { // 个人证件有效期类型 cardInfo.put("cert_validity_type", "1"); } paramsInfo.put("card_info", cardInfo.toJSONString()); log.info("用户业务入驻修改返回参数:{}", paramsInfo); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/busi/open", paramsInfo, null, false);; log.info("用户业务入驻修改返回参数:{}", response); return response; } } DriverJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/huifu/config/HuiFuPropertiesConfiguration.java
New file @@ -0,0 +1,14 @@ package com.stylefeng.guns.modular.huifu.config; import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * @author mitao * @date 2025/11/14 */ @Configuration @EnableConfigurationProperties({HuiFuProperties.class}) public class HuiFuPropertiesConfiguration { } DriverJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/huifu/properties/HuiFuProperties.java
New file @@ -0,0 +1,39 @@ package com.stylefeng.guns.modular.huifu.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @author mitao * @date 2025/11/14 */ @Data @Component @ConfigurationProperties(prefix = "huifu") public class HuiFuProperties { /** * 汇付分配的产品号 */ private String productId; /** * 汇付分配的系统号 */ private String sysId; /** * 服务商私钥,用于调用接口时进行签名 */ private String rsaPrivateKey; /** * 汇付公钥,用于对汇付返回报文进行签名验证 */ private String rsaPublicKey; /** * 汇付ID */ private String huifuId; /** * 渠道商/商户汇付Id */ private String upperHuifuId; } DriverJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserWithdrawal.java
@@ -158,6 +158,22 @@ @ApiModelProperty(value = "验证码") private String code; @ApiModelProperty(value = "开户行所在省编码") private String bankCardProvinceCode; @ApiModelProperty(value = "开户行所在市编码") private String bankCardCityCode; @ApiModelProperty(value = "进件类型 0-江苏银行;1-汇付") private Integer type; @ApiModelProperty(value = "汇付ID") private String huiFuId; @ApiModelProperty(value = "取现卡序列号") private String tokenNo; /* @TableField("companyId") @ApiModelProperty(value = "分公司ID") DriverJYXTravel/guns-admin/src/main/resources/application.yml
@@ -80,24 +80,24 @@ # filters: wall,mergeStat #spring: datasource: url: jdbc:mysql://rm-2ze3v6o025804w200ho.mysql.rds.aliyuncs.com:3306/jyxtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai username: ztjyx password: g@arm2tx+fcxFREizr6LDt84s)UKv2EZ db-name: jyxtravel #用来搜集数据库的所有表 filters: wall,mergeStat # datasource: # url: jdbc:mysql://rm-2ze3v6o025804w200ho.mysql.rds.aliyuncs.com:3306/jyxtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai # username: ztjyx # password: g@arm2tx+fcxFREizr6LDt84s)UKv2EZ # db-name: jyxtravel #用来搜集数据库的所有表 # filters: wall,mergeStat # datasource: # url: jdbc:mysql://123.56.89.63:3306/jyxtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai # username: root # password: root # db-name: jyxtravel #用来搜集数据库的所有表 # filters: wall,mergeStat # datasource: # url: jdbc:mysql://127.0.0.1:3306/jyxtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai # username: root # password: 123456 # db-name: jyxtravel #用来搜集数据库的所有表 # filters: wall,mergeStat datasource: url: jdbc:mysql://127.0.0.1:3307/jyxtravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai username: root_remote password: 123456 db-name: jyxtravel #用来搜集数据库的所有表 filters: wall,mergeStat redis: #测试环境 host: 127.0.0.1 @@ -214,4 +214,10 @@ # msgSrcId: 1017 # mid: 898201612345678 # tid: 88880001 # instMid: QRPAYDEFAULT # instMid: QRPAYDEFAULT huifu: product_id: KAZX sys_id: 6666000182995771 rsa_private_key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4= rsa_public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWrruP9JBxrUd8uEX5Z8y7pg/UIr5RNHSgDnHqNI1hbi2MfTzB5vZ275wSFFaLDD9BesgDWqsUepPS/opROlDCg9y6WYH8mkN23NmHL9F8kT48OMmH722am+Hp0XVMMwXqA0oNt4f7oW6kDemjZW8/RT4vIE7cyxoxSsVRvjqSpx9wDgFLPWh3o0pHQaoxLyeUsGBATHFrxEDlosBvsuXjMcgjPKXALrcemzKOhBmBkLgyxNVmh61ZK+FNXd+/X4PeZlnWf54NRQAUKe1308E6IIaszo+CjneKuhj1m/X4f7AIvxAqlhuCV5E/DfKRmGopxaWqdtE960Y/H4SmBh2wIDAQAB upper_huifu_id: 6666000182995771 UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
@@ -1,5 +1,6 @@ package com.stylefeng.guns; import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties; import org.apache.http.client.HttpClient; import org.apache.http.config.SocketConfig; import org.apache.http.impl.client.HttpClientBuilder; @@ -9,6 +10,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/account/controller/AccountController.java
@@ -84,7 +84,7 @@ return ResultUtil.error("不能重复添加银行卡"); } List<UserWithdrawal> userId = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("phone", user.getPhone()).eq("userType",1)); List<UserWithdrawal> userId = userWithdrawalService.selectList(new EntityWrapper<UserWithdrawal>().eq("phone", user.getPhone()).eq("userType",1).eq("type", 1)); if(userId.size()==0){ return ResultUtil.error("请先进行个人用户进件信息填写"); } @@ -96,9 +96,9 @@ userBankAccount1.setOutRequestNo(ToolUtil.getRandomString(32)); userBankAccount1.setBankAcctType("1"); bankAccountService.insert(userBankAccount1); UserBankAccountReq userBankAccountReq = new UserBankAccountReq(); BeanUtils.copyProperties(userBankAccount1,userBankAccountReq); userBankAccountReq.setCusId(userId.get(0).getCusId()); //UserBankAccountReq userBankAccountReq = new UserBankAccountReq(); //BeanUtils.copyProperties(userBankAccount1,userBankAccountReq); //userBankAccountReq.setCusId(userId.get(0).getCusId()); // SettleAcctResp settleAcctResp = SettleAcctExample.create(userBankAccountReq); // userBankAccount1.setOutRequestNo(settleAcctResp.getOutRequestNo()); // userBankAccount1.setVerifyStatus(settleAcctResp.getVerifyStatus()); UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/account/controller/ElectronicLedgerController.java
@@ -80,7 +80,7 @@ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) @Transactional(rollbackFor = UpyztException.class,propagation = Propagation.REQUIRES_NEW) public ResultUtil addElectronicLedger( UserWithdrawalReq userWithdrawalReq,HttpServletRequest request) throws UnsupportedEncodingException { public ResultUtil addElectronicLedger( UserWithdrawalReq userWithdrawalReq,HttpServletRequest request) { System.out.println("进件信息:"+userWithdrawalReq); // TODO 用户有无提现密码,无则设置开户密码 if(StringUtils.hasLength(userWithdrawalReq.getBankName())){ @@ -103,7 +103,7 @@ UserWithdrawal userWithdrawal = new UserWithdrawal(); BeanUtils.copyProperties(userWithdrawalReq,userWithdrawal); try { String password=userWithdrawal.getTransactionAuthorizationCode(); //String password=userWithdrawal.getTransactionAuthorizationCode(); Integer id = userInfoService.getUserIdFormRedis(request); if(null == id){ return ResultUtil.tokenErr(); @@ -112,13 +112,13 @@ userWithdrawalReq.setCopy1(userWithdrawalReq.getCopy1().replaceAll(" ","+")); userWithdrawalReq.setCopy2(userWithdrawalReq.getCopy2().replaceAll(" ","+")); // 用户进件 Map<String, Object> resultMap = douGongBasicDataBiz.userBasicDataIndv(userWithdrawalReq); Map<String, Object> resultMap = douGongBasicDataBiz.userBasicDataIndv(userWithdrawal); String respCode = (String) resultMap.get("resp_code"); //CusApplicationResp cusApplicationResp = CusApplicationExample.create(userWithdrawalReq); if(!"200".equals(respCode)) { if(!"00000000".equals(respCode)) { return ResultUtil.error((String) resultMap.get("resp_desc")); } userWithdrawal.setTransactionAuthorizationCode(Base64Util.encode(password)); //userWithdrawal.setTransactionAuthorizationCode(Base64Util.encode(password)); userWithdrawal.setUserType(1); userWithdrawal.setUserId(id); userWithdrawal.setImgUrl(userWithdrawalReq.getIdCardFrontPicture()); @@ -128,11 +128,12 @@ userWithdrawal.setHuiFuId((String) resultMap.get("huifu_id")); //调用汇付业务入驻接口 Map<String, Object> map = douGongBasicDataBiz.userBusinessOpen(userWithdrawal); if (!"200".equals(map.get("resp_code"))){ if (!"00000000".equals(map.get("resp_code"))){ return ResultUtil.error((String) map.get("resp_desc")); } String tokenNo = (String) map.get("token_no"); userWithdrawal.setTokenNo(tokenNo); userWithdrawal.setType(1); userWithdrawalService.insert(userWithdrawal); // 开通电子账簿 /* BalanceAcctReq balanceAcctReq = new BalanceAcctReq(); @@ -229,9 +230,9 @@ } UserInfo userInfo = userInfoService.selectById(driverId); UserWithdrawal userWithdrawal1 = userWithdrawalService.selectOne(new EntityWrapper<UserWithdrawal>() .eq("phone", userInfo.getPhone()) .eq("phone", userInfo.getPhone()).eq("type", 1) .last("LIMIT 1")); if(userWithdrawal1==null|| userWithdrawal1.getCusId()==null){ if(userWithdrawal1==null|| userWithdrawal1.getHuiFuId()==null){ return ResultUtil.runErr(); } UserWithdrawal userWithdrawal = new UserWithdrawal(); @@ -252,12 +253,12 @@ userWithdrawal.setBankCardCityCode(bankCardCityCode); //CusApplicationResp renew = CusApplicationExample.renew(userWithdrawal); Map<String, Object> resultMap = douGongBasicDataBiz.userBasicDataIndvModify(userWithdrawal); if (!"200".equals(resultMap.get("resp_code"))){ if (!"00000000".equals(resultMap.get("resp_code"))){ return ResultUtil.error((String) resultMap.get("resp_desc")); } //调用用户业务入驻修改 Map<String, Object> map = douGongBasicDataBiz.userBusinessOpenModify(userWithdrawal); if (!"200".equals(map.get("resp_code"))){ if (!"00000000".equals(map.get("resp_code"))){ return ResultUtil.error((String) map.get("resp_desc")); } userWithdrawal1.setIdCardFrontPicture(copy1); UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/huifu/biz/DouGongBasicDataBiz.java
@@ -7,6 +7,7 @@ import com.huifu.bspay.sdk.opps.core.config.MerConfig; import com.huifu.bspay.sdk.opps.core.net.BasePayRequest; import com.huifu.bspay.sdk.opps.core.utils.RsaUtils; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.account.req.UserWithdrawalReq; import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties; import com.stylefeng.guns.core.util.RequestSeqUtil; @@ -28,14 +29,14 @@ @Component public class DouGongBasicDataBiz { @Autowired private static HuiFuProperties huiFuProperties; private HuiFuProperties huiFuProperties; /** * 个人用户基本信息开户 * @return * @throws Exception */ public Map<String, Object> userBasicDataIndv(UserWithdrawalReq userWithdrawalReq) throws Exception { public Map<String, Object> userBasicDataIndv(UserWithdrawal userWithdrawal) throws Exception { // 1. 数据初始化,填入对应的商户配置 MerConfig merConfig = new MerConfig(); merConfig.setProcutId(huiFuProperties.getProductId()); @@ -51,7 +52,7 @@ paramsInfo.put("req_date", DateUtil.format(new Date(),"yyyyMMdd")); // 个人证件类型 paramsInfo.put("cert_type", "00"); String[] certificateExpireDateArr = userWithdrawalReq.getCertificateExpireTime().split(","); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 paramsInfo.put("cert_begin_date", startDateStr.replace("-", "")); @@ -67,16 +68,17 @@ paramsInfo.put("cert_validity_type", "1"); } // 手机号 paramsInfo.put("mobile_no", userWithdrawalReq.getPhone()); paramsInfo.put("mobile_no", userWithdrawal.getPhone()); // 个人姓名 paramsInfo.put("name", RsaUtils.encrypt(userWithdrawalReq.getOpenAccountName(), huiFuProperties.getRsaPublicKey())); paramsInfo.put("name", userWithdrawal.getOpenAccountName()); // 个人证件号码 paramsInfo.put("cert_no", RsaUtils.encrypt(userWithdrawalReq.getCertificateCode(), huiFuProperties.getRsaPublicKey())); paramsInfo.put("cert_no", userWithdrawal.getCertificateCode()); // 是否发送短信标识 paramsInfo.put("sms_send_flag", "1"); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/basicdata/indv", paramsInfo, null, false);; log.info("个人用户基本信息开户返回参数:" + response); log.info("个人用户基本信息开户请求参数:{}", paramsInfo); Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/basicdata/indv", paramsInfo, null, false); log.info("个人用户基本信息开户返回参数:{}", response); return response; } /** @@ -117,9 +119,10 @@ } // 手机号 paramsInfo.put("mobile_no", userWithdrawal.getPhone()); log.info("个人用户基本信息修改返回参数:{}", paramsInfo); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/basicdata/indv/modify", paramsInfo, null, false); log.info("个人用户基本信息修改返回参数:" + response); log.info("个人用户基本信息修改返回参数:{}", response); return response; } /** @@ -150,11 +153,12 @@ // 结算卡信息 JSONObject cardInfo = new JSONObject(); cardInfo.put("card_type", "1"); cardInfo.put("card_name", userWithdrawal.getBindAcctName()); cardInfo.put("card_name", userWithdrawal.getOpenAccountName()); cardInfo.put("card_no", userWithdrawal.getBankCardCode()); cardInfo.put("prov_id", userWithdrawal.getBankCardProvinceCode()); cardInfo.put("area_id", userWithdrawal.getBankCardCityCode()); cardInfo.put("cert_type", "00"); cardInfo.put("cert_no", userWithdrawal.getCertificateCode()); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 @@ -171,9 +175,10 @@ cardInfo.put("cert_validity_type", "1"); } paramsInfo.put("card_info", cardInfo.toJSONString()); log.info("用户业务入驻返回参数:{}", paramsInfo); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/busi/open", paramsInfo, null, false);; log.info("用户业务入驻返回参数:" + response); log.info("用户业务入驻返回参数:{}", response); return response; } /** @@ -202,11 +207,12 @@ // 结算卡信息 JSONObject cardInfo = new JSONObject(); cardInfo.put("card_type", "1"); cardInfo.put("card_name", userWithdrawal.getBindAcctName()); cardInfo.put("card_name", userWithdrawal.getOpenAccountName()); cardInfo.put("card_no", userWithdrawal.getBankCardCode()); cardInfo.put("prov_id", userWithdrawal.getBankCardProvinceCode()); cardInfo.put("area_id", userWithdrawal.getBankCardCityCode()); cardInfo.put("cert_type", "00"); cardInfo.put("cert_no", userWithdrawal.getCertificateCode()); String[] certificateExpireDateArr = userWithdrawal.getCertificateExpireTime().split(","); String startDateStr = certificateExpireDateArr[0]; // 个人证件有效期开始日期 @@ -223,9 +229,10 @@ cardInfo.put("cert_validity_type", "1"); } paramsInfo.put("card_info", cardInfo.toJSONString()); log.info("用户业务入驻修改返回参数:{}", paramsInfo); // 3. 发起API调用 Map<String, Object> response = BasePayRequest.requestBasePay("v2/user/busi/open", paramsInfo, null, false);; log.info("用户业务入驻修改返回参数:" + response); log.info("用户业务入驻修改返回参数:{}", response); return response; } } UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/huifu/req/UserBasicDataReq.java
File was deleted