年初的時候,支付寶查詢賬單是通過賬務(wù)明細(xì)分頁查詢接口“account.page.query”進(jìn)行賬單查詢浆兰,通過調(diào)用該接口獲取賬單信息磕仅,返回的是xml格式的字符串信息珊豹。
根據(jù)返回的字符串進(jìn)行過濾保存到數(shù)據(jù)庫或者添加表頭注釋信息再生成賬單文件(xxx.csv),xml格式字符串信息有限榕订。直到年中的時候支付寶方面開放了賬單下載的API接口店茶,新增了操作員字段以及終端號等字段,我們可以調(diào)用下載賬單的接口“alipay.data.dataservice.bill.downloadurl.query”獲取賬單的下載地址劫恒,打開地址時會保存賬單的壓縮文件贩幻,包括(賬單匯總)、(賬單明細(xì))两嘴。
第一個為通過下載鏈接地址獲得壓縮文件丛楚,解壓后里面包括之后兩個文件。
正常情況下我們只需要“賬單明細(xì)”這個文件中的內(nèi)容憔辫,為了不占用電腦內(nèi)存趣些,我們把原壓縮文件以及“賬單匯總”進(jìn)行過濾刪除,最終只保留“賬單明細(xì)”這個文件螺垢,用戶需要的時候可以去下載查看赖歌。
要保存到數(shù)據(jù)庫的話就得把數(shù)據(jù)提取出來枉圃,每一行第一個字符串為“#”的以及表頭都需要過濾掉,只留下中間的數(shù)據(jù)部分孽亲,再進(jìn)行分割過濾從而獲取到一小格一小格的字符串。
如上圖所示篮绿,僅需提供兩個入?yún)ill_type,bill_date便可得到下載地址bill_download_url,一個是賬單類型吕漂,一個是賬單的時間(格式為yyyy-MM-dd)
支付寶API文檔也提供各種版本的案例亲配,這里只講Java版本的
整個過程大概分為以下幾個步驟
(1)獲取賬單下載地址:String billUrl = getAliPayDownloadUrl();
(2)獲取賬單壓縮文件名:String filename = getDownloadFileName(billUrl);
(3)創(chuàng)建賬單壓縮文件存放目錄以及空壓縮文件
(4)將內(nèi)容寫入空壓縮文件:boolean downloadBill = toDownloadAliPayBill(billUrl,downloadUrl);
(5)解壓壓縮文件: FileUtil.unZip(downloadUrl,parientUrl);//解壓賬單文件
(6)過濾和刪除無用的文件,獲取業(yè)務(wù)明細(xì)文件內(nèi)容 :String billContent = getAliPayBillContent(parientUrl);
(7)過濾業(yè)務(wù)詳情賬單:content = readTxt(f.getPath())
(8)刪除數(shù)據(jù)庫中當(dāng)天的賬單數(shù)據(jù)
(9)保存新的賬單數(shù)據(jù)至數(shù)據(jù)庫
接下來一步步細(xì)講
一惶凝、獲取賬單下載地址
二吼虎、獲取賬單文件名
在賬單下載地址里面downloadFileName鍵后面的值就是,自己去通過字符串檢索獲取苍鲜。
三思灰、創(chuàng)建賬單壓縮文件存放目錄記憶空壓縮文件
根據(jù)自身所需自己解決
四、將內(nèi)容寫入空壓縮文件
五混滔、解壓壓縮文件
FileUtil是工具類洒疚,里面放了unZip方法歹颓,此處就是傳參數(shù)進(jìn)去解壓文件,上圖方法即unZip方法
六拳亿、過濾和刪除無用的文件晴股,獲取業(yè)務(wù)明細(xì)文件內(nèi)容
這里須特別注意,我賬單壓縮文件的解壓是把文件解壓到壓縮文件同目錄肺魁,為了遍歷的時候刪除电湘,也可以解壓成功后就刪除,
這里有個問題鹅经,如果你在該目錄下保存了其他的賬單文件寂呛,名字不匹配全部會被刪除,所以建議一個文件存放一個目錄瘾晃,例如我每個文件的目錄是“D:\bill\aliPayBill\2018\12\20181207\aliPayBill.csv”
因為賬單是一天一個的贷痪,放在同一個文件夾里面多了之后日后想找就麻煩,所以分類好蹦误。
至于改文件名劫拢,那是客戶要求的,大家根據(jù)所需調(diào)整强胰。
七舱沧、過濾業(yè)務(wù)詳情賬單
實際上是第六步里面就得執(zhí)行的過程
- BufferedReader要傳編碼符GBK,否則會中文亂碼
- 以“|”為分隔符分割每一行偶洋,后期分割的時候要添加轉(zhuǎn)義符 String[] str = result.split("\|");
你可能會遇到的坑
獲取不到賬單下載地址熟吏?
①公共請求參數(shù)是否正確?
②請求參數(shù)類型是否匹配玄窝?賬單時間格式為yyyy-MM-dd
③請求地址是否在支付寶平臺設(shè)置的授權(quán)回調(diào)地址等信息牵寺?不管是微信還是支付寶,都需要配置回調(diào)地址恩脂,該過程稱之為“握手”帽氓,把項目的域名配置進(jìn)去,該域名下的所有請求地址都可以與支付寶進(jìn)行連接俩块,并不是什么項目都可以的黎休。解壓一直失敗報錯?
①可能是文件流典阵、字節(jié)流沒有關(guān)閉奋渔?
②JDK1.7以上自帶的FileZip包可以傳編碼GBK,以下的不能壮啊,所以會造成文件名亂碼嫉鲸,百度下載ant的1.6.5版本的jar包,用ant中的FileZip包
③緩存問題歹啼,清掉緩存試試玄渗?偶爾解壓失敗報錯座菠?
①是否解壓成功的時候一高興就打開文件看看,之后沒關(guān)閉就再次執(zhí)行藤树?下載和解壓時會刪除已有的文件再創(chuàng)建新的浴滴,打開之后就被占用啦,沒發(fā)刪除岁钓,所以報錯啦升略。解壓中文亂碼?
①參考第二個第②條
以上內(nèi)容為本人真實項目經(jīng)驗屡限,第一次寫這種業(yè)務(wù)功能品嚣,覺得有必要保存起來,也供大家參考钧大,如果錯誤信息翰撑,請聯(lián)系本人修改以免誤導(dǎo),或者你有更好的建議啊央,歡迎交流眶诈。