在网上稍微搜了一下,有一篇介绍了如何处理,但那时候的对账单数据与我现在下载下来的似乎有点误差,在这里我不谈论对方的方法对错,我只写下自己的处理过程.
首先,先看下获取的对账单数据:
2019-03-13 17:20:09,wx10796e586721729e,1526775301,0,,4200000257201903132495667456,555439938150072320,o-YLy5CNWR2_tR-pzvgs5kzU-82g,JSAPI,SUCCESS,COMM_CREDIT,CNY,1.00,0.00,0,0,0.00,0.00,,,天虹基金管理会,PAYMENT_EXPERIENCE_FEE,0.01000,0.60%,1.00,0.00,\r2019-03-13 17:33:55,wx10796e586721729e,1526775301,0,,4200000257201903132495667456,555439938150072320,o-YLy5CNWR2_tR-pzvgs5kzU-82g,JSAPI,REFUND,COMM_CREDIT,CNY,0.00,0.00,50000010172019031308710710739,1038374382019031324956674561552469612,1.00,0.00,ORIGINAL,SUCCESS,天虹基金管理会,PAYMENT_EXPERIENCE_FEE,-0.01000,0.60%,0.00,1.00,\r
如上,这是稍加处理的数据,把文字头去掉以及后面汇总数据还有单点`符号(后面会贴处理代码).
拿到这样的一份数据,其实大家应该都能看出来只需要截取\r就可以取出两份字符串数组了,但是今天在截取这个"回车换行"符的时候着实折腾了半天,算是与大家分享一下自己踩得坑吧.我在网上搜了半天,找到说用"r?"或者"\r?"代替的,但是最终都没有实现.最终,我还是在群里问了一下,说是先用replace方法把"\r"替换掉,再去用替换的字符分割,还有就是千万不要用string的replaceAll方法,而是用replace方法...
@Scheduled(cron = "0 0 10 * * ?")public void doDownloadBill() throws Exception {WXPay wxpay = new WXPay(WXPayConfigImpl.getInstance());HashMapString, String data = new HashMapString, String();data.put("bill_date", DateTimeUtil.getTimeShortString(DateUtils.addDateDays(new Date(), -1)));data.put("bill_type", "ALL");try {MapString, String r = wxpay.downloadBill(data);String result = JsonMapper.obj2String(r);String tradeMsg = result.substring(result.indexOf("`"));String tradeInfo = tradeMsg.substring(0, tradeMsg.indexOf("总")).replace("`", "");// 去掉汇总数据,并且去掉'`'String[] tradeArray = tradeInfo.replace("\r", " wc").split("wc"); // i wanna say nothingfor (String tradeDetailInfo : tradeArray) {String[] tradeDetailArray = tradeDetailInfo.split(",");BillEntity bill = BillEntity.builder().id(IdGenerator.nextId()).tradedate(DateUtils.stringToDate(tradeDetailArray[0])).commonid(tradeDetailArray[1]).businessno(tradeDetailArray[2]).specialbusinessno(tradeDetailArray[3]).deviceno(tradeDetailArray[4]).wxorderno(tradeDetailArray[5]).businessorderno(Long.valueOf(tradeDetailArray[6])).usertype(tradeDetailArray[7]).tradetype(tradeDetailArray[8]).tradestatus(tradeDetailArray[9]).paybank(tradeDetailArray[10]).moneytype(tradeDetailArray[11]).payordermoney(new BigDecimal(tradeDetailArray[12])).paperreplacemoney(new BigDecimal(tradeDetailArray[13])).wxrefundno(tradeDetailArray[14]).businessrefundno(tradeDetailArray[15]).refundamount(new BigDecimal(tradeDetailArray[16])).rechargerefundamount(new BigDecimal(tradeDetailArray[17])).refundtype(tradeDetailArray[18]).refundstatus(tradeDetailArray[19]).businessname(tradeDetailArray[20]).businessdata(tradeDetailArray[21]).fee(new BigDecimal(tradeDetailArray[22])).feerate(tradeDetailArray[23]).orderamount(new BigDecimal(tradeDetailArray[24])).applyrefundamount(new BigDecimal(tradeDetailArray[25])).feeratenote(tradeDetailArray[26]).createdate(new Date()).build();billMapper.insert(bill);}} catch (Exception e) {e.printStackTrace();}}微信小程序支付sdk二次封装(开箱即用)
最近,做微信退款时遇到点小问题,就直接在这下面更新:由于拉取对账单不需要证书,因此我就项目中初始化了一下并没有注意,现在退款需要读取证书内容转化为字节数组.之前,我是将证书放在服务器上固定路径,代码中直接读取文件,后来由于线上环境麻烦,因此就讲证书放在了项目下的resource文件中,因而遇到了读取不到的问题
这里有一篇介绍读取springboot中resource下文件的介绍
下面贴出我在微信支付sdk中初始化证书时的操作:
private WXPayConfigImpl() throws Exception { String certPath = WXPayConstants.APICLIENT_CERT; // File file = new File( certPath ); ClassPathResource resource = new ClassPathResource( certPath ); // File file = ResourceUtils.getFile( certPath ); // InputStream certStream = new FileInputStream( file ); InputStream certStream = resource.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while( ( len = certStream.read( buffer ) ) != -1 ) { bos.write( buffer, 0, len ); } bos.flush(); // this.certData = new byte[(int) file.length()]; // certStream.read( this.certData ); this.certData = bos.toByteArray(); certStream.close(); }希望对大家有用^_^













