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

作者:Ouyzc 时间:2021-10-29 22:15:29 

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

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

实现支付宝自动对账功能

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

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

所谓对账,其实就是调用支付宝查询接口,跟上一篇的查询接口不同的是,上一篇的查询接口是针对特定的一个订单,通过订单号或者支付宝交易号去查询这一笔订单的信息,而对账,我们需要获取一个时间段的所有订单信息,因此,我们自然而已的去看支付宝提供的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

标签:java,支付宝,对账
0
投稿

猜你喜欢

  • Qt之调用C#的动态库的解决方法

    2023-07-22 03:42:45
  • C#编程实现获取文件夹中所有文件的文件名

    2022-11-16 07:53:10
  • java线程间通信的通俗解释及代码示例

    2023-12-06 18:04:43
  • spring boot 加载web容器tomcat流程源码分析

    2021-12-05 14:48:38
  • Java制作智能拼图游戏原理及代码

    2022-08-02 21:46:57
  • SpringBoot 如何从配置文件读取值到对象中

    2023-10-13 15:43:15
  • C#使用TextBox作数据输入方法

    2023-11-16 22:26:14
  • Java数据结构之数组(动力节点之Java学院整理)

    2023-09-23 21:20:12
  • 详解C++ STL模拟实现forward_list

    2023-06-21 02:36:04
  • Springboot 如何指定获取出 yml文件里面的配置值

    2022-08-29 21:04:48
  • Flutter添加页面过渡动画实现步骤

    2023-08-20 09:06:20
  • java使用Feign实现声明式Restful风格调用

    2023-01-22 08:18:05
  • Java实现的微信公众号获取微信用户信息示例

    2022-04-25 15:15:29
  • spring定时任务执行两次及tomcat部署缓慢问题的解决方法

    2022-12-27 09:53:25
  • java编写简易贪吃蛇游戏

    2021-08-03 02:53:49
  • Java的反射机制---动态调用对象的简单方法

    2023-08-16 19:23:26
  • SpringSecurity实现访问控制url匹配

    2021-11-03 00:18:16
  • Java设计模式之工厂模式案例详解

    2023-11-27 20:08:03
  • 学习SpringBoot容器功能及注解原理

    2023-11-24 22:06:17
  • SpringBoot全局异常处理与定制404页面的方法

    2021-08-07 18:54:56
  • asp之家 软件编程 m.aspxhome.com