zoukankan      html  css  js  c++  java
  • xml格式报文的拼装,和解析成实体类

             我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道。所有的接口请求、应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下。

            拼接xml格式报文。

            从页面表单提交和配置文件中读取出参数,或用实体类接收的页面传来的参数。建立map对象,用put()方法把参数添加进去。然后遍历map,将map转换成xml。

    1. StringBuffer soapResultData = new StringBuffer();
    2. //xml声明
    3. soapResultData.append("<?xml version="1.0" encoding="GBK"?><ROOT><MSG_HEAD>");
    4. //请求头
    5. soapResultData.append(requesttoxml(msgHead));
    6. soapResultData.append("</MSG_HEAD><MSG_BODY>");
    7. //请求体
    8. soapResultData.append(requesttoxml(resmap));
    9. soapResultData.append("</MSG_BODY></ROOT>");

    1. /**
    2. * 将map转化为XML格式的字符串
    3. * @param resmap
    4. * @return
    5. */
    6. public static String requesttoxml(Map<String, String> resmap){
    7. StringBuffer soapResultData = new StringBuffer();
    8. for(String key : resmap.keySet()){
    9. soapResultData.append("<");
    10. soapResultData.append(key);
    11. soapResultData.append(">");
    12. soapResultData.append(resmap.get(key));
    13. soapResultData.append("</");
    14. soapResultData.append(key);
    15. soapResultData.append(">");
    16. }
    17. return soapResultData.toString();
    18. }
            将接收到的xml格式报文,转换成实体类。

            

    1. package com.ustcsoft.business.model;
    2. import java.io.Serializable;
    3. import org.apache.commons.digester3.annotations.rules.BeanPropertySetter;
    4. import org.apache.commons.digester3.annotations.rules.ObjectCreate;
    5. @ObjectCreate(pattern = "ROOT/MSG_HEAD")
    6. public class ResponseMsgHead implements Serializable {
    7. /**
    8. *
    9. */
    10. private static final long serialVersionUID = -2793215313546940251L;
    11. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/TRAN_CODE")
    12. private String TRAN_CODE;
    13. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/PARTNER_CODE")
    14. private String PARTNER_CODE;
    15. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/REQUEST_SERIAL")
    16. private String REQUEST_SERIAL;
    17. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_DATE")
    18. private String RESPONSE_DATE;
    19. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_TIMESTAMP")
    20. private String RESPONSE_TIMESTAMP;
    21. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_CODE")
    22. private String RESULT_CODE;
    23. @BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_MESSAGE")
    24. private String RESULT_MESSAGE;
    25. //get set 省略,不贴在这儿,自己使用时别忘了生成个set和get方法
    26. }

    1. import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
    2. import java.io.StringReader;
    3. import java.text.SimpleDateFormat;
    4. import java.util.HashMap;
    5. import java.util.Map;
    6. import java.util.TreeMap;
    7. import org.apache.commons.digester3.Digester;
    8. import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
    9. import org.apache.log4j.Logger;
    10. import com.ustcsoft.business.model.CreditPayResponseBody;;
    11. import com.ustcsoft.business.model.ResponseMsgHead;
    12. import com.ustcsoft.framework.util.HTTPUtil;
    13. import com.ustcsoft.framework.util.XMlUtil;
    14. public class PayService {
    15. private final Map<Class<?>, FromAnnotationsRuleModule> xmlAnnotationModule = new HashMap<Class<?>, FromAnnotationsRuleModule>();
    16. private static final Logger logger=Logger.getLogger(PayService.class);
    17. public PayService() {
    18. xmlAnnotationModule.put(ResponseMsgHead.class,
    19. new FromAnnotationsRuleModule() {
    20. @Override
    21. protected void configureRules() {
    22. bindRulesFrom(ResponseMsgHead.class);
    23. }
    24. });
    25. xmlAnnotationModule.put(CreditPayResponseBody.class,
    26. new FromAnnotationsRuleModule() {
    27. @Override
    28. protected void configureRules() {
    29. bindRulesFrom(CreditPayResponseBody.class);
    30. }
    31. });
    32. }
    33. //中间业务代码省略……
    34. public <T> T parseXml(String xml, Class<T> clazz) throws Exception {
    35. StringReader sr = null;
    36. try {
    37. Digester digester = newLoader(xmlAnnotationModule.get(clazz)).newDigester();
    38. sr = new StringReader(xml);
    39. T pi = digester.parse(sr);
    40. digester.clear();
    41. return pi;
    42. } finally {
    43. if (sr != null) {
    44. sr.close();
    45. }
    46. }
    47. }
    48. }
    1. logger.info("统一下单接口请求报文:"+requestxml);
    2. String resultxml = HTTPUtil.postByHttps(url, requestxml,"GBK");
    3. logger.info("统一下单接口返回报文:"+resultxml);
    4. if(resultxml != null){
    5. resultxml = XMlUtil.xmltoUpperCase(resultxml);//将XML报文中的标签,全部转化为大写
    6. ResponseMsgHead head = parseXml(resultxml, ResponseMsgHead.class);
    7. CreditPayResponseBody body = parseXml(resultxml, CreditPayResponseBody.class);
    8. if (null != head) {
    9. if(head.getRESULT_CODE().equals("000000")){
    10. logger.info("下单成功");
    11. logger.info("返回参数:sub_mch_id="+body.getSUB_MCH_ID()+",total_fee="+body.getTOTAL_FEE()+",out_trade_no="+body.getOUT_TRADE_NO());
    12. return body;
    13. }else{
    14. logger.info("下单失败,错误码:"+head.getRESULT_CODE()+",错误信息:"+head.getRESULT_MESSAGE());
    15. }
    16. }
    17. }

    1. /**
    2. * 将XML报文中的标签,全部转化为大写
    3. * @param xmlMessage
    4. * @return
    5. */
    6. public static String xmltoUpperCase(String xmlMessage) {
    7. Pattern pattern = Pattern.compile("<.+?>");
    8. String xml = xmlMessage.split(">")[0];
    9. String xml0 = xmlMessage.substring(0, xml.length()+1);
    10. String xml1 = xmlMessage.substring(xml.length()+1);
    11. StringBuilder res = new StringBuilder();
    12. int lastIdx = 0;
    13. Matcher matchr = pattern.matcher(xml1);
    14. while (matchr.find()) {
    15. String str = matchr.group();
    16. res.append(xml1.substring(lastIdx, matchr.start()));
    17. res.append(str.toUpperCase());
    18. lastIdx = matchr.end();
    19. }
    20. res.append(xml1.substring(lastIdx));
    21. String result = xml0 + res.toString();
    22. return result;
    23. }
             以上就是拼接xml格式报文和解析xml格式报文。需要注意的是,在解析xml格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。

            

  • 相关阅读:
    使用wps跨ubuntu和windows编辑“.doc”文档。报错“编辑受限”,乱码,软件卡死,强制关闭
    【Python】断言功能Assertion
    【Python】hasattr() getattr() setattr() 使用方法详解
    【python】self & cls
    【Python】2.x与3​​.x版本的选用&版本间的区别
    【python】 del 的用法
    【python】参数中的*args和**kwargs
    解方程AX=b与矩阵分解:奇异值分解 特征值分解 QR分解 三角分解 Cholesky分解
    【python】dist-packages和site-packages的区别
    【python】脚本连续发送QQ邮件
  • 原文地址:https://www.cnblogs.com/jpfss/p/9287473.html
Copyright © 2011-2022 走看看