在系统用户交费后,需要打印发票,可以选择普票或者机打票(票据信息在系统中自定义设置的),也可以打印电子发票,这里对接的是航信的电子发票,请求方式非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; //票据表IDprivate 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.0private 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-8Element 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");//开票成功返回codeif("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();}

接口规范说明文档下载地址

航信电子发票开发(servlet请求方式)相关推荐

  1. 基于诺诺电子发票平台开发开具电子发票

    目前做几个系统的整合,将之前做的移动端,小程序,PC端整合到一个系统中,今天整合电子发票的开具功能.发现去年写的代码真是low到家了,重新梳理了一下,现在做一下总结. 今天查看诺诺发票官网,发现已经更 ...

  2. 【Servlet】HTTP 协议之请求方式、Servlet介绍、Servlet 的生命周期

    HTTP 协议之请求格式 HTTP协议官网:其中有http协议原文https://www.w3.org/Protocols/ 请求格式的结构: 请求头:请求方式.请求的地址和HTTP 协议版本 请求行 ...

  3. php开发电子发票接口,EasyAPI发票管理加油站电子发票解决方案

    原标题:EasyAPI发票管理加油站电子发票解决方案 时代抛弃你时,连一声再见都不会说.这不,前一秒是还纸质发票,这一秒各行各业就都推行了电子发票.不得不感叹:时代改变真快!当然,电子发票会更方便.更 ...

  4. 以编程方式抓取中国联通电子发票

    电子发票通常是以pdf文件存在,各大电商几乎都提供电子发票,如京东.淘宝(天猫).苏宁易购.携程.中国联通.电信.移动等平台.那么,我们如何以编程方式爬取这些平台的电子发票呢?好了,这里我直接上代码供 ...

  5. 以编程方式抓取京东商城电子发票

    电子发票通常是以pdf文件存在,各大电商几乎都提供电子发票,如京东.淘宝(天猫).苏宁易购.携程.中国联通.电信.移动等平台.那么,我们如何以编程方式爬取这些平台的电子发票呢?好了,这里我直接上代码供 ...

  6. 菜鸟后端开发之接口请求方式

    开发过程中的接口都会和请求方式打交道,日常开发说简单就是增删改查,但是想要融会贯通难上加难.请求方式用来面对前后交互,常见的有六种. 目录 一.常见六种请求方式 二.Get请求 三.Post请求 四. ...

  7. 快来,票字版软件电子发票的设置方式(详细流程)

    第一步:电子发票的设置,系统设置-参数设置-运行参数 务必确认电子发票手工上传已打勾,可重复查看确认. 第二步:入去电子发票开票界面 上传设置: 服务器地址:http://api.baiwang.co ...

  8. 微信小程序开发电子发票

    电子发票的写法 我这边找到的是用canvas来写,自己canvas不行,看到有wxml-to-canvas这个语法来尝试,但是结果是不行的,还有没有其他方法不是用canvas来画的,各位大佬求求了.

  9. 安徽航信研发项目管理体系探索与实践

    一.前言 安徽航天信息科技有限公司(以下简称"安徽航信")是航天信息股份有限公司的控股子公司,是隶属于中国航天科工集团公司的三级单位,成立于2003年12月,位于安徽省合肥市高新技 ...

最新文章

  1. 图像几何变换C++实现--镜像,平移,旋转,错切,缩放
  2. asp.net TemplateField模板中的Bind方法和Eval方法
  3. Promise和Async-Await的入门教程
  4. linux mysql ibd_MySQL:如何从ibd文件中恢复数据
  5. spring 计划任务
  6. javascript sort排序
  7. H5页面--Android滑动屏幕图片误触
  8. 第二阶段团队站立会议08
  9. 联想笔记本关闭锁定计算机,联想笔记本电脑键盘锁了怎么解开
  10. Word修改标题样式缩进不起作用原因
  11. vs配置python环境_VS2017中安装Python开发环境[TZZ]
  12. ImportError: cannot import name 'imsave' from 'scipy.misc' (C:\Users\DELL\AppData\Roaming\Python\Pyt
  13. Java中强、软、弱、虚引用
  14. word的大表格中自动换页
  15. SpringMVC MultipartFile 异步批量上传文件
  16. 在线记录源码调试之@EnableAspectJAutoProxy与Spring AOP(三)调用被代理方法userServiceImpl.save(user)
  17. 数据库学习之sql语句基础
  18. HTML数字化教学资源平台,网页设计与制作教学课件作者HTML+CSS+JavaScript张洪斌教学资源数字化教学资源平台网站布局课件.doc...
  19. 三星GT-S7572换屏幕教程
  20. python 爬取微信公众号文章(selenium+webdriver)

热门文章

  1. 用python制作文本编辑器
  2. 微课教学在中等医学职业教育教学中的应用实践研究
  3. ERP功能需求分析问卷表
  4. matplotlib显示灰度图为紫色的问题
  5. RSocket协议初识(一)
  6. 龙芯1b(LS1B200)使用LVGL7.0.1组件 按钮矩阵 实现简易计算器
  7. Duilib仿PotPlayer视频播放客户端
  8. 自适应网站(不用任何框架实现)
  9. 计算机大学实践报告范文,大学生计算机教学社会实践报告范文
  10. java环境配置+marven+vue(勿看)