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

拼接xml格式报文。

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

StringBuffer soapResultData = new StringBuffer();
//xml声明
soapResultData.append("<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><MSG_HEAD>");
//请求头
soapResultData.append(requesttoxml(msgHead));
soapResultData.append("</MSG_HEAD><MSG_BODY>");
//请求体
soapResultData.append(requesttoxml(resmap));
soapResultData.append("</MSG_BODY></ROOT>");
/**
* 将map转化为XML格式的字符串
* @param resmap
* @return
*/
public static String requesttoxml(Map<String, String> resmap){
StringBuffer soapResultData = new StringBuffer();
for(String key : resmap.keySet()){
soapResultData.append("<");
soapResultData.append(key);
soapResultData.append(">");
soapResultData.append(resmap.get(key));
soapResultData.append("</");
soapResultData.append(key);
soapResultData.append(">");
}
return soapResultData.toString();
}

将接收到的xml格式报文,转换成实体类。

package com.ustcsoft.business.model;
import java.io.Serializable;
import org.apache.commons.digester3.annotations.rules.BeanPropertySetter;
import org.apache.commons.digester3.annotations.rules.ObjectCreate;
@ObjectCreate(pattern = "ROOT/MSG_HEAD")
public class ResponseMsgHead implements Serializable {
/**
*
*/
private static final long serialVersionUID = -2793215313546940251L;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/TRAN_CODE")
private String TRAN_CODE;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/PARTNER_CODE")
private String PARTNER_CODE;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/REQUEST_SERIAL")
private String REQUEST_SERIAL;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_DATE")
private String RESPONSE_DATE;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_TIMESTAMP")
private String RESPONSE_TIMESTAMP;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_CODE")
private String RESULT_CODE;
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_MESSAGE")
private String RESULT_MESSAGE;
//get set 省略,不贴在这儿,自己使用时别忘了生成个set和get方法
}
import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
import org.apache.log4j.Logger;
import com.ustcsoft.business.model.CreditPayResponseBody;;
import com.ustcsoft.business.model.ResponseMsgHead;
import com.ustcsoft.framework.util.HTTPUtil;
import com.ustcsoft.framework.util.XMlUtil;
public class PayService {
private final Map<Class<?>, FromAnnotationsRuleModule> xmlAnnotationModule = new HashMap<Class<?>, FromAnnotationsRuleModule>();
private static final Logger logger=Logger.getLogger(PayService.class);
public PayService() {
xmlAnnotationModule.put(ResponseMsgHead.class,
new FromAnnotationsRuleModule() {
@Override
protected void configureRules() {
bindRulesFrom(ResponseMsgHead.class);
}
});
xmlAnnotationModule.put(CreditPayResponseBody.class,
new FromAnnotationsRuleModule() {
@Override
protected void configureRules() {
bindRulesFrom(CreditPayResponseBody.class);
}
});
}
//中间业务代码省略……
public <T> T parseXml(String xml, Class<T> clazz) throws Exception {
StringReader sr = null;
try {
Digester digester = newLoader(xmlAnnotationModule.get(clazz)).newDigester();
sr = new StringReader(xml);
T pi = digester.parse(sr);
digester.clear();
return pi;
} finally {
if (sr != null) {
sr.close();
}
}
}
}
logger.info("统一下单接口请求报文:"+requestxml);
String resultxml = HTTPUtil.postByHttps(url, requestxml,"GBK");
logger.info("统一下单接口返回报文:"+resultxml);
if(resultxml != null){
resultxml = XMlUtil.xmltoUpperCase(resultxml);//将XML报文中的标签,全部转化为大写
ResponseMsgHead head = parseXml(resultxml, ResponseMsgHead.class);
CreditPayResponseBody body = parseXml(resultxml, CreditPayResponseBody.class);
if (null != head) {
if(head.getRESULT_CODE().equals("000000")){
logger.info("下单成功");
logger.info("返回参数:sub_mch_id="+body.getSUB_MCH_ID()+",total_fee="+body.getTOTAL_FEE()+",out_trade_no="+body.getOUT_TRADE_NO());
return body;
}else{
logger.info("下单失败,错误码:"+head.getRESULT_CODE()+",错误信息:"+head.getRESULT_MESSAGE());
}
}
}
/**
* 将XML报文中的标签,全部转化为大写
* @param xmlMessage
* @return
*/
public static String xmltoUpperCase(String xmlMessage) {
Pattern pattern = Pattern.compile("<.+?>");
String xml = xmlMessage.split(">")[0];
String xml0 = xmlMessage.substring(0, xml.length()+1);
String xml1 = xmlMessage.substring(xml.length()+1);
StringBuilder res = new StringBuilder();
int lastIdx = 0;
Matcher matchr = pattern.matcher(xml1);
while (matchr.find()) {
String str = matchr.group();
res.append(xml1.substring(lastIdx, matchr.start()));
res.append(str.toUpperCase());
lastIdx = matchr.end();
}
res.append(xml1.substring(lastIdx));
String result = xml0 + res.toString();
return result;
}

以上就是拼接xml格式报文和解析xml格式报文。需要注意的是,在解析xml格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。

xml格式报文的拼装,和解析成实体类相关推荐

  1. Flutter Json对象和数组解析成实体类

    1.解析json对象: 准备一个json 对象数据: String json="{"res": true, "age": 12, "Name ...

  2. [Android]【安卓】Json数据的快速拼装和解析

    [Android][安卓]Json数据的快速拼装和解析 本篇博客已收录到我的安卓开发小结中--点击[安卓开发小结] 参考资料:介绍 Json 一.什么是Json数据 JSON(JavaScript O ...

  3. java json插件安装_IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体...

    前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...

  4. 实现迷你解析器把字符串解析成NestInteger类 Mini Parser

    为什么80%的码农都做不了架构师?>>>    问题: Given a nested list of integers represented as a string, implem ...

  5. Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类

    场景 需要在Winform的页面初始化之后,调用http的接口,并将返回的json数据 解析,赋值到窗体中的TextBox组件中. 使用接口测试工具测试的接口返回数据如下 注: 博客: 霸道流氓气质的 ...

  6. HTTP post 请求携带xml格式报文请求接口

    欢迎关注微信公众号:程序员小圈圈 转载请标明出处^_^ 原文首发于:www.zhangruibin.com 本文出自于:RebornChang的博客 厚颜打广告,博主个人博客地址传送门 ,欢迎来访 请 ...

  7. XML格式文件详解及Java解析XML文件内容方法

    XML格式文件详解 1.概述 XML,即可扩展标记语言,XML是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者. ...

  8. HTTP返回soapxml解析为实体类

    1.HTTP返回单 xml文件 <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> ...

  9. 9.动态生成实体类,根据XML模板使用Emit生成动态类绑定到DataGrid

    在实际项目中,我们可能会遇到用户自定义XML模板字段,根据这个模板上的字段来显示相应的字段的值到DataGrid.在这种情况下,需要使用 XmlReader解析获取这个用户自定义的XML模板上有哪些字 ...

最新文章

  1. 2021年大数据Flink(二十一):​​​​​​​案例三 会话窗口
  2. 关于网络连接方式的总结(HostOnly,NAT....)
  3. Python基础教程:列表、字典、集合推导式
  4. HDU - 4569 Special equations(同余模定理)
  5. poj-1659-Frogs Neighborhood-(图论-是否可图)
  6. 信息学奥赛一本通 1075:药房管理 | OpenJudge NOI 1.5 23:药房管理
  7. 计算机网络中什么叫总衰耗_计算机网络中的“带宽”,为什么是指“在单位时间内...
  8. 使用RedisTemplate实现Redis分布式锁出现的一些列问题(避坑)
  9. linux下安装apache + subversionSVN_Subversion
  10. Bailian2758 菲波那契数列(2)【递推】
  11. C#枚举中使用Flags特性
  12. LinkButton回发报错__doPostBack('……','') 缺少对象
  13. 轻量级自动化测试框架 UFT 初学者 学习编写
  14. 韩国顶级舞台剧《爱上街舞少年的芭蕾少女》掀起街舞狂潮
  15. 用友把工业互联网说透了
  16. java 并发编程学习之二 ---- lock
  17. Vue全家桶:Vuex
  18. 0204原来“瘦胖子”比“真胖子”更危险
  19. 基于网页网站在线视频点播系统 毕业设计毕设源码毕业论文开题报告参考(1)功能概要
  20. 微信GIF图保存到本地的方法

热门文章

  1. python打包exe有什么用_Python 打包exe
  2. 学习JavaScript数据结构与算法-----pdf 分享
  3. DataFrame列转json以及json转DataFrame列
  4. Tomcat + hexo 搭建博客
  5. 智能一代云平台(八):代码依赖分析系统
  6. 等级考试(四):二级C++---回首往昔考试历程
  7. 吴恩达CS 230深度学习课开学了!秋季视频全部上线,课件小抄应有尽有
  8. AI人才平均月薪3万,最赚钱岗位出炉;上海人才吸引力跌至第四
  9. 华为发布AI时代数据中心交换机:让网络瓶颈不再是束缚,AI算力提升一倍
  10. 腾讯王者荣耀AI论文首次曝光:五AI王者局开黑与人类战队打成平手