package com.gkhy.exam.pay.utils; import com.alibaba.fastjson2.JSONObject; import org.dom4j.*; public class BillSignUtils { private static final String HEADER_TAG = "Header"; private static final String EINVOICE_TAG = "EInvoiceData"; // public static String signBill(byte[] bytes) throws BillSignException { // /* 41 */ // return signBill(new String(bytes)); // // } // // // public static String signBill(File file) throws BillSignException { // /* 54 */ // if (!file.exists()) { // /* 55 */ // throw new BillSignException("文件不存在。文件名称" + file.getAbsolutePath()); // // } // // // try { // /* 59 */ // byte[] bytes = FileUtils.readFileToByteArray(file); // /* 60 */ // return signBill(new String(bytes)); // /* 61 */ // } catch (IOException e) { // /* 62 */ // throw new BillSignException("文件读取失败。文件名称" + file.getAbsolutePath(), e); // // } // // } public static String signBill(String xml, JSONObject data) throws BillSignException { /* 78 */ Document xmlDoc = null; try { /* 80 */ xmlDoc = DocumentHelper.parseText(xml); /* 81 */ } catch (DocumentException e) { /* 82 */ throw new BillSignException("解析票据文件失败。", e); } /* 86 */ String plain = readRefSignDto(xmlDoc); /* 89 */ Node signNode = genUnitSignNode(plain, data); /* 92 */ addUnitSign(xmlDoc, signNode); /* 94 */ return xmlDoc.asXML(); } private static Node genUnitSignNode(String plain, JSONObject data) { /* 100 */ SignDto signDto = new SignDto(data.getDate("signTime"), data.getString("signResult"), data.getString("issure"), data.getString("sn")); /* 102 */ Document document = DocumentHelper.createDocument(); /* 103 */ Element signature = document.addElement("Signature"); /* 104 */ signature.addAttribute("id", "InvoicingParty"); /* 106 */ Element signedInfo = signature.addElement("SignedInfo"); /* 107 */ signedInfo.addElement("Reference").addAttribute("URI", "/EInvoice/Header|/EInvoice/EInvoiceData"); /* 108 */ signedInfo.addElement("SignatureAlgorithm").setText(signDto.getSignatureAlgorithm()); /* 109 */ signedInfo.addElement("SignatureFormat").setText(signDto.getSignatureFormat()); /* 111 */ signature.addElement("SignatureTime").setText(signDto.getSignatureTime()); /* 112 */ signature.addElement("SignatureValue").setText(signDto.getSignatureValue()); /* 114 */ Element keyInfo = signature.addElement("KeyInfo"); /* 115 */ keyInfo.addElement("SerialNumber").setText(signDto.getSerialNumber()); /* 116 */ keyInfo.addElement("X509IssuerName").setText(signDto.getIssuerDn()); /* 117 */ return (Node) signature; } private static String readRefSignDto(Document xmlDoc) throws BillSignException { /* 130 */ Element root = xmlDoc.getRootElement(); /* 131 */ if (root.element("Header") == null || root.element("EInvoiceData") == null) { /* 132 */ throw new BillSignException("票据文件格式不正确"); } /* 134 */ return root.element("Header").asXML() + root.element("EInvoiceData").asXML(); } private static void addUnitSign(Document xmlDoc, Node signNode) { /* 146 */ Element eInvoiceSignature = xmlDoc.getRootElement().addElement("EInvoiceSignature"); /* 147 */ eInvoiceSignature.add(signNode); } }