java后臺實現(xiàn)支付寶對賬功能的示例代碼
完成支付寶支付、查詢的接口之后,我們應(yīng)該還需要定時與支付寶進行對賬,以確保商戶系統(tǒng)的訂單信息是正確的,想知道支付寶支付、查詢接口實現(xiàn)過程的親們,可移步到上一篇有詳細過程。
現(xiàn)在我們來講一下支付寶對賬的功能,關(guān)于與支付寶交互的關(guān)鍵代碼,其實支付寶的API已經(jīng)講得很清楚,如果親們想直接看支付寶API,點擊 支付寶對賬API ,當(dāng)然我在文章也會進行說明解釋。
實現(xiàn)支付寶自動對賬功能
先看一下商戶系統(tǒng)和支付寶的大概交互過程:

所謂對賬,其實就是調(diào)用支付寶查詢接口,跟上一篇的查詢接口不同的是,上一篇的查詢接口是針對特定的一個訂單,通過訂單號或者支付寶交易號去查詢這一筆訂單的信息,而對賬,我們需要獲取一個時間段的所有訂單信息,因此,我們自然而已的去看支付寶提供的SDK是否有提供該接口給我們,經(jīng)過查看支付寶API,我們發(fā)現(xiàn)確實我們所需要的接口:alipay.data.dataservice.bill.downloadurl.query。廢話不多說,先上我實現(xiàn)的代碼
1.先是調(diào)用支付寶的對賬查詢接口,獲取賬單文件下載地址URL,關(guān)于一些支付寶的公共參數(shù),在上一篇我已經(jīng)封裝好,下面代碼是針對對賬的實現(xiàn)過程,傳入關(guān)鍵的2個業(yè)務(wù)參數(shù).公共參數(shù)支付寶SDK已經(jīng)封裝好。
第一個參數(shù),賬單類型(字符串類型,trade或者signcustomer,具體含義見支付寶API)
第二個參數(shù),獲取時間段(字符串類型,(2018-03-15)需要下載的賬單日期,最晚是當(dāng)期日期的前一天)
/**
* 實現(xiàn)支付寶對賬
* @param request
* @return response
*/
@Override
public void alipayBill() {
logger.info("==================向支付寶發(fā)起對賬請求");
// 獲取支付寶支付的配置信息
ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
Payment alipayment = (Payment) valueOps.get("alipayment");
if (alipayment == null) {
alipayment = alipayMentOrderRepository.getPayment(1, 1);
}
try {
//實例化客戶端(參數(shù):網(wǎng)關(guān)地址、商戶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();//創(chuàng)建API對應(yīng)的request類
request.setBizContent("{" +
"\"bill_type\":\"trade\"," +
"\"bill_date\":\"2018-03-14\"}"); //設(shè)置業(yè)務(wù)參數(shù)
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
String billDownloadUrl=response.getBillDownloadUrl();
logger.info("==================支付寶返回文件下載地址:"+billDownloadUrl);
this.downBill(billDownloadUrl); //調(diào)用下載文件方法
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//通過alipayClient調(diào)用API,獲得對應(yīng)的response類
//根據(jù)response中的結(jié)果繼續(xù)業(yè)務(wù)邏輯處理
}
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;
}
以上就是與支付寶交互的過程,支付寶API上也能找到這些代碼,完成以上2步之后,我們就可以下載每日賬單文件了
我下載下來是這樣的,上個圖:

解壓之后:

打開excel(匯總)
是這樣的:

至此,我們已經(jīng)拿到了支付寶提供的每日賬單文件,接下來才是重頭戲,目前還沒有確定選擇哪種方案進行自動對賬
確定之后,會把過程也補上。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring利用@Validated注解實現(xiàn)參數(shù)校驗詳解
這篇文章主要為大家詳細介紹了在?Spring?項目中使用?@Validated?進行參數(shù)校驗的方法和常見應(yīng)用場景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05
SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題及解決方法
這篇文章主要介紹了SpringBoot整合MyBatis-Plus樂觀鎖不生效的問題解決方案,通過實例代碼介紹了SpringBoot各個層次的操作,需要的朋友可以參考下2022-04-04
Spring Boot 2.0快速構(gòu)建服務(wù)組件全步驟
這篇文章主要給大家介紹了關(guān)于Spring Boot 2.0快速構(gòu)建服務(wù)組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring Boot 2.0具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
java連接mysql數(shù)據(jù)庫學(xué)習(xí)示例
這篇文章主要介紹了java連接mysql數(shù)據(jù)庫學(xué)習(xí)示例,需要的朋友可以參考下2014-03-03

