在系統用戶交費后,需要打印發票,可以選擇普票或者機打票(票據信息在系統中自定義設置的),也可以打印電子發票,這里對接的是航信的電子發票,請求方式非web服務,而是使用servlet通過HTTP請求的方式獲取報文。
整個開票流程如下:
本地組裝發票明細信息到報文(內部報文加密)——》將組裝好的發票信息發往稅控服務器——》成功的話解析返回的信息——》發票打印
報文格式:
實際測試報文如下:
<?xml version="1.0" encoding="utf-8"?> <SERVICE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <HEAD> <nsrsbh>140115728183815</nsrsbh> <serviceversion>1.3</serviceversion> <serviceid>jy.dzptfpkj.hc</serviceid> <iszip>N</iszip> <issyn>Y</issyn> <encryptcode>0</encryptcode> <RTNINF/> </HEAD> <BODY>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KCjxSRVFVRVNUX0ZQS0pYWD4KICA8RlBLSlhYX0ZQVFhYPgogICAgPGRqcnEvPgogICAgPHhzZGgvPgogICAgPGZwbHg+MTA8L2ZwbHg+CiAgICA8Z2ZtYz7otK3kubDmlrk8L2dmbWM+CiAgICA8Z2Zuc3JzYmg+MTIzNDU2Nzg5MTIzNDU2PC9nZm5zcnNiaD4KICAgIDxnZmR6ZGg+6LSt5Lmw5pa55Zyw5Z2A55S16K+dPC9nZmR6ZGg+CiAgICA8Z2Z5aGp6aD7otK3kubDmlrnpk7booYzpk7booYw8L2dmeWhqemg+CiAgICA8Z2Zzai8+CiAgICA8Z2Z5eC8+CiAgICA8Yno+MTIzPC9iej4KICAgIDxrcHk+57O757uf566h55CG5ZGYPC9rcHk+CiAgICA8c2t5PmpjY3M8L3NreT4KICAgIDxmaHI+6KKB57+g6JCNPC9maHI+CiAgICA8aHNiej4xPC9oc2J6PgogICAgPHNsLz4KICAgIDx3Y3R6PjA8L3djdHo+CiAgICA8cnlkbT5hZG1pbjwvcnlkbT4KICAgIDxjaHl5PjEyMzwvY2h5eT4KICAgIDxmcHh6PjA8L2ZweHo+CiAgICA8dHNjaGJ6PjE8L3RzY2hiej4KICAgIDx5ZnBkbT4wMTQwMDEzMDAxMTE8L3lmcGRtPgogICAgPHlmcGhtPjIyMDM0MDk4PC95ZnBobT4KICAgIDxieXpkMS8+CiAgICA8Ynl6ZDIvPgogICAgPGJ5emQzLz4KICAgIDxieXpkNC8+CiAgICA8Ynl6ZDUvPgogIDwvRlBLSlhYX0ZQVFhYPgogIDxGUEtKWFhfWE1YWFM+CiAgICA8RlBLSlhYX1hNWFg+CiAgICAgIDxzcGZsZG0vPgogICAgICA8c3Bsd21jPuWfuuehgOawtOi0uTwvc3Bsd21jPgogICAgICA8Z2d4aD7llYbkuJo8L2dneGg+CiAgICAgIDxkdz4xPC9kdz4KICAgICAgPHNtLz4KICAgICAgPGNvdW50Pi0xPC9jb3VudD4KICAgICAgPHByaWNlPjkuNzA4NzM4PC9wcmljZT4KICAgICAgPGplPi05LjcxPC9qZT4KICAgICAgPHNsPjAuMDM8L3NsPgogICAgICA8c2U+LTAuMjk8L3NlPgogICAgICA8c3NmbGJtPjExMDAzMDEwMTAwMDAwMDAwMDA8L3NzZmxibT4KICAgICAgPGJtYmJoLz4KICAgICAgPGxzbGJzLz4KICAgICAgPHloemNicz4wPC95aHpjYnM+CiAgICAgIDx5aHpjc20vPgogICAgICA8ZnBoeHo+MDwvZnBoeHo+CiAgICAgIDxieXpkMS8+CiAgICAgIDxieXpkMi8+CiAgICAgIDxieXpkMy8+CiAgICAgIDxieXpkNC8+CiAgICAgIDxieXpkNS8+CiAgICA8L0ZQS0pYWF9YTVhYPgogIDwvRlBLSlhYX1hNWFhTPgo8L1JFUVVFU1RfRlBLSlhYPgo=</BODY> </SERVICE>
主要代碼如下:
1. 頁面選打印電子發票后,確定進入下面方法
public Result printElectronic(PrintInvoiceEntity entity) { // 電子發票不允許進行預覽 if (entity.getIsPreview()) { return new Result(Status.ERROR, null, "電子發票不允許進行預覽!"); } if (PrintCallingTypeEnum.HEATING.getCode().equals(entity.getPrintCallingType())) { //打印熱費的電子發票 return this.printElectronicForHeating(entity); } else { return new Result(Status.ERROR, null, "未指定打印票據的調用方式!"); } }
附:相關實體類
public class PrintInvoiceEntity { /* ------------------- 非必填字段 ---------------------*/ private String volumeCode;//票據冊號(當票據類型為電子發票時非必填) /* ------------------- 必填字段 ---------------------*/ private String companyCode;//開票公司編碼 private String gmf_mc;//購買方名稱 private String gmf_nsrsbh;//購買方納稅人識別號 private String gmf_dzdh;//購買方地址電話 private String gmf_yhzh;//購買方銀行賬戶 private String bz;//備注 private String card_no; private String create_time; private String printCallingType;//打印調用方式 private Boolean isPreview;//是否預覽模式 private Boolean isPreprint;//是否預開模式 private String invoiceType;//票據類型 List<PjItemEntity> pjItemEntities;//票據打印明細
2. 打印電子發票方法
private Result printElectronicForHeating(PrintInvoiceEntity entity) { // 正常采暖費交費時,獲取上年結余 printInvoiceService.initSurplus(entity.getPjItemEntities()); // 根據交易明細組裝發票明細信息 List<Invoice> invoices = printInvoiceService.splitInvoice( SessionUtil.getUser(), entity); // 調用航信稅控進行打票 List<Map<String, String>> returnMsg = this.printForHeating(invoices, entity, null); if (returnMsg.isEmpty()) { return new Result(Status.ERROR, null, "電子發票開具失敗!"); } return new Result(Status.OK, null, returnMsg); }
3. 組裝發票明細信息
// 將交易明細拆分成發票 public List<Invoice> splitInvoice(User operator, PrintInvoiceEntity entity) { List<Invoice> invoices = new ArrayList<Invoice>(); // 1.初始化字典項數據 Map<String, String> chargeItemDict = initChargeItemDict();// 收費項目 // Map<String, Dict> unitPriceTypeDict = initUnitPriceTypeDict();// 單價類別 Map<String, Dict> areaTypeDict = initAreaTypeDict();// 面積類別 Map<String, XtwhTaxRate> taxRateDict = initTaxRateDict(); // 稅率 Map<String, SfOtherCost> otherCostDict = initOtherCostDict(); // 第三方費用 List<PjItemEntity> pjItemEntities = entity.getPjItemEntities(); String customerIds = pjItemEntities.get(0).getSysattachment() .get(InvoiceInfoConstant.CUSTOMER_COLLECTION_ALIAS); String[] idArray = customerIds.split(","); String companyCode = this.getCompanyCode(entity, idArray[0]); String prjName = DeployConfigUtil.getJcDeployConfig().getProjectName(); JcCustomer jccustomer = this.getJccustomer(entity, idArray[0]); String userKindType =null; if (jccustomer !=null) { userKindType= jccustomer.getUserKindCode(); } // 4.獲取公共的發票抬頭模板 InvoiceSummary commonSummary = this.createInvoiceSummary(operator, companyCode); for (int i = 0; i < pjItemEntities.size(); i++) { // 淺復制發票抬頭對象 InvoiceSummary summary = commonSummary.clone(); // 發票請求流水號 summary.setFpqqlsh(SerialNumberUtil.getNextNumber(2)); // 1.同步購買方信息 summary.setGmf_mc(entity.getGmf_mc());// 銷售方-名稱 summary.setGmf_nsrsbh(entity.getGmf_nsrsbh());// 銷售方-納稅人識別號 summary.setGmf_dzdh(entity.getGmf_dzdh());// 銷售方-地址電話 summary.setGmf_yhzh(entity.getGmf_yhzh());// 銷售方-銀行賬戶 summary.setCard_no (entity.getCard_no());// 銷售方-銀行賬戶 summary.setCreate_time (entity.getCreate_time());// 銷售方-銀行賬戶 if ("0".equals(prjName)) { summary.setBz(entity.getBz()); } else if("1".equals(prjName)){ if (jccustomer!=null && "user_type_2".equals(jccustomer.getUserTypeCode())) { // 二部制用戶 summary.setBz(entity.getBz()+", 上年結余:"+pjItemEntities.get(i).getSurplus());// 備注 }else{ summary.setBz(entity.getBz()); } } Invoice invoice = this.splitInvoiceDetail( entity.getPrintCallingType(), summary, pjItemEntities.subList(i, i + 1), chargeItemDict, areaTypeDict, taxRateDict, otherCostDict, userKindType); invoices.add(invoice); } return invoices; }
將交易明細拆分成發票上的多個明細項
public Invoice splitInvoiceDetail(String printCallingType, InvoiceSummary summary, List<PjItemEntity> pjItemEntities, Map<String, String> chargeItemDict, Map<String, Dict> areaTypeDict, Map<String, XtwhTaxRate> taxRateDict, Map<String, SfOtherCost> otherCostDict, String userKindType) { List<InvoiceDetail> invoiceDetails = new ArrayList<InvoiceDetail>(); for (PjItemEntity pjItemEntity : pjItemEntities) { // 交易明細為熱費 List<InvoiceDetail> list = this.createInvoiceDetailsByHeatingCost( printCallingType, pjItemEntity, chargeItemDict, areaTypeDict, taxRateDict , userKindType); invoiceDetails.addAll(list); } // 2.同步合計金額 BigDecimal hjje = BigDecimal.ZERO;// 合計金額 BigDecimal hjse = BigDecimal.ZERO;// 合金稅額 for (InvoiceDetail invoiceDetail : invoiceDetails) { hjje = BigDecimalUtil.add(hjje, new BigDecimal(invoiceDetail.getXmje())); hjse = BigDecimalUtil.add(hjse, new BigDecimal(invoiceDetail.getSe())); } summary.setHjje(hjje.toString()); summary.setHjse(hjse.toString()); BigDecimal jshj = BigDecimalUtil.add(hjje, hjse);// 價稅合計 summary.setJshj(jshj.toString()); // 3.組裝發票 Invoice invoice = new Invoice(); invoice.setSummary(summary); invoice.setDetails(invoiceDetails); return invoice; }
相關實體:
public class Invoice {//發票實體 private InvoiceSummary summary; //發票抬頭信息 private List<InvoiceDetail> details; //發票項目明細信息
public class InvoiceSummary implements Cloneable{//發票抬頭信息實體 private Long pjInfoId; //票據表ID private String fp_dm; // 發票代碼 private String fp_hm; // 發票號碼 private String fp_ch; // 發票冊號 private String fpqqlsh; // <FPQQLSH>發票請求流水號</FPQQLSH> private String kplx; // <KPLX>開票類型</KPLX> private String xsf_nsrsbh; // <XSF_NSRSBH>銷售方納稅人識別號</XSF_NSRSBH> private String xsf_mc; // <XSF_MC>銷售方名稱</XSF_MC> private String xsf_dzdh; // <XSF_DZDH>銷售方地址、電話</XSF_DZDH> private String xsf_yhzh; // <XSF_YHZH>銷售方銀行賬號</XSF_YHZH> 否 private String gmf_nsrsbh; // <GMF_NSRSBH>購買方納稅人識別號</GMF_NSRSBH> 否 private String gmf_mc; // <GMF_MC>購買方名稱</GMF_MC> private String gmf_dzdh; // <GMF_DZDH>購買方地址、電話</GMF_DZDH> 否 private String gmf_yhzh; // <GMF_YHZH>購買方銀行賬號</GMF_YHZH> 否 private String kpr; // <KPR>開票人</KPR> private String skr; // <SKR>收款人</SKR> 否 private String fhr; // <FHR>復核人</FHR> 否 private String yfp_dm; // <YFP_DM>原發票代碼</YFP_DM>紅字發票時必須填寫 private String yfp_hm; // <YFP_HM>原發票號碼</YFP_HM> 紅字發票時必須填寫 private String jshj; // <JSHJ>價稅合計</JSHJ>單位:元(2位小數) private String hjje; // <HJJE>合計金額</HJJE>不含稅,單位:元(2位小數) private String hjse; // <HJSE>合計稅額</HJSE>單位:元(2位小數) private String bmb_bbh;// <BMB_BBH>編碼表版本號</BMB_BBH>目前為1.0 private String qd_bz;// <QD_BZ>清單標志</QD_BZ>0:根據項目名稱字數,自動產生清單,保持目前邏輯不變1:取清單對應票面內容字段打印到發票票面上,將項目信息 XMXX 打印到清單上。默認為 0。 1 暫不支持 private String qdxmmc;// <QDXMMC>清單項目名稱</QDXMMC>否 需要打印清單時對應發票票面項目名稱清單標識( QD_BZ)為 1 時必填。為 0不進行處理。 private String ghf_sj; // <GHF_SJ>購貨方手機</GHF_SJ> 否 private String ghf_email; // <GHF_EMAIL>購貨方郵箱</GHF_EMAIL> 否 private String bz; // <BZ>備注</BZ> 否 private String card_no; // <BZ>用戶卡號</BZ> 否 private String create_time; // <BZ>交易時間</BZ> 否
4. 調用航信稅控進行打票
public List<Map<String, String>> printForHeating(List<Invoice> invoices, PrintInvoiceEntity entity, PjInfo bluePjinfo) { List<Map<String, String>> returnMsg = new ArrayList<Map<String, String>>(); String prjName = DeployConfigUtil.getJcDeployConfig().getProjectName();// 0:項目A 1:項目B // 將組裝好的發票信息發往稅控服務器進行電子發票打印 String requestXml = null; // 請求報文 String returnXml = null; // 請求報文對應的返回報文 InvoiceReturnEntity invoiceReturnEntity = null; // 開票返回報文對應的實體 PjItemEntity pjItemEntity = null; // 票據打印原始數據 Invoice invoice = null; // 票據實體 PjInfo pjInfo = null; for (int i = 0; i < invoices.size(); i++) { invoice = invoices.get(i); pjItemEntity = entity.getPjItemEntities().get(i); JcCustomer jcCustomer = printInvoiceService.getJccustomer(entity,pjItemEntity.getCustomerId().toString()); String userKindType=null; if (jcCustomer != null) { userKindType = jcCustomer.getUserKindCode(); } // 將開具的電子發票信息保存到收費系統票據信息表中 pjInfo = ElnvoiceEntityUtil.createPjInfo( entity.getPrintCallingType(), entity.getIsPreprint(), invoice, bluePjinfo); pjInfoService.insert(pjInfo); //藍票沖紅 if(bluePjinfo != null){ invoice.getSummary().setPjInfoId(bluePjinfo.getId()); }else{ invoice.getSummary().setPjInfoId(pjInfo.getId()); } if ("0".equals(prjName)) { if (StringUtils.defaultString(invoice.getSummary().getYfp_dm()).length() > 0 && StringUtils.defaultString(invoice.getSummary().getYfp_hm()).length() > 0) { // 封裝航信電子發票所需報文--紅沖 requestXml = LFEInvoiceXmlUtil.createHCEInvoiceXml(invoice,userKindType); } else { // 封裝航信電子發票所需報文 requestXml = LFEInvoiceXmlUtil.createEInvoiceXml(invoice, userKindType); } // 請求航信開票接口開具報文 returnXml = EInvoiceWsUtil.eInvoice(requestXml); // 解析返回報文 invoiceReturnEntity = LFElnvoiceEntityUtil.createInvoiceReturnEntity(returnXml); } else { if (StringUtils.defaultString(invoice.getSummary().getYfp_dm()).length() > 0 && StringUtils.defaultString(invoice.getSummary().getYfp_hm()).length() > 0) { // 封裝航信電子發票所需報文--紅沖 requestXml = EInvoiceXmlUtil.createHCEInvoiceXml(invoice); } else {// 封裝航信電子發票所需報文 requestXml = EInvoiceXmlUtil.createEInvoiceXml(invoice); } // 請求航信開票接口開具報文 returnXml = EInvoiceWsUtil.eInvoice(requestXml); // 解析返回報文 invoiceReturnEntity = ElnvoiceEntityUtil.createInvoiceReturnEntity(returnXml); } if (!RETURN_CODE_SUCCESS .equals(invoiceReturnEntity.getReturnCode())) { continue; } // 將開具的電子發票信息保存到收費系統票據信息表中 pjInfo = ElnvoiceEntityUtil.updatePjInfo(pjInfo, invoiceReturnEntity); pjInfoService.updateById(pjInfo); // 記錄開票明細 printInvoiceService.savepjItem(pjInfo.getId(), pjItemEntity); // 掛上電子發票與熱用戶的關聯關系 printInvoiceService.savePjCustomerRelation(pjInfo.getId(),pjItemEntity); // 更新交易明細為已開票狀態 printInvoiceService.updateInvoiceStatusForHeating(entity.getPrintCallingType(), pjItemEntity); // 推送到財務,此處正常開票、補打、沖紅、集體交費逐戶打印、全部打印都調用 printInvoiceService.insertRfglFinance(pjItemEntity, pjInfo, invoice); // 根據票據號請求電子發票下載地址 /* invoiceQueryEntity = ElnvoiceEntityUtil.createQueryInvoiceEntity(pjInfo); requestXml = EInvoiceXmlUtil.createQueryInvoiceXml(invoiceQueryEntity); returnXml = EInvoiceWsUtil.queryInvoice(requestXml); queryReturnEntity = ElnvoiceEntityUtil.createQueryReturnEntity(returnXml);*/ // 封裝前台返回信息 Map<String, String> map = new HashMap<String, String>(); map.put("fpdm", invoiceReturnEntity.getFp_dm()); map.put("fphm", invoiceReturnEntity.getFp_hm()); map.put("downloadUrl", invoiceReturnEntity.getPdfUrl()); returnMsg.add(map); //下載pdf到本地 if(StringUtils.isNotEmpty(invoiceReturnEntity.getPdfUrl())){ try { downLoadByUrl(invoiceReturnEntity.getPdfUrl()); } catch (IOException e) { System.err.println("電子發票- PDF下載失敗!"); e.printStackTrace(); } } } return returnMsg; }
相關實體:
public class InvoiceReturnEntity { //電子發票-請求開具發票返回報文對應的實體 private String fpqqlsh; //<FPQQLSH>發票請求流水號</FPQQLSH> private String jqbh;//<JQBH>稅控設備編號</JQBH> private String fp_dm;//<FP_DM>發票代碼</FP_DM> private String fp_hm;//<FP_HM>發票號碼</FP_HM> private String kprq;//<KPRQ>開票日期</KPRQ> private String fp_mw;//<FP_MW>發票密文</FP_MW> private String jym;//<JYM>校驗碼</JYM> private String ewm;//<EWM>二維碼</EWM> private String returnCode;//<RETURNCODE>返回代碼</RETURNCODE> private String returnMsg;//<RETURNMSG>返回信息</RETURNMSG> private String ssyf;// 所屬月份 private String kplx;// 開票類型1-正票 2-紅票 private String hjbhsje;// 合計不含稅金額 private String kphjse;// 開票合計稅額 private String czdm;// 10-正常開具 20-紅票 private String pdfFile;// PDF文件 private String pdfUrl;// PDF下載路徑
5. 封裝航信電子發票所需報文——》發送到航信接口開具報文——》解析包含開票信息的返回報文
5.1 生成電子發票開具報文
public static String createEInvoiceXml(Invoice invoice, String userKindType){ Document document = DocumentHelper.createDocument(); document.setXMLEncoding("utf-8"); // 默認utf-8 Element rootElement = getRoolElement(document, ""); String cdataXml =createEInvoiceCDATA(invoice, userKindType); //內部報文加密 Base64Encoder encoder = new Base64Encoder(); String comment = encoder.encode(cdataXml.getBytes()); Element dataElement = rootElement.element("Data"); dataElement.element("content").addText(comment); //xml文件"< >"禁止轉義,保留<>樣式的方法 String xml = StringEscapeUtils.unescapeXml(document.asXML()); return xml ; }
5.2 調用稅控開具發票接口
public static String eInvoice(String wsXml){ String methodName = "eInvoiceCodes"; return EInvoiceWsUtil.invoke(methodName, wsXml); }
//調用遠程服務接口的公共方法,獲得包含開票信息的返回報文 public static String invoke(String methodName, String wsXml){ CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(webServiceUrl);// 創建httpPost httpPost.setHeader("Accept", "text/xml"); httpPost.setHeader("Content-Type", "text/xml"); String charSet = "UTF-8"; StringEntity entity = new StringEntity(wsXml, charSet); httpPost.setEntity(entity); CloseableHttpResponse response = null; try { response = httpclient.execute(httpPost); StatusLine status = response.getStatusLine(); int state = status.getStatusCode(); if (state == 200) { HttpEntity responseEntity = response.getEntity(); String jsonString = EntityUtils.toString(responseEntity); System.out.println("---response----"+jsonString); return jsonString; } else{ System.err.print("請求返回:"+state+"("+webServiceUrl+")"); } } catch(IOException e){ e.printStackTrace(); } finally { if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }
5.3 解析返回報文,將信息保存進返回報文實體類
public static InvoiceReturnEntity createInvoiceReturnEntity(String returnXml){ InvoiceReturnEntity entity = new InvoiceReturnEntity(); try { Document document = DocumentHelper.parseText(returnXml); Element rootElement = document.getRootElement(); //business標簽 Element element = null; Element headElement = rootElement.element("interface"); Element rtnElement = headElement.element("returnStateInfo"); String rtnCode = rtnElement.element("returnCode").getTextTrim(); Element dataElement = rootElement.element("Data"); //開票成功返回code if("0000".equals(rtnCode)){ // base64解碼 String cdataXml = dataElement.element("content").getTextTrim(); String bodyXml = base64Decoder(cdataXml); Document bodyDoc = DocumentHelper.parseText(bodyXml); Element bodyElement = bodyDoc.getRootElement(); element = bodyElement.element("FPQQLSH"); entity.setFpqqlsh(element.getTextTrim()); element = bodyElement.element("FP_DM"); entity.setFp_dm(element.getTextTrim()); element = bodyElement.element("FP_HM"); entity.setFp_hm(element.getTextTrim()); element = bodyElement.element("KPRQ"); entity.setKprq(element.getTextTrim()); element = bodyElement.element("PDF_URL"); entity.setPdfUrl(element.getTextTrim()); } entity.setReturnCode(rtnCode); element = rtnElement.element("RETURNMESSAGE"); entity.setReturnMsg(element.getTextTrim()); } catch (DocumentException e) { System.err.println("電子發票-開具發票請求的返回報文解析失敗!"); e.printStackTrace(); } return entity; }
6. 從網絡Url中下載發票信息的pdf文件
public void downLoadByUrl(String urlStr) throws IOException{ URL url = new URL(urlStr); String[] str= urlStr.split("/"); String fileName= str[str.length-1]+".pdf"; String savePath = "C://upload"; HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設置超時間為3秒 conn.setConnectTimeout(2*1000); //防止屏蔽程序抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到輸入流 InputStream inputStream = conn.getInputStream(); //獲取自己數組 byte[] getData = readInputStream(inputStream); //文件保存位置 File saveDir = new File(savePath); if(!saveDir.exists()){ saveDir.mkdir(); } File file = new File(saveDir+File.separator+fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if(fos!=null){ fos.close(); } if(inputStream!=null){ inputStream.close(); } } // 從輸入流中獲取字節數組 public byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); }
接口規范說明文檔下載地址