package com.saye.hgddmz.controller; import cn.hutool.core.util.RandomUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.http.HttpUtil; import com.saye.hgddmz.commons.date.DateDUtil; import com.saye.hgddmz.commons.string.StringDUtil; import com.saye.hgddmz.entity.BankbillHistory; import com.saye.hgddmz.util.DownloadFtpUtil; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.Cell; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import java.io.File; import java.io.FileInputStream; import java.util.*; /** * @author thuang * @version 1.0 * @description: TODO * @date 2021/9/22 13:55 */ @Controller @Slf4j public class GetDateController { private static String grant_type = "client_credential"; private static String appid = "wx45acd2b4907cb8f4"; private static String secret = "895b90585c4698485c07e113711eac85"; private static String key = "Nxwj20250903Jojubanking12091209x"; /** * 安全获取单元格字符串值 * @param row 行对象 * @param cellIndex 单元格索引 * @return 单元格字符串值,如果单元格为空则返回空字符串 */ private static String getCellStringValue(HSSFRow row, int cellIndex) { if (row == null) { return ""; } HSSFCell cell = row.getCell(cellIndex); if (cell == null) { return ""; } try { cell.setCellType(Cell.CELL_TYPE_STRING); String value = cell.getStringCellValue(); return value != null ? value.trim() : ""; } catch (Exception e) { log.warn("获取单元格值失败,行: {}, 列: {}, 错误: {}", row.getRowNum(), cellIndex, e.getMessage()); return ""; } } /** * 安全获取单元格日期值 * @param row 行对象 * @param cellIndex 单元格索引 * @return 日期字符串,如果单元格为空或不是日期格式则返回空字符串 */ private static String getCellDateValue(HSSFRow row, int cellIndex) { if (row == null) { return ""; } HSSFCell cell = row.getCell(cellIndex); if (cell == null) { return ""; } try { cell.setCellType(Cell.CELL_TYPE_NUMERIC); if (HSSFDateUtil.isCellDateFormatted(cell)) { Date dateCellValue = cell.getDateCellValue(); return DateDUtil.DateToStr(DateDUtil.yyyy_MM_dd, dateCellValue); } return ""; } catch (Exception e) { log.warn("获取单元格日期值失败,行: {}, 列: {}, 错误: {}", row.getRowNum(), cellIndex, e.getMessage()); return ""; } } /** * @description: 获取银行端商户对账数据 * @author thuang * @date 2021/9/22 13:57 * @version 1.0 */ @PostMapping("/getBankDataBySH") @ResponseBody public HashMap getBankDataBySH(@RequestBody HashMap map) { HashMap responseMap = new HashMap<>(); String errCode = "0"; String errMsg = ""; // 先下载文件 String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST")); String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT")); int port = Integer.parseInt("".equals(portStr) ? "21" : portStr); String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER")); String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD")); String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH")); String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID")); String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH")); String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME")); String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME")); String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID")); String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date")); HSSFWorkbook sheets = null; try { // 下载文件 log.info("开始下载FTP文件: " + ftp_file_name); boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name); // 判断是否下载到文件 if (!b) { log.error("FTP文件下载失败: " + ftp_file_name); errCode = "1"; errMsg = "FTP文件下载失败,请检查FTP连接参数和文件是否存在"; responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } // 判断本地是否有文件 File file = new File(localPath + "/" + ftp_file_name); if (file.exists()) { // 存在 开始解析 存入数据库 FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name); sheets = new HSSFWorkbook(fileInputStream); HSSFSheet sheet = sheets.getSheetAt(0); // 获取sheet中第一行行号 int firstRowNum = sheet.getFirstRowNum(); // 获取sheet中最后一行行号 int lastRowNum = sheet.getLastRowNum(); List list = new ArrayList<>(); for (int i = firstRowNum + 3; i <= lastRowNum - 2; i++) {// 因为表格中第一行为说明,第二行为列标题 HSSFRow row = sheet.getRow(i); if (row == null) { continue; } BankbillHistory bankbillHistory = new BankbillHistory(); // 清算日期 String qsrqStr = getCellStringValue(row, 0); // 拿第一个字段判断这条记录是否为空 如果为空直接跳出 一般这字段为空就是数据结束了或根本没有 // 为合计也跳出 if ("".equals(qsrqStr) || "合计".equals(qsrqStr)) { break; } bankbillHistory.setCQsrq(qsrqStr); // 交易日期 String jyrqStr = getCellDateValue(row, 1); bankbillHistory.setCJyrq(jyrqStr); if (i == firstRowNum + 3) { trade_date = jyrqStr; } // 交易时间 String jysjStr = getCellStringValue(row, 2); bankbillHistory.setCJysj(jysjStr); // 卡号 String khStr = getCellStringValue(row, 3); bankbillHistory.setCCard(khStr); // 交易类型 String jylxStr = getCellStringValue(row, 4); bankbillHistory.setCJylx(jylxStr); // 交易金额 String jyjeStr = getCellStringValue(row, 5); bankbillHistory.setCJyje(jyjeStr); // 终端号 String zdhStr = getCellStringValue(row, 6); bankbillHistory.setCZdh(zdhStr); // 清算金额 String qsjeStr = getCellStringValue(row, 7); bankbillHistory.setCQsje(qsjeStr); // 手续费 String sxfStr = getCellStringValue(row, 8); bankbillHistory.setCSxf(sxfStr); // 参考号 String ckhStr = getCellStringValue(row, 9); bankbillHistory.setCCkh(ckhStr); // 流水号 String lshStr = getCellStringValue(row, 10); bankbillHistory.setCLsh(lshStr); // 卡类型 String klxStr = getCellStringValue(row, 11); bankbillHistory.setCKlx(klxStr); // 商户订单号 String shddhStr = getCellStringValue(row, 12); bankbillHistory.setCShddh(shddhStr); // 支付方式 String zffsStr = getCellStringValue(row, 13); bankbillHistory.setCZffs(zffsStr); // 银商订单号 String ysddhStr = getCellStringValue(row, 14); bankbillHistory.setCYsddh(ysddhStr); // 退货订单号 String thddhStr = getCellStringValue(row, 15); bankbillHistory.setCThddh(thddhStr); // 实际支付金额 String sjzfjeStr = getCellStringValue(row, 16); bankbillHistory.setCSjzfje(sjzfjeStr); // 备注字段 String bzzdStr = getCellStringValue(row, 17); bankbillHistory.setCBzzd(bzzdStr); // 付款附言 String fkfyStr = getCellStringValue(row, 18); bankbillHistory.setCFkfy(fkfyStr); // 钱包优惠金额 String qbyhjeStr = getCellStringValue(row, 19); bankbillHistory.setCQbyhje(qbyhjeStr); // 商户优惠金额 String shyhjeStr = getCellStringValue(row, 20); bankbillHistory.setCShyhje(shyhjeStr); // 发卡行 String fkhStr = getCellStringValue(row, 21); bankbillHistory.setCFkh(fkhStr); // 分店简称 String fdjcStr = getCellStringValue(row, 22); bankbillHistory.setCFdjc(fdjcStr); // 其他优惠金额 String qtyhjeStr = getCellStringValue(row, 23); bankbillHistory.setCQtyhje(qtyhjeStr); // 分期期数 String fqqsStr = getCellStringValue(row, 24); bankbillHistory.setCFqqs(fqqsStr); // 分期手续费 String fqsxfStr = getCellStringValue(row, 25); bankbillHistory.setCFqsxf(fqsxfStr); // 分期服务方 String fqfwfStr = getCellStringValue(row, 26); bankbillHistory.setCFqfwf(fqfwfStr); // 分期付息方 String fqfxfStr = getCellStringValue(row, 27); bankbillHistory.setCFqfxf(fqfxfStr); // 子订单号 String zddhStr = getCellStringValue(row, 28); bankbillHistory.setCZddh(zddhStr); // 表名 bankbillHistory.setBillTableName(bill_table_name); list.add(bankbillHistory); } responseMap.put("list", list); } else { System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name); errCode = "999"; errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name; } } catch (Exception e) { e.printStackTrace(); System.out.println("执行失败,原因:" + e.getMessage()); errCode = "999"; errMsg = "执行失败,原因:" + e.getMessage(); } finally { try { if (sheets != null) { sheets.close(); } } catch (Exception ie) { ie.printStackTrace(); } } responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } /** * @description: 获取银行端商户POS对账数据 * @author thuang * @date 2021/9/22 13:57 * @version 1.0 */ @PostMapping("/getBankDataBySHPOS") @ResponseBody public HashMap getBankDataBySHPOS(@RequestBody HashMap map) { HashMap responseMap = new HashMap<>(); String errCode = "0"; String errMsg = ""; // 先下载文件 String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST")); String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT")); int port = Integer.parseInt("".equals(portStr) ? "21" : portStr); String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER")); String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD")); String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH")); String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID")); String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH")); String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME")); String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME")); String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID")); String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date")); HSSFWorkbook sheets = null; try { // 下载文件 log.info("开始下载FTP文件: " + ftp_file_name); boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name); // 判断是否下载到文件 if (!b) { log.error("FTP文件下载失败: " + ftp_file_name); errCode = "1"; errMsg = "FTP文件下载失败,请检查FTP连接参数和文件是否存在"; responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } // 判断本地是否有文件 File file = new File(localPath + "/" + ftp_file_name); if (file.exists()) { // 存在 开始解析 存入数据库 FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name); sheets = new HSSFWorkbook(fileInputStream); HSSFSheet sheet = sheets.getSheetAt(0); // 获取sheet中第一行行号 int firstRowNum = sheet.getFirstRowNum(); // 获取sheet中最后一行行号 int lastRowNum = sheet.getLastRowNum(); List list = new ArrayList<>(); for (int i = firstRowNum + 3; i <= lastRowNum - 4; i++) { log.info("正在解析第" + i + "行数据");// 因为表格中第一行为说明,第二行为列标题 HSSFRow row = sheet.getRow(i); if (row == null) { continue; } BankbillHistory bankbillHistory = new BankbillHistory(); // 清算日期 String qsrqStr = getCellStringValue(row, 0); // 拿第一个字段判断这条记录是否为空 如果为空直接跳出 一般这字段为空就是数据结束了或根本没有 if ("".equals(qsrqStr) || "汇总信息".equals(qsrqStr)) { break; } bankbillHistory.setCQsrq(qsrqStr); // 交易日期 String jyrqStr = getCellDateValue(row, 1); bankbillHistory.setCJyrq(jyrqStr); if (i == firstRowNum + 3) { trade_date = jyrqStr; } // 交易时间 String jysjStr = getCellStringValue(row, 2); bankbillHistory.setCJysj(jysjStr); // 终端号 String zdhStr = getCellStringValue(row, 3); bankbillHistory.setCZdh(zdhStr); // 卡号 String khStr = getCellStringValue(row, 4); bankbillHistory.setCCard(khStr); // 交易类型 String jylxStr = getCellStringValue(row, 5); bankbillHistory.setCJylx(jylxStr); // 交易金额 String jyjeStr = getCellStringValue(row, 6); log.info("jyjeStr:" + jyjeStr); bankbillHistory.setCJyje(jyjeStr); // 清算金额 String qsjeStr = getCellStringValue(row, 7); bankbillHistory.setCQsje(qsjeStr); // 手续费 String sxfStr = getCellStringValue(row, 8); bankbillHistory.setCSxf(sxfStr); // 参考号 String ckhStr = getCellStringValue(row, 9); bankbillHistory.setCCkh(ckhStr); // 流水号 String lshStr = getCellStringValue(row, 10); bankbillHistory.setCLsh(lshStr); // 卡类型 String klxStr = getCellStringValue(row, 11); bankbillHistory.setCKlx(klxStr); // 发卡行 String fkhStr = getCellStringValue(row, 12); bankbillHistory.setCFkh(fkhStr); // 支付方式 String zffsStr = getCellStringValue(row, 13); bankbillHistory.setCZffs(zffsStr); // 银商订单号 String ysddhStr = getCellStringValue(row, 15); log.info("ysddhStr:" + ysddhStr); bankbillHistory.setCYsddh(ysddhStr); // 商户订单号 String shddhStr = getCellStringValue(row, 16); bankbillHistory.setCShddh(shddhStr); // 备注字段 String bzzdStr = getCellStringValue(row, 18); bankbillHistory.setCBzzd(bzzdStr); // 钱包优惠金额 String fdmcjjStr = getCellStringValue(row, 19); bankbillHistory.setCFdjc(fdmcjjStr); // 表名 bankbillHistory.setBillTableName(bill_table_name); list.add(bankbillHistory); } responseMap.put("list", list); } else { System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name); errCode = "999"; errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name; } } catch (Exception e) { e.printStackTrace(); System.out.println("执行失败,原因:" + e.getMessage()); errCode = "999"; errMsg = "执行失败,原因:" + e.getMessage(); } finally { try { if (sheets != null) { sheets.close(); } } catch (Exception ie) { ie.printStackTrace(); } } responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } /** * @description: 获取银行端商户银联卡对账数据 * @author thuang * @date 2021/9/22 13:57 * @version 1.0 */ @PostMapping("/getBankDataBySHYLK") @ResponseBody public HashMap getBankDataBySHYLK(@RequestBody HashMap map) { HashMap responseMap = new HashMap<>(); String errCode = "0"; String errMsg = ""; // 先下载文件 String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST")); String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT")); int port = Integer.parseInt("".equals(portStr) ? "21" : portStr); String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER")); String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD")); String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH")); String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID")); String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH")); String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME")); String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME")); String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID")); String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date")); HSSFWorkbook sheets = null; try { // 下载文件 log.info("开始下载FTP文件: " + ftp_file_name); boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name); // 判断是否下载到文件 if (!b) { log.error("FTP文件下载失败: " + ftp_file_name); errCode = "1"; errMsg = "FTP文件下载失败,请检查FTP连接参数和文件是否存在"; responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } // 判断本地是否有文件 File file = new File(localPath + "/" + ftp_file_name); if (file.exists()) { // 存在 开始解析 存入数据库 FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name); sheets = new HSSFWorkbook(fileInputStream); HSSFSheet sheet = sheets.getSheetAt(0); // 获取sheet中第一行行号 int firstRowNum = sheet.getFirstRowNum(); // 获取sheet中最后一行行号 int lastRowNum = sheet.getLastRowNum(); List list = new ArrayList<>(); for (int i = firstRowNum + 3; i <= lastRowNum - 2; i++) {// 因为表格中第一行为说明,第二行为列标题 HSSFRow row = sheet.getRow(i); if (row == null) { continue; } BankbillHistory bankbillHistory = new BankbillHistory(); // 清算日期 String qsrqStr = getCellStringValue(row, 0); // 拿第一个字段判断这条记录是否为空 如果为空直接跳出 一般这字段为空就是数据结束了或根本没有 if ("".equals(qsrqStr) || "合计".equals(qsrqStr)) { break; } bankbillHistory.setCQsrq(qsrqStr); // 交易日期 String jyrqStr = getCellDateValue(row, 1); bankbillHistory.setCJyrq(jyrqStr); if (i == firstRowNum + 3) { trade_date = jyrqStr; } // 交易时间 String jysjStr = getCellStringValue(row, 2); bankbillHistory.setCJysj(jysjStr); // 终端号 String zdhStr = getCellStringValue(row, 3); bankbillHistory.setCZdh(zdhStr); // 卡号 String khStr = getCellStringValue(row, 4); bankbillHistory.setCCard(khStr); // 交易类型 String jylxStr = getCellStringValue(row, 5); bankbillHistory.setCJylx(jylxStr); // 交易金额 String jyjeStr = getCellStringValue(row, 6); bankbillHistory.setCJyje(jyjeStr); // 清算金额 String qsjeStr = getCellStringValue(row, 7); bankbillHistory.setCQsje(qsjeStr); // 手续费 String sxfStr = getCellStringValue(row, 8); bankbillHistory.setCSxf(sxfStr); // 流水号 String lshStr = getCellStringValue(row, 9); bankbillHistory.setCLsh(lshStr); // 卡类型 String klxStr = getCellStringValue(row, 10); bankbillHistory.setCKlx(klxStr); // 发卡行 String fkhStr = getCellStringValue(row, 11); bankbillHistory.setCFkh(fkhStr); // 系统参考号 (对应银商订单号) String xtckhStr = getCellStringValue(row, 12); // 支付方式 bankbillHistory.setCZffs("银行卡支付"); // 银商订单号 bankbillHistory.setCYsddh(xtckhStr); // 表名 bankbillHistory.setBillTableName(bill_table_name); list.add(bankbillHistory); } responseMap.put("list", list); } else { System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name); errCode = "999"; errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name; } } catch (Exception e) { e.printStackTrace(); System.out.println("执行失败,原因:" + e.getMessage()); errCode = "999"; errMsg = "执行失败,原因:" + e.getMessage(); } finally { try { if (sheets != null) { sheets.close(); } } catch (Exception ie) { ie.printStackTrace(); } } responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } /** * @description: 获取银行端商户银联外卡对账数据 * @author yuan * @date 2025/7/18 13:57 * @version 1.0 */ @PostMapping("/getBankDataBySHYLWK") @ResponseBody public HashMap getBankDataBySHYLWK(@RequestBody HashMap map) { HashMap responseMap = new HashMap<>(); String errCode = "0"; String errMsg = ""; // 先下载文件 String host = StringDUtil.changeNullToEmpty(map.get("FTP_HOST")); String portStr = StringDUtil.changeNullToEmpty(map.get("FTP_PORT")); int port = Integer.parseInt("".equals(portStr) ? "21" : portStr); String username = StringDUtil.changeNullToEmpty(map.get("FTP_USER")); String password = StringDUtil.changeNullToEmpty(map.get("FTP_PASSWORD")); String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH")); String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID")); String ftp_path = StringDUtil.changeNullToEmpty(map.get("FTP_PATH")); String ftp_file_name = StringDUtil.changeNullToEmpty(map.get("FTP_FILE_NAME")); String bill_table_name = StringDUtil.changeNullToEmpty(map.get("BILL_TABLE_NAME")); String thirdConfigId = StringDUtil.changeNullToEmpty(map.get("ID")); String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date")); HSSFWorkbook sheets = null; try { // 下载文件 log.info("开始下载FTP文件: " + ftp_file_name); boolean b = DownloadFtpUtil.downloadFtpFile(host, username, password, port, ftp_path, localPath, ftp_file_name); // 判断是否下载到文件 if (!b) { log.error("FTP文件下载失败: " + ftp_file_name); errCode = "1"; errMsg = "FTP文件下载失败,请检查FTP连接参数和文件是否存在"; responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } // 判断本地是否有文件 File file = new File(localPath + "/" + ftp_file_name); if (file.exists()) { // 存在 开始解析 存入数据库 FileInputStream fileInputStream = new FileInputStream(localPath + "/" + ftp_file_name); sheets = new HSSFWorkbook(fileInputStream); HSSFSheet sheet = sheets.getSheetAt(0); // 获取sheet中第一行行号 int firstRowNum = sheet.getFirstRowNum(); // 获取sheet中最后一行行号 int lastRowNum = sheet.getLastRowNum(); List list = new ArrayList<>(); // 银联外卡对账单从第4行开始解析数据(前3行是标题和表头) for (int i = firstRowNum + 3; i <= lastRowNum - 2; i++) { HSSFRow row = sheet.getRow(i); if (row == null) { continue; } BankbillHistory bankbillHistory = new BankbillHistory(); // 清算日期 String qsrqStr = getCellStringValue(row, 0); // 拿第一个字段判断这条记录是否为空 如果为空直接跳出 if ("".equals(qsrqStr) || "合计".equals(qsrqStr)) { break; } bankbillHistory.setCQsrq(qsrqStr); // 交易日期 String jyrqStr = getCellDateValue(row, 1); bankbillHistory.setCJyrq(jyrqStr); // 交易时间 String jysjStr = getCellStringValue(row, 2); bankbillHistory.setCJysj(jysjStr); // 终端号 String zdhStr = getCellStringValue(row, 3); bankbillHistory.setCZdh(zdhStr); // 卡号 String khStr = getCellStringValue(row, 4); bankbillHistory.setCCard(khStr); // 交易类型 String jylxStr = getCellStringValue(row, 5); bankbillHistory.setCJylx(jylxStr); // 交易金额 String jyjeStr = getCellStringValue(row, 6); bankbillHistory.setCJyje(jyjeStr); // 清算金额 String qsjeStr = getCellStringValue(row, 7); bankbillHistory.setCQsje(qsjeStr); // 手续费 String sxfStr = getCellStringValue(row, 8); bankbillHistory.setCSxf(sxfStr); // 参考号 String ckhStr = getCellStringValue(row, 9); bankbillHistory.setCCkh(ckhStr); // 流水号 String lshStr = getCellStringValue(row, 10); bankbillHistory.setCLsh(lshStr); // 卡类型 String klxStr = getCellStringValue(row, 11); bankbillHistory.setCKlx(klxStr); // 授权码 String sqmStr = getCellStringValue(row, 12); bankbillHistory.setCBzzd(sqmStr); // 使用备注字段存储授权码 // 分店名称 String fdmcStr = getCellStringValue(row, 13); bankbillHistory.setCFdjc(fdmcStr); // 设置支付方式 bankbillHistory.setCZffs("银联外卡支付"); // 设置表名 bankbillHistory.setBillTableName(bill_table_name); list.add(bankbillHistory); } responseMap.put("list", list); } else { System.out.println("执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name); errCode = "999"; errMsg = "执行失败,原因:路径" + ftp_path + "下无下载文件" + ftp_file_name; } } catch (Exception e) { e.printStackTrace(); System.out.println("执行失败,原因:" + e.getMessage()); errCode = "999"; errMsg = "执行失败,原因:" + e.getMessage(); } finally { try { if (sheets != null) { sheets.close(); } } catch (Exception ie) { ie.printStackTrace(); } } responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } /** * @description: 获取微信支付对账数据 * @author thuang * @date 2021/9/22 13:57 * @version 1.0 */ @PostMapping("/getBankDataByWXAPI") @ResponseBody public HashMap getBankDataByWXAPI(@RequestBody HashMap map) { List list = new ArrayList<>(); log.info("开始获取微信账单"); HashMap responseMap = new HashMap<>(); String errCode = "0"; String errMsg = ""; try { String localPath = StringDUtil.changeNullToEmpty(map.get("LOCAL_PATH")); String mch_id = StringDUtil.changeNullToEmpty(map.get("MCH_ID")); String trade_date = StringDUtil.changeNullToEmpty(map.get("trade_date")); HashMap reqMap = new HashMap<>(); reqMap.put("grant_type", grant_type); reqMap.put("appid", appid); reqMap.put("secret", secret); String randomStr = RandomUtil.randomString(32); String signString = "appid=" + appid + "&bill_date=" + trade_date + "&bill_type=ALL&mch_id=" + mch_id + "&nonce_str=" + randomStr + "&key="+ key; String sign = SecureUtil.md5(signString).toUpperCase(); String reqXml = "\n" + " " + appid + "\n" + " " + trade_date + "\n" + " ALL\n" + " " + mch_id + "\n" + " " + randomStr + "\n" + " " + sign + "\n" + ""; // 获取access_token log.info("开始调用微信账单接口,参数: mch_id={}, trade_date={}", mch_id, trade_date); String body1 = HttpUtil.createPost("https://api.mch.weixin.qq.com/pay/downloadbill") .header("Content-Type", "text/xml") .timeout(30000) // 设置30秒超时 .body(reqXml) .execute() .body(); log.info("微信账单接口返回数据长度: {}", body1 != null ? body1.length() : 0); // 检查微信接口返回状态 if (body1.contains("")) { log.info("账单正在生成中,请稍后重试"); errCode = "999"; errMsg = "微信账单正在生成中,请稍后重试"; responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } String[] split = body1.split("\n"); for (int i = 1; i < split.length - 2; i++) { String[] split1 = split[i].split(","); if (Arrays.toString(split1).equals("[]")) { break; } // 检查是否是账单正在生成状态 if (Arrays.toString(split1).contains("Bill Creating")) { log.info("账单正在生成中,跳过处理"); break; } BankbillHistory bankbillHistory = new BankbillHistory(); int flag = 0; // 解析CSV数据到BankbillHistory实体 for (int j = 0; j < split1.length; j++) { String value = split1[j].replaceAll("`", "").trim(); switch (j) { case 0: // 交易时间 if (value.contains(" ")) { String[] timeSplit = value.split(" "); bankbillHistory.setCQsrq(timeSplit[0]); // 清算日期 bankbillHistory.setCJyrq(timeSplit[0]); // 交易日期 bankbillHistory.setCJysj(timeSplit[1]); // 交易时间 } break; case 4: // 设备号 bankbillHistory.setCZdh(value); break; case 5: // 微信订单号 bankbillHistory.setCYsddh(value); break; case 6: // 商户订单号 bankbillHistory.setCShddh(value); break; case 7: // 用户标识 bankbillHistory.setCCard(value); break; case 8: // 交易类型 bankbillHistory.setCJylx(value); break; case 9: // 交易状态 if ("REFUND".equals(value)) { flag = -1; } break; case 10: // 付款银行 bankbillHistory.setCFkh(value); break; case 12: // 应结订单金额 bankbillHistory.setCQsje(value); break; case 24: // 订单金额 if (flag < 0) { bankbillHistory.setCJyje("-" + value); } else { bankbillHistory.setCJyje(value); } break; case 20: // 商品名称 bankbillHistory.setCBzzd(value); break; case 22: // 手续费 bankbillHistory.setCSxf(value); break; case 15: // 微信退款单号 bankbillHistory.setCThddh(value); break; case 16: // 商户退款单号 bankbillHistory.setCYjylsh(value); break; case 17: // 退款金额 if (!"0.00".equals(value)) { bankbillHistory.setCJyje("-" + value); } break; } } // 设置支付方式 bankbillHistory.setCZffs("微信支付"); // 设置表名 bankbillHistory.setBillTableName("微信支付账单"); list.add(bankbillHistory); } // // 获取access_token // String body = HttpUtil.createPost("https://api.weixin.qq.com/cgi-bin/stable_token").body(JSONUtil.toJsonStr(reqMap)).execute().body(); // // String access_token = JSONUtil.parseObj(body).getStr("access_token"); // // 获取医保账单下载地址 // // https://api.weixin.qq.com/payinsurance/billdownload?access_token=ACCESS_TOKEN // String signYBString = "appid=" + appid + "&bill_date=" + trade_date + "&bill_type=ALL&mch_id=" + mch_id + "&nonce_str=" + randomStr + "&key="+key; // log.info("微信账单签名:" + signYBString); // String signYB = SecureUtil.md5(signYBString).toUpperCase(); // String reqYbXml = "\n" + // " " + appid + "\n" + // " " + trade_date + "\n" + // " ALL\n" + // " " + mch_id + "\n" + // " " + randomStr + "\n" + // " " + signYB + "\n" + // ""; // String resBody = HttpUtil.createPost("https://api.weixin.qq.com/payinsurance/billdownload?access_token=" + access_token).header("Content-Type", "text/xml").body(reqYbXml).execute().body(); // log.info("微信账单下载返回结果:" + resBody); // Document document = XmlUtil.parseXml(resBody); // Element elementG = XmlUtil.getRootElement(document); // Element returnCode = XmlUtil.getElement(elementG, "return_code"); // // if (returnCode.getTextContent().equals("SUCCESS")) {// 响应成功 // // 下载文件 // Element downloadUrl = XmlUtil.getElement(elementG, "download_url"); // String dwUrl = downloadUrl.getTextContent(); // log.info("开始下载文件"); // HttpUtil.downloadFileFromUrl(dwUrl, localPath + File.separator + trade_date + ".csv"); // HttpUtil.downloadFileFromUrl(dwUrl, localPath + File.separator + trade_date + ".txt"); // // HttpUtil.downloadFileFromUrl(dwUrl, localPath); // log.info("下载文件成功"); // CsvReader reader = CsvUtil.getReader(); // try { // CsvData read = reader.read(FileUtil.file(localPath + File.separator + trade_date + ".csv")); // List rows = read.getRows(); // if (rows.size() > 1) { // for (int i = 1; i < rows.size(); i++) { // CsvRow row = rows.get(i); // BankbillHistory bankbillHistory = new BankbillHistory(); // String s = row.get(0).replaceAll("`", ""); // String[] s1 = s.split(" "); // log.info("s1 is :" + Arrays.toString(s1)); // bankbillHistory.setCJyrq(s1[0]); // bankbillHistory.setCQsrq(s1[0]); // bankbillHistory.setCJysj(s1[1]); // bankbillHistory.setCZdh(row.get(1).replaceAll("`", "")); // bankbillHistory.setCCkh(row.get(2).replaceAll("`", "")); // bankbillHistory.setCLsh(row.get(5).replaceAll("`", "")); // bankbillHistory.setCShddh(row.get(6).replaceAll("`", "")); // bankbillHistory.setCCard(row.get(7).replaceAll("`", "")); // bankbillHistory.setCYsddh(row.get(25).replaceAll("`", "")); // if (row.get(46).replaceAll("`", "").equals("0.00")) { // continue; // } // if (row.get(45).replaceAll("`", "").equals("REFUND")) { // bankbillHistory.setCJyje("-" + row.get(46).replaceAll("`", "")); // } else { // bankbillHistory.setCJyje(row.get(46).replaceAll("`", "")); // } // bankbillHistory.setBillTableName("微信支付账单"); // list.add(bankbillHistory); // } // } // responseMap.put("list", list); // } catch (IORuntimeException e) { // throw new RuntimeException(e); // } finally { // try { // reader.close(); // } catch (IOException e) { // throw new RuntimeException(e); // } // } // } if (list.size() > 0) { responseMap.put("list", list); } else { errCode = "999"; errMsg = "账单数据为空,或未获取到账单!"; } responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } catch (Exception e) { log.error("微信账单获取异常", e); errCode = "999"; errMsg = "微信账单获取异常: " + e.getMessage(); responseMap.put("errCode", errCode); responseMap.put("errMsg", errMsg); return responseMap; } } // public static void main(String[] args) { // // String a = "?交易时间,公众账号ID,商户号,特约商户号,设备号,微信订单号,商户订单号,用户标识,交易类型,交易状态,付款银行,货币种类,应结订单金额,代金券金额,微信退款单号,商户退款单号,退款金额,充值券退款金额,退款类型,退款状态,商品名称,商户数据包,手续费,费率,订单金额,申请退款金额,费率备注\n" + // "`2024-08-09 17:55:10,`wx83bc9715be856b14,`1648728329,`0,`,`4200002314202408091169938410,`JJ20240809175501,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`SUCCESS,`ICBC_DEBIT,`CNY,`61.00,`0.00,`0,`0,`0.00,`0.00,`,`,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"385606\\\"\\ \\\"sjh\\\":\\\"20240809yypt120016\\\"\\ \\\"ysje\\\":\\\"61.0000\\\"\\ \\\"zfje\\\":\\\"61.0000\\\"\\ \\\"zje\\\":\\\"61.0000\\\"},`0.00000,`0.00%,`61.00,`0.00,`\n" + // "`2024-08-09 19:09:18,`wx83bc9715be856b14,`1648728329,`0,`,`4200002314202408091169938410,`JJ20240809175501,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`REFUND,`ICBC_DEBIT,`CNY,`0.00,`0.00,`50303000492024080988526514493,`C0_20240809yypt120016,`61.00,`0.00,`ORIGINAL,`SUCCESS,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"385606\\\"\\ \\\"sjh\\\":\\\"20240809yypt120016\\\"\\ \\\"ysje\\\":\\\"61.0000\\\"\\ \\\"zfje\\\":\\\"61.0000\\\"\\ \\\"zje\\\":\\\"61.0000\\\"},`0.00000,`0.00%,`0.00,`61.00,`\n" + // "`2024-08-09 18:07:51,`wx83bc9715be856b14,`1648728329,`0,`,`4200002320202408095363202348,`JJ20240809180744,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`SUCCESS,`ICBC_DEBIT,`CNY,`104.00,`0.00,`0,`0,`0.00,`0.00,`,`,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120017\\\"\\ \\\"ysje\\\":\\\"104.0000\\\"\\ \\\"zfje\\\":\\\"104.0000\\\"\\ \\\"zje\\\":\\\"104.0000\\\"},`0.00000,`0.00%,`104.00,`0.00,`\n" + // "`2024-08-09 19:07:39,`wx83bc9715be856b14,`1648728329,`0,`,`4200002320202408095363202348,`JJ20240809180744,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`REFUND,`ICBC_DEBIT,`CNY,`0.00,`0.00,`50303500422024080937274513002,`C0_20240809yypt120017,`104.00,`0.00,`ORIGINAL,`SUCCESS,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120017\\\"\\ \\\"ysje\\\":\\\"104.0000\\\"\\ \\\"zfje\\\":\\\"104.0000\\\"\\ \\\"zje\\\":\\\"104.0000\\\"},`0.00000,`0.00%,`0.00,`104.00,`\n" + // "`2024-08-09 17:54:18,`wx83bc9715be856b14,`1648728329,`0,`,`4200002326202408099114331548,`JJ20240809175411,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`SUCCESS,`ICBC_DEBIT,`CNY,`298.38,`0.00,`0,`0,`0.00,`0.00,`,`,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120015\\\"\\ \\\"ysje\\\":\\\"298.3800\\\"\\ \\\"zfje\\\":\\\"298.3800\\\"\\ \\\"zje\\\":\\\"298.3800\\\"},`0.00000,`0.00%,`298.38,`0.00,`\n" + // "`2024-08-09 19:47:02,`wx83bc9715be856b14,`1648728329,`0,`,`4200002326202408099114331548,`JJ20240809175411,`o-ZxO47Otvo5Rsq7kN-4PHvZIOt8,`JSAPI,`REFUND,`ICBC_DEBIT,`CNY,`0.00,`0.00,`50303500342024080940745293001,`C0_20240809yypt120015,`298.38,`0.00,`ORIGINAL,`SUCCESS,`库尔勒市妇幼保健院-门诊付款,`{\\\"patid\\\":\\\"447719\\\"\\ \\\"sjh\\\":\\\"20240809yypt120015\\\"\\ \\\"ysje\\\":\\\"298.3800\\\"\\ \\\"zfje\\\":\\\"298.3800\\\"\\ \\\"zje\\\":\\\"298.3800\\\"},`0.00000,`0.00%,`0.00,`298.38,`\n" + // "总交易单数,应结订单总金额,退款总金额,充值券退款总金额,手续费总金额,订单总金额,申请退款总金额\n" + // "`6,`463.38,`463.38,`0.00,`0.00000,`463.38,`463.38"; // String[] split = a.split("\n"); // for (int i = 1; i < split.length - 2; i++) { // String[] split1 = split[i].split(","); // for (int j = 0; j < split1.length; j++) { // // System.out.println("=============="); // System.out.println("第" + j + "个:"); // System.out.println(split1[j]); // System.out.println("=============="); // if (j == 21) { // String s = split1[j].replaceAll("`", ""); // String s1 = s.replaceAll(" ", ",").replaceAll("\\\\", ""); // JSONObject entries = JSONUtil.parseObj(s1); // Object zfje = entries.get("zfje"); // // System.out.println(zfje.toString().substring(0, 5)); // // } // } // } // System.out.println(); // } }