package com.zteits.pay.job; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.xxl.job.core.handler.annotation.XxlJob; import com.zteits.pay.allipay.AlipayConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest; import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse; import com.clouds.common.utils.DateUtil; import com.clouds.common.utils.ZIpUtil; import com.clouds.common.utils.csv.CSVUtils; import com.xiaoleilu.hutool.io.FileUtil; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.context.XxlJobHelper; import com.zteits.clouds.api.apibase.constants.ErrorType; import com.zteits.clouds.api.apibase.exception.BizException; import com.zteits.clouds.api.dto.pay.param.AliPayBillDownLoadQueryRequest; import com.zteits.pay.allipay.AliPayBillConfig; import com.zteits.pay.dao.TdBPayBlncacDao; /** * 支付宝日账单下载JOB.
* * Copyright: Copyright (c) 2017 zteits * * @ClassName: AliPayBillJob.java * @Description: * @version: v1.0.0 * @author: wangfs * @date: 2017年7月5日 上午10:24:20 * Modification History: * Date Author Version Description *---------------------------------------------------------* * 2017年7月5日 wangfs v1.0.0 创建 */ @Component("com.zteits.pay.job.AliPayBillJob") public class AliPayBillJob { private static final Logger logger = LoggerFactory.getLogger(AliPayBillJob.class); @Autowired private TdBPayBlncacDao tdBPayBlncacDao; /** * 定时下载日账单-->每天1点下载.
*/ @XxlJob(value="AliPayBillJob") public ReturnT execute(String... params) throws Exception { String param = XxlJobHelper.getJobParam(); if (StringUtils.isNotEmpty(param) && params == null) { params = param.split(","); } AliPayBillDownLoadQueryRequest aliPayBillDownLoadQueryRequest = new AliPayBillDownLoadQueryRequest(); Boolean downFlg = false; List list = new ArrayList(); int insertCount = 0; this.logger("开始支付宝日账单下载定时任务..."); try{ //1.创建文件夹 createDirectory(new String[]{AliPayBillConfig.FILE_PATH,AliPayBillConfig.FILE_PATH_BAK}); this.logger("完成创建文件夹创建..."); //2.删除备份前60天的文件 boolean deleteFlg = delFile(AliPayBillConfig.FILE_PATH_BAK); this.logger("删除前60天的备份数据,结果="+(deleteFlg ==true ? "是" : "否")); //3.删除文件 boolean flg = this.deleteFile(AliPayBillConfig.FILE_PATH); this.logger("删除压缩后的csv文件,结果="+(flg == true ? "成功!" : "失败!")); String yesterday = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -1), DateUtil.DATE_FORMAT); this.logger("查询"+yesterday+"对账单下载地址"); aliPayBillDownLoadQueryRequest.setBillDate(yesterday); /**3.获取对账单下载地址*/ String billDownURL = queryBillDownLoadURL(aliPayBillDownLoadQueryRequest); this.logger("查询对账单地址="+(StringUtils.isNotEmpty(billDownURL)? billDownURL :"没有交易,查询对账单地址为空!")); if(StringUtils.isNotEmpty(billDownURL)){ this.logger("开始下载对账单..."); /**4.下载对账单.*/ downFlg = BillDownLoad(billDownURL,yesterday); } this.logger("是否下载到日对账单? "+(downFlg == true ? "是" : "否")); if(downFlg){ String yesterday_yyyMMdd = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -1), DateUtil.YYYYMMDD); //解压对账单 ZIpUtil.unZip(AliPayBillConfig.FILE_PATH+yesterday+".zip",AliPayBillConfig.FILE_PATH); this.logger("解压完成..."); //移动zip文件到备份目录 FileUtil.move(new File(AliPayBillConfig.FILE_PATH+yesterday+".zip"), new File(AliPayBillConfig.FILE_PATH_BAK), true); this.logger("完成"+yesterday+".zip 文件备份..."); //读取svc文件 this.logger("开始读取日账单文件..."); list = CSVUtils.csvRead(AliPayBillConfig.FILE_PATH,AliPayBillConfig.FILE_NAME_PREFIX+ yesterday_yyyMMdd+AliPayBillConfig.FILE_NAME_SUFFIX,5L,"---业务明细列表结束--"); this.logger("完成日账单文件读取,结果(list.size)="+list.size()); } if(!CollectionUtils.isEmpty(list)){ this.logger("开始插入日账单文件..."); /**插入日账单数据.*/ insertCount = tdBPayBlncacDao.insert(list); this.logger("完成日账单入库,结果="+(insertCount >0 ? "插入成功"+insertCount+" 条。" :"插入失败!")); } this.logger("完成支付宝日账单下载定时任务..."); }catch (Exception e) { if (e instanceof InterruptedException) { throw e; } logger.warn("{}", e); } return insertCount > 0 ? ReturnT.SUCCESS :ReturnT.FAIL; } /** * 查询对账单URL.
* @param aliPayBillDownLoadQueryRequest * @return */ private String queryBillDownLoadURL(AliPayBillDownLoadQueryRequest aliPayBillDownLoadQueryRequest){ logger.info("[{}],开始查询对账单下载地址,入参={}",aliPayBillDownLoadQueryRequest.getBaseRequest().getRequestId(),JSONObject.toJSONString(aliPayBillDownLoadQueryRequest.getBillDate())); String billDownURL = ""; try{ if(StringUtils.isNotEmpty(aliPayBillDownLoadQueryRequest.getBillDate())){ Map map = new HashMap(); map.put("bill_type", "trade"); map.put("bill_date", aliPayBillDownLoadQueryRequest.getBillDate()); AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.BILL_URL_QUERY, AlipayConfig.APPID, AlipayConfig.APP_PRIVATE_KEY, "json", "GBK", AlipayConfig.ALIPAY_PUBLIC_KEY,//"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvuJpdfmJxVtWWKwG3uBF7cfRIggJBbrJ9meT8jfkc6/DyF+wXazHBLD9f3qf1eALol95Yz6vXbteB3g3S9y6QtQDUJ4pl9TExtPZt46uIC0TaU4EDcSM5pqOmOq5tkKaiN5TITN41dO0XG+0ZsoIyAd0PuBQ/rxAp8ofpmW9Ev21IclxcYP8kQXUahg2exjQ1mjJJZfmBaurbgDzMUCpzSjj5Z5SPiiA+Y+Lm/d2jDFoHnAxU5RhUQl2SRwUAah91JZmexLlbJy4PG4ukp95F8o/tNSFakpLP6rAIcokSwrBkezv/tqqEhyRqPi9X8Wnioh+qOZ7Ll4dlwiTLgsBeQIDAQAB", AlipayConfig.SIGN_TYPE); AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类 request.setBizContent(JSONObject.toJSONString(map)); AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request); if(response.isSuccess()){ JSONObject result = JSONObject.parseObject(response.getBody()); JSONObject jsonObject =(JSONObject) result.get("alipay_data_dataservice_bill_downloadurl_query_response"); if("Success".equals(jsonObject.get("msg"))){ logger.info("获取账单下载地址成功,bill_download_url={}",jsonObject.get("bill_download_url").toString()); billDownURL = jsonObject.get("bill_download_url").toString(); }else { logger.info("获取账单下载地址失败!"); } } }else{ throw new BizException(ErrorType.PARAMM_NULL, "入参不能为空!"); } }catch (Exception e) { e.printStackTrace(); } logger.info("[{}],完成查询对账单下载地址,返回结果={}",aliPayBillDownLoadQueryRequest.getBaseRequest().getRequestId(),billDownURL); return billDownURL; } /** * 下载对账单.
* @param urlStr * @param billDate 下载账单日期.
* @return */ private boolean BillDownLoad(String urlStr,String billDate){ boolean flg =false; //指定希望保存的文件路径 String filePath = AliPayBillConfig.FILE_PATH + billDate +".zip"; logger.info("开始下载对账单,对账单下载路径={}",filePath); URL url = null; HttpURLConnection httpUrlConnection = null; InputStream fis = null; FileOutputStream fos = null; try { url = new URL(urlStr); httpUrlConnection = (HttpURLConnection) url.openConnection(); httpUrlConnection.setConnectTimeout(5 * 1000); httpUrlConnection.setDoInput(true); httpUrlConnection.setDoOutput(true); httpUrlConnection.setUseCaches(false); httpUrlConnection.setRequestMethod("GET"); httpUrlConnection.setRequestProperty("Charsert", "GBK"); httpUrlConnection.connect(); fis = httpUrlConnection.getInputStream(); byte[] temp = new byte[1024]; int b; fos = new FileOutputStream (new File(filePath)); while ((b = fis.read(temp)) != -1) { fos.write(temp, 0, b); fos.flush(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(fis != null){ fis.close(); } if(fos != null) { fos.close(); } if (null != httpUrlConnection) { httpUrlConnection.disconnect(); } flg = true; } catch (IOException e) { e.printStackTrace(); } } logger.info("完成下载对账单,对账单下载路径={}",filePath); return flg; } /** * 创建文件夹.
*/ private static void createDirectory(String[] filePath){ if(filePath != null && filePath.length >0){ for(String str: filePath){ File file = new File(str); FileUtil.mkdir(file); } } } /** * 删除文件 * @param filePath * @return */ public boolean deleteFile(String filePath){ File file = new File(filePath); boolean flg =false; if (file == null || file.exists() == false) { return true; } if(file.isDirectory()){ File[] files = file.listFiles(); for (File childFile : files) { flg = childFile.delete(); if(!flg){ return false; } } }else{ flg = file.delete(); } return flg; } /** * 删除前7天的备份文件.
* @param filePath * @return */ private static boolean delFile(String filePath){ boolean flg = false; //获取前60天的日期 String dateBeforSeven = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -60), DateUtil.YYYYMMDD); if(StringUtils.isNotEmpty(filePath)){ File file = new File(filePath); if(file.isDirectory()){ File[] ff = file.listFiles(); for(File f:ff){ if(f.isFile()){ if(f.getName().contains(dateBeforSeven+".zip")){ f.delete(); flg = true; } } } } } return flg; } public static void main(String[] args) throws Exception { AliPayBillDownLoadQueryRequest aliPayBillDownLoadQueryRequest = new AliPayBillDownLoadQueryRequest(); AliPayBillJob job = new AliPayBillJob(); //1.创建文件夹 createDirectory(new String[]{AliPayBillConfig.FILE_PATH,AliPayBillConfig.FILE_PATH_BAK}); //2.删除备份前7天的文件 delFile(AliPayBillConfig.FILE_PATH_BAK); //logger("删除前7天的备份数据,结果="+(deleteFlg ==true ? "是" : "否")); String yesterday = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -2), DateUtil.DATE_FORMAT); //this.logger("查询"+yesterday+"对账单下载地址"); aliPayBillDownLoadQueryRequest.setBillDate(yesterday); /**获取对账单下载地址*/ String billDownURL = job.queryBillDownLoadURL(aliPayBillDownLoadQueryRequest); if(StringUtils.isNotEmpty(billDownURL)){ job.BillDownLoad(billDownURL,yesterday); } //this.logger("是否下载到日对账单? "+(downFlg == true ? "是" : "否")); //解压对账单 ZIpUtil.unZip(AliPayBillConfig.FILE_PATH+yesterday+".zip",AliPayBillConfig.FILE_PATH); //移动 FileUtil.move(new File(AliPayBillConfig.FILE_PATH+"2017-07-02.zip"), new File(AliPayBillConfig.FILE_PATH_BAK), true); //System.out.println(AliPayBillConfig.FILE_PATH+"2017-07-02.zip"); //ZIpUtil.unZip(AliPayBillConfig.FILE_PATH+"2017-07-02.zip",AliPayBillConfig.FILE_PATH); } private void logger(String msg){ XxlJobHelper.log(msg); logger.info(msg); } }