服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - java后台实现支付宝对账功能的示例代码

java后台实现支付宝对账功能的示例代码

2021-05-25 13:06Ouyzc Java教程

这篇文章主要介绍了java后台实现支付宝对账功能的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

完成支付宝支付、查询的接口之后,我们应该还需要定时与支付宝进行对账,以确保商户系统的订单信息是正确的,想知道支付宝支付、查询接口实现过程的亲们,可移步到上一篇有详细过程。

现在我们来讲一下支付宝对账的功能,关于与支付宝交互的关键代码,其实支付宝的api已经讲得很清楚,如果亲们想直接看支付宝api,点击 支付宝对账api ,当然我在文章也会进行说明解释。

实现支付宝自动对账功能

先看一下商户系统和支付宝的大概交互过程:

java后台实现支付宝对账功能的示例代码

所谓对账,其实就是调用支付宝查询接口,跟上一篇的查询接口不同的是,上一篇的查询接口是针对特定的一个订单,通过订单号或者支付宝交易号去查询这一笔订单的信息,而对账,我们需要获取一个时间段的所有订单信息,因此,我们自然而已的去看支付宝提供的sdk是否有提供该接口给我们,经过查看支付宝api,我们发现确实我们所需要的接口:alipay.data.dataservice.bill.downloadurl.query。废话不多说,先上我实现的代码

1.先是调用支付宝的对账查询接口,获取账单文件下载地址url,关于一些支付宝的公共参数,在上一篇我已经封装好,下面代码是针对对账的实现过程,传入关键的2个业务参数.公共参数支付宝sdk已经封装好。

第一个参数,账单类型(字符串类型,trade或者signcustomer,具体含义见支付宝api)

第二个参数,获取时间段(字符串类型,(2018-03-15)需要下载的账单日期,最晚是当期日期的前一天)

java" id="highlighter_971585">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 实现支付宝对账
* @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.获取到支付宝返回的订单文件下载地址之后,我们直接把它下载到本地,下载的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* 下载账单文件:
* @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;
}

以上就是与支付宝交互的过程,支付宝api上也能找到这些代码,完成以上2步之后,我们就可以下载每日账单文件了

我下载下来是这样的,上个图:

java后台实现支付宝对账功能的示例代码

解压之后:

java后台实现支付宝对账功能的示例代码

打开excel(汇总)

是这样的:

java后台实现支付宝对账功能的示例代码

至此,我们已经拿到了支付宝提供的每日账单文件,接下来才是重头戏,目前还没有确定选择哪种方案进行自动对账

确定之后,会把过程也补上。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/ouyzc/article/details/79568611

延伸 · 阅读

精彩推荐
  • Java教程关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    这篇文章主要介绍了关于在IDEA中SpringBoot项目中activiti工作流的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价...

    不正经的程序袁11332020-08-13
  • Java教程Maven 生成打包可执行jar包的方法步骤

    Maven 生成打包可执行jar包的方法步骤

    这篇文章主要介绍了Maven 生成打包可执行jar包的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    荒野雄兵4972020-09-05
  • Java教程java实现简单的计算器类实例

    java实现简单的计算器类实例

    这篇文章主要介绍了java实现简单的计算器类,涉及java针对键盘监听及数字运算的处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    路人甲1232432020-01-08
  • Java教程Java开发实现猜拳游戏

    Java开发实现猜拳游戏

    这篇文章主要为大家详细介绍了Java实现猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    E.M.C.P5712020-08-03
  • Java教程阻塞队列—ArrayBlockingQueue源码分析

    阻塞队列—ArrayBlockingQueue源码分析

    ArrayBlockingQueue是一个阻塞队列,内部由ReentrantLock来实现线程安全,由Condition的await和signal来实现等待唤醒的功能。它的数据结构是数组,准确地说是一个循...

    今日头条4652020-11-19
  • Java教程如何简单的理解依赖注入详解

    如何简单的理解依赖注入详解

    一直对依赖注入理解不清楚,最近突然理解了,所以下面这篇文章主要给大家介绍了关于如何简单的理解依赖注入的相关资料,文中通过示例代码介绍的非...

    Summer7C8742021-05-14
  • Java教程Java实现单链表翻转实例代码

    Java实现单链表翻转实例代码

    Java实现单链表反转,递归和非递归两种形式。接下来通过本文给大家分享Java实现单链表翻转实例代码,需要的的朋友参考下...

    Michael_YuChen2692020-09-01
  • Java教程Java实例化类详解

    Java实例化类详解

    学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法。对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在...

    hebedich4592020-04-11