航信電子發票開發(servlet請求方式)


在系統用戶交費后,需要打印發票,可以選擇普票或者機打票(票據信息在系統中自定義設置的),也可以打印電子發票,這里對接的是航信的電子發票,請求方式非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();
    }

 

 

接口規范說明文檔下載地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM