Java 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)

2024-02-13 01:32

本文主要是介绍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 支付宝对账功能(查询+文件下载+解压+遍历文件+读文件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704125

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha