本文主要是介绍Java 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)
- **需求**
- **流程**
- 1 、调用支付宝接口, 获取zip 下载地址
- 2、工具类代码
- 3、目录
- 4、开发环境
- 5、更新实际收益到本地数据库查询
- C#实现支付宝对账
需求
定时任务:每天统计昨天的公司支付宝账户实际收益(扣除手续费)。
流程
1 、调用支付宝接口, 获取zip 下载地址
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 {@Autowiredprivate Environment env;SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");@Autowiredprivate 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()){// 获取下载地址urlString 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"));// 遍历文件 获取需要的汇整csvFile[] 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));}}
2、工具类代码
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();}}
3、目录
4、开发环境
5、更新实际收益到本地数据库查询
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;public class ReadCsv {// public static void main(String[] args) {// try {//// BufferedReader reader=new BufferedReader(new InputStreamReader(new// FileInputStream("D:\\down\\1476771240197\\20884217298464250156_20160914_业务明细.csv"),"gbk"));// reader.read();//第一行信息,为标题信息,不用,如果需要,注释掉// String line = null;////// while((line=reader.readLine())!=null){// String item[] = line.split("\r\n");//CSV格式文件为逗号分隔符文件,这里根据逗号切分//// String last = item[item.length-1];//这就是你要的数据了//// if(last.contains(")")){// System.out.println(Double.valueOf(last.split(",")[12])-Double.valueOf(last.split(",")[22]));// }// }// } catch (Exception e) {// e.printStackTrace();// }// }public static HashMap<String, Double> getDetailOrder(String filePath) {HashMap<String, Double> map = new HashMap<String, Double>();try {BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "gbk"));reader.read();// 第一行信息,为标题信息,不用,如果需要,注释掉String line = null;while ((line = reader.readLine()) != null) {String item[] = line.split("\r\n");// CSV格式文件为逗号分隔符文件,这里根据逗号切分String last = item[item.length - 1];// 这就是你要的数据了if (last.contains(")")) {map.put(last.split(",")[0],Double.valueOf(last.split(",")[12])- Double.valueOf(last.split(",")[22]));}}} catch (Exception e) {e.printStackTrace();}return map;}/*** 根绝类型获取指定行的数据* * @param type* @return*/public static Double getMoney(String type, String filePath) {Double money = null;try {BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "gbk"));reader.read();//String line = null;while ((line = reader.readLine()) != null) {String item[] = line.split("\r\n");String last = item[item.length - 1];if (last.contains("合计")) {String[] strs = last.split(",");money = Double.valueOf(strs[strs.length - 1]);}}} catch (Exception e) {e.printStackTrace();}return money;}}
C#实现支付宝对账
C# 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)
这篇关于Java 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!