需求:java
定時任務:天天統計昨天的公司支付寶帳戶實際收益(扣除手續費)spring
流程:數據庫
1 、調用支付寶接口, 獲取zip 下載地址apache
package com.ycmedia.task; import com.alibaba.fastjson.JSON; 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.google.common.base.Splitter; import com.ycmedia.constants.Constants; import com.ycmedia.dao.TaskDao; import com.ycmedia.entity.RealIncom; import com.ycmedia.utils.FileUtil; import com.ycmedia.utils.ReadCsv; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @Component public class AliBillTask { @Autowired private Environment env; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); @Autowired private TaskDao taskDao; @Scheduled(cron = "0 14 14 ? * *") public void runAlitask() throws Exception { downloadBill(); } /** * 獲取指定日期的帳單 */ public void downloadBill() throws Exception { // 將訂單提交至支付寶 AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do", Constants.ALI_APP_ID, Constants.ALI_PRIVATE_KEY, "json", "utf-8", Constants.ALI_DEV_PLAT_PUBLIC_KEY); AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); JSONObject json = new JSONObject(); json.put("bill_type", "trade"); //昨天的數據 json.put("bill_date", new DateTime().minusDays(1).toString("yyyy-MM-dd")); request.setBizContent(json.toString()); AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient .execute(request); if(response.isSuccess()){ // 獲取下載地址url String url = response.getBillDownloadUrl(); // 設置下載後生成Zip目錄 String filePath = env.getProperty("file.path"); String newZip = filePath + new Date().getTime() + ".zip"; // 開始下載 FileUtil.downloadNet(url, newZip); // 解壓到指定目錄 FileUtil.unZip(newZip, env.getProperty("file.zip.path")); // 遍歷文件 獲取須要的彙整csv File[] fs = new File(env.getProperty("file.zip.path")).listFiles(); RealIncom income = null; for (File file : fs) { if (file.getAbsolutePath().contains("彙總")) { Double money = ReadCsv.getMoney("", file.getAbsolutePath()); income = new RealIncom(); income.setDate(new Date()); income.setMoney(money); taskDao.insertTodayMoney(income); } } // 插入成功, 刪除csv 文件 for (File file : fs) { file.delete(); } }else{ //若是帳單不存在, 插入一條空數據到數據庫 RealIncom income= new RealIncom(); income.setDate(new Date()); income.setMoney(0.00); taskDao.insertTodayMoney(income); } if (response.isSuccess()) { System.out.println("調用成功"); } else { System.out.println("調用失敗"); } System.out.println(JSON.toJSONString(response)); } }
工具類代碼:json
package com.ycmedia.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; public class FileUtil { /** * 使用GBK編碼能夠避免壓縮中文文件名亂碼 */ private static final String CHINESE_CHARSET = "GBK"; /** * 文件讀取緩衝區大小 */ private static final int CACHE_SIZE = 1024; /** * 第一步: 把 支付寶生成的帳單 下載到本地目錄 * * @param path * 支付寶資源url * @param filePath * 生成的zip 包目錄 * @throws MalformedURLException */ public static void downloadNet(String path, String filePath) throws MalformedURLException { // 下載網絡文件 int bytesum = 0; int byteread = 0; URL url = new URL(path); try { URLConnection conn = url.openConnection(); InputStream inStream = conn.getInputStream(); FileOutputStream fs = new FileOutputStream(filePath); byte[] buffer = new byte[1204]; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; fs.write(buffer, 0, byteread); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void unZip(String zipFilePath, String destDir) throws Exception { ZipFile zipFile = new ZipFile(zipFilePath, CHINESE_CHARSET); Enumeration<?> emu = zipFile.getEntries(); BufferedInputStream bis; FileOutputStream fos; BufferedOutputStream bos; File file, parentFile; ZipEntry entry; byte[] cache = new byte[CACHE_SIZE]; while (emu.hasMoreElements()) { entry = (ZipEntry) emu.nextElement(); if (entry.isDirectory()) { new File(destDir + entry.getName()).mkdirs(); continue; } bis = new BufferedInputStream(zipFile.getInputStream(entry)); file = new File(destDir + entry.getName()); parentFile = file.getParentFile(); if (parentFile != null && (!parentFile.exists())) { parentFile.mkdirs(); } fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos, CACHE_SIZE); int nRead = 0; while ((nRead = bis.read(cache, 0, CACHE_SIZE)) != -1) { fos.write(cache, 0, nRead); } bos.flush(); bos.close(); fos.close(); bis.close(); } zipFile.close(); } }