引言
上一篇博客中介绍了怎么获得签名,在这篇博客中将介绍如何采用注解方式将JavaBean转换为XML并采用AES全报文加密。
首先看一下生成的xml报文格式。
<?xml version="1.0" encoding="utf-8"?> <Message> <Sys_Head> <TRAN_CODE>CMS02CMS658</TRAN_CODE> <SEQ_NO>24080348632126308944</SEQ_NO> <CHL_ID>BJRXZQKJ00</CHL_ID> <TRAN_DATE>20190819</TRAN_DATE> <TRAN_TIMESTAMP>7594000</TRAN_TIMESTAMP> </Sys_Head> <Body> <ARRAYLIST> <Row> <SERIALNO>T20190818040100778115546</SERIALNO> <CALLSTATUS>1</CALLSTATUS> <CALLTIME>2019/08/19 10:06:06</CALLTIME> <TALKTIME>08:00:28</TALKTIME> <CALLRESULTCODE>15</CALLRESULTCODE> <CALLRESULTDES>询问是否本人</CALLRESULTDES> <ISONESELF>2</ISONESELF> <ISINUSE>1</ISINUSE> </Row> </ARRAYLIST> </Body> </Message>
通过注解的方式进行转换,主要是在定义实体的时候,采用正确的注解即可。
1、第一级节点Message
package com.jack.urgerobot.callback.model; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; /** * @author zhenghao * @description: * @date 2019/7/3011:18 */ @XmlRootElement(name = "Message") @XmlAccessorType(XmlAccessType.FIELD) public class Message { @XmlElement(name ="Sys_Head") private com.jack.urgerobot.callback.model.Head Head; @XmlElement(name ="Body") private Body body; public com.jack.urgerobot.callback.model.Head getHead() { return Head; } public void setHead(com.jack.urgerobot.callback.model.Head head) { Head = head; } public Body getBody() { return body; } public void setBody(Body body) { this.body = body; } }
2、Head节点
package com.jack.urgerobot.callback.model; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; /** * @author zhenghao * @description: * @date 2019/7/2612:01 */ @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Head { /** * 交易码 */ private String TRAN_CODE; /** * 流水号 */ private String SEQ_NO; /** * 请求方身份id */ private String CHL_ID = "BJRXZQKJ00"; /** * 交易日期 20181129 */ private String TRAN_DATE; /** * 交易时间 */ private String TRAN_TIMESTAMP; /** * 签名 */ private String SIGNATURE; //set get 方法省略 }
3、Body节点
package com.jack.urgerobot.callback.model; import javax.xml.bind.annotation.*; import java.util.List; /** * @author zhenghao * @description: * @date 2019/7/2612:01 */ @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Body { @XmlElementWrapper(name = "ARRAYLIST") @XmlElement(name ="Row") private List<Row> row ; public List<Row> getRow() { return row; } public void setRow(List<Row> row) { this.row = row; } }
4、row节点
package com.jack.callback.model; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; /** * @author zhenghao * @description: * @date 2019/8/517:34 */ @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Row { /** * 案件流水号 */ private String SERIALNO; /** * 接听状态 码值:1-接通 2-未接通 */ private String CALLSTATUS; /** * 呼叫时间 yyyy/MM/dd HH:mm:ss */ private String CALLTIME; /** * 通话时间 HH:mm:ss */ private String TALKTIME; /** * 案件结果码值 */ private String CALLRESULTCODE; /** * 通话结果描述 */ private String CALLRESULTDES; /** * 承诺还款时间 yyyy/MM/dd */ private String PROMISEDATE; /** * 是否本人 码值:1-是 2-否 */ private String ISONESELF; /** * 号码是否有效 码值:1-有效 2-无效 */ private String ISINUSE; //set get 省略 }
5、工具类代码
package com.jack.common.utils; import org.apache.poi.ss.formula.functions.T; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.namespace.QName; import java.io.StringWriter; /** * @author zhenghao * @description: * @date 2019/7/2611:21 */ public class XmlUtils { public static String beanToXml(Object obj, String encoding) throws JAXBException { String result = null; try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); StringWriter writer = new StringWriter(); marshaller.marshal(obj, writer); result = writer.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } }
6、调用测试
Message message = new Message(); message.setBody(body); message.setHead(head); String strXml = XmlUtils.beanToXml(message, "UTF-8");
到这生成xml的代码完成
7、AES加密工具类
package com.jack.common.utils; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author zhenghao * @description: 加密 * @date 2019/7/3015:06 */ public class EncryptUntils { private static Logger log = LoggerFactory.getLogger(EncryptUntils.class); public static String encrypt(String keyStr, String datastr) { String s = null; try { //加密 Key key = generateKey(keyStr); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] decrypt = cipher.doFinal(datastr.getBytes()); byte[] decrypt1 = Base64.encodeBase64(decrypt); s = new String(decrypt1); System.out.println(s); } catch (Exception e) { e.printStackTrace(); log.info("加密失败" + e.getMessage()); } return s; } /** * @Description: 解密 * @author: zhenghao * @date: 2019/7/30 15:13 */ public static String Decrypt(String keyStr, String datastr) { String s = null; try { Key key = generateKey(keyStr); Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher1.init(Cipher.DECRYPT_MODE, key); byte[] decrypt2 = cipher1.doFinal(Base64.decodeBase64(datastr)); s = new String(decrypt2); } catch (Exception e) { e.printStackTrace(); log.info("解密失败" + e.getMessage()); } return s; } private static Key generateKey(String key) throws Exception { try { SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); return keySpec; } catch (Exception e) { e.printStackTrace(); throw e; } } public static void main(String[] args) { // TODO Auto-generated method stub String keyStr = "D3BF52E111B8F129"; String datastr = "q8DtrPAfnJ/awzRnW44ui4YSQ/VIsm/5YdOn9lWFi8f1OTGH+3UNGnZRlRIvUXhTgJu8Y8F9yFIPLftxhgjvYz3cS9qrpo08/8gRT4xtXwFuWse+mc5J9Gt5Qf1U/aDCerV744NB1uzfOaG1umIGemR7vwyNCY88xGw3w0+iIpBNBg+bvbJ5j8GZv+owIkJf+mcUUqVFNXeaO+yFGmHHfg17iIdrSTQRYBAAO9Dx2+/tuvbep8QiXXrl2yMZfrByXooxIGxI1DOxwZl0qskuE/QWb5ePYTdkcdETQz/F1xx/1c9eEN1BGtP4YrVg0EhZx3ZqTlz3fFC4ns/r+8MutnyF2QzVhZLsI1ec1Qd0CbA59A4ivEHpxhmxk61yyhZ7IyxC7UZfS5O8vRVVB7deC33VTyxvCfq/wKnGZnCK2xYH6VVKwvl8GifDVneU57zf0Bi8wlSQ7VR11LwFuom00ICP/aDzKtfxSZtPsELaXkY="; try{ //加密 Key key = generateKey(keyStr); // Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // cipher.init(Cipher.ENCRYPT_MODE, key); // byte[] decrypt = cipher.doFinal(datastr.getBytes()); // byte[] decrypt1 =Base64.encodeBase64(decrypt); // System.out.println(new String(decrypt1)); //解密 Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher1.init(Cipher.DECRYPT_MODE, key); byte[] decrypt2 = cipher1.doFinal(Base64.decodeBase64(datastr)); System.out.println(new String(decrypt2)); }catch(Exception e){ e.printStackTrace(); } } }
8、最后我们将生成xml字符串和约定的加密key传入到加密方法中即可完成加密操作