完成支付宝支付、查询的接口之后,我们应该还需要定时与支付宝进行对账,以确保商户系统的订单信息是正确的,想知道支付宝支付、查询接口实现过程的亲们,可移步到上一篇有详细过程。
现在我们来讲一下支付宝对账的功能,关于与支付宝交互的关键代码,其实支付宝的api已经讲得很清楚,如果亲们想直接看支付宝api,点击 支付宝对账api ,当然我在文章也会进行说明解释。
实现支付宝自动对账功能
先看一下商户系统和支付宝的大概交互过程:
所谓对账,其实就是调用支付宝查询接口,跟上一篇的查询接口不同的是,上一篇的查询接口是针对特定的一个订单,通过订单号或者支付宝交易号去查询这一笔订单的信息,而对账,我们需要获取一个时间段的所有订单信息,因此,我们自然而已的去看支付宝提供的sdk是否有提供该接口给我们,经过查看支付宝api,我们发现确实我们所需要的接口:alipay.data.dataservice.bill.downloadurl.query。废话不多说,先上我实现的代码
1.先是调用支付宝的对账查询接口,获取账单文件下载地址url,关于一些支付宝的公共参数,在上一篇我已经封装好,下面代码是针对对账的实现过程,传入关键的2个业务参数.公共参数支付宝sdk已经封装好。
第一个参数,账单类型(字符串类型,trade或者signcustomer,具体含义见支付宝api)
第二个参数,获取时间段(字符串类型,(2018-03-15)需要下载的账单日期,最晚是当期日期的前一天)
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步之后,我们就可以下载每日账单文件了
我下载下来是这样的,上个图:
解压之后:
打开excel(汇总)
是这样的:
至此,我们已经拿到了支付宝提供的每日账单文件,接下来才是重头戏,目前还没有确定选择哪种方案进行自动对账
确定之后,会把过程也补上。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/ouyzc/article/details/79568611