java后台实现支付宝对账功能的示例代码
作者:Ouyzc 发布时间:2021-10-29 22:15:29
完成支付宝支付、查询的接口之后,我们应该还需要定时与支付宝进行对账,以确保商户系统的订单信息是正确的,想知道支付宝支付、查询接口实现过程的亲们,可移步到上一篇有详细过程。
现在我们来讲一下支付宝对账的功能,关于与支付宝交互的关键代码,其实支付宝的API已经讲得很清楚,如果亲们想直接看支付宝API,点击 支付宝对账API ,当然我在文章也会进行说明解释。
实现支付宝自动对账功能
先看一下商户系统和支付宝的大概交互过程:
所谓对账,其实就是调用支付宝查询接口,跟上一篇的查询接口不同的是,上一篇的查询接口是针对特定的一个订单,通过订单号或者支付宝交易号去查询这一笔订单的信息,而对账,我们需要获取一个时间段的所有订单信息,因此,我们自然而已的去看支付宝提供的SDK是否有提供该接口给我们,经过查看支付宝API,我们发现确实我们所需要的接口:alipay.data.dataservice.bill.downloadurl.query。废话不多说,先上我实现的代码
1.先是调用支付宝的对账查询接口,获取账单文件下载地址URL,关于一些支付宝的公共参数,在上一篇我已经封装好,下面代码是针对对账的实现过程,传入关键的2个业务参数.公共参数支付宝SDK已经封装好。
第一个参数,账单类型(字符串类型,trade或者signcustomer,具体含义见支付宝API)
第二个参数,获取时间段(字符串类型,(2018-03-15)需要下载的账单日期,最晚是当期日期的前一天)
/**
* 实现支付宝对账
* @param request
* @return response
*/
@Override
public void alipayBill() {
logger.info("==================向支付宝发起对账请求");
// 获取支付宝支付的配置信息
ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
Payment alipayment = (Payment) valueOps.get("alipayment");
if (alipayment == null) {
alipayment = alipayMentOrderRepository.getPayment(1, 1);
}
try {
//实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型)
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, alipayment.getAppid(),
AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类
request.setBizContent("{" +
"\"bill_type\":\"trade\"," +
"\"bill_date\":\"2018-03-14\"}"); //设置业务参数
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
String billDownloadUrl=response.getBillDownloadUrl();
logger.info("==================支付宝返回文件下载地址:"+billDownloadUrl);
this.downBill(billDownloadUrl); //调用下载文件方法
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//通过alipayClient调用API,获得对应的response类
//根据response中的结果继续业务逻辑处理
}
2.获取到支付宝返回的订单文件下载地址之后,我们直接把它下载到本地,下载的代码如下:
/**
* 下载账单文件:
* @param request
* @return response
*/
public String downBill(String billDownloadUrl){
long filename=new Date().getTime();
//指定希望保存的文件路径
String filePath = "G:/alipay/billfile/fund_bill_"+filename+".zip";
URL url = null;
HttpURLConnection httpUrlConnection = null;
InputStream fis = null;
FileOutputStream fos = null;
try {
url = new URL(billDownloadUrl);
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setConnectTimeout(5 * 1000);
httpUrlConnection.setDoInput(true);
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestMethod("GET");
httpUrlConnection.setRequestProperty("Charsert", "UTF-8");
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(httpUrlConnection!=null) httpUrlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
来源:https://blog.csdn.net/ouyzc/article/details/79568611


猜你喜欢
- 前言本文主要给大家介绍了关于Spring中@Scheduled和HttpClient的坑,分享出来供大家参考学习,下面话不多说了,来一起看看
- 一、C语言关键字详解1. sizeof sizeof相信大
- 方法一:1.在pom.xml文件下添加依赖包<dependency><groupId>com.alibaba<
- 一、volatile关键字介绍及底层原理1.volatile的特性(内存语义)当一个变量被定义成volatile之后,它将具备两项特性:第一
- 在项目中经常会需要应用弹出一些自定义的窗口,这时候Android自带的系统Dialog就无法满足我们的需求了,为了满足项目需求,我们可以使用
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.栈栈 (Stack) 是一种运算受限的线性表, 遵循先进
- 本文实例讲述了C#实现基于XML配置MenuStrip菜单的方法。分享给大家供大家参考。具体如下:1.关于本程序的说明用XML配置MenuS
- 本文实例为大家分享了Android自定义星星可滑动评分控件的具体方法,供大家参考,具体内容如下此控件通过线性布局结合ImageView来实现
- 本文实例为大家分享了C#实现数字华容道游戏的具体代码,供大家参考,具体内容如下代码如下:using System;using System.
- 在日常开发中,可能会遇到同一份代码,需要根据运营需求打出不同包名、不同图标、不同名称的Apk,发布到不同的渠道中。Android Studi
- 本文实例讲述了Java实现的傅里叶变化算法。分享给大家供大家参考,具体如下:用JAVA实现傅里叶变化 结果为复数形式 a+bi废话不多说,实
- SpringMVC接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎
- 项目效果实现代码using System;namespace 飞行棋项目{ class Program  
- 本文实例讲述了Android编程实现手机自带内部存储路径的获取方法。分享给大家供大家参考,具体如下:我有一台中兴的Android手机,型号是
- 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;imp
- 本文实例讲述了Android播放多张图片形成的一个动画。分享给大家供大家参考,具体如下:在Android里可以逐帧的播放图片,然后产生一种动
- java里有数字long来表示大的整数,如果两个数字的范围超过了long,要做加法算法怎么做呢?这个问题在面试中经常碰到,如果之前没有经历的
- 一、序言(一)背景内容软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多
- 本章概要文件上传@ControllerAdvice文件上传Java 中的文件上传一共涉及两个组件,一个是 CommonsMultipartR
- 本文向您展示了在 Flutter 中实现完美的验证码输入框几种不同方法。重点是什么?真实世界的 完美的验证码输入框或 PIN 输入 UI 通