`
xuyiooo
  • 浏览: 75425 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java调用支付平台API -- 遍历Bean生成XML参数

阅读更多
一直也想把自己做过的东西记录下来,可是,一直都忙,没有时间(其实是自己懒,嘿嘿),今天终于下定决心,开始行动,最近刚做一个关于机票电子商务网站,接触到了与支付平台交互的东西,其实,理论上来讲这是个SO EASY的,就是调用支持平台API,然后,传入参数,支付平台返回结果,然后在自己的数据库里一堆Update。其实今天我就想说说,在调用支付平台API时怎么样才能简单方便地传入参数,
    我接触的支付平台,调用API时需要传入XML格式的参数,返回的也是XML格式的数据,参数格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<MasMessage xmlns="http://www.XXX.com/mas_cnp_merchant_interface">
  <version>1.0</version>
  <TxnMsgContent>
    <txnType>PUR</txnType>
    <interactiveStatus>TR1</interactiveStatus>
    <cardNo>XXXXXXXXXXXXX</cardNo>
    <expiredDate>0811</expiredDate>
    <cvv2>123</cvv2>
    <amount>100</amount>
    <merchantId>XXXXXXXXXX</merchantId>
    <terminalId>XXXXX</terminalId>
    <cardHolderName>测试</cardHolderName>
    <cardHolderId>130928198310000004</cardHolderId>
    <entryTime>20090330153345</entryTime>
    <externalRefNumber>PUR_NET985534</externalRefNumber>
    <customerId />
  </TxnMsgContent>
</MasMessage>
上面的内容不必细说,反正就是一堆的参数,我是这样做的组织参数的,首先做一个Bean,Bean的属性是XML中的每个结点名,如下:


public class PURTR1XMLMessage{
  
    //交易类型: PUR=实时消费,PRE=预授权(3位定长字母字符)
    private String txnType;
  
    //消息状态:值为TR1(3位定长字母字符)
    private String interactiveStatus;
  
    //信用卡号(最长19个字节(数字字符))
    private String cardNo;
  
    //卡有效期(4位定长数字字符;格式为MMYY)
    private String expiredDate;
  
    //卡校验码(3位定长数字字符)
    private String cvv2;
  
    //交易金额(最长12位、2位小数点的数字)
    private String amount;
  
    //商务号,此号为测试用(客户端应可配置)
    private String merchantId;
  
    //终端号,此号为测试用(客户端应可配置)(定长8位的字母和数字字符)
    private String terminalId;
  
    //持卡人姓名(最长32个字节(字母和数字字符),可为中文)
    private String cardHolderName;
  
    //持卡人证件号(最长32个字节(字母和数字字符))
    private String cardHolderId;
  
    //客户端交易时间(14位定长的数字字符,格式为yyyyMMddHHmmss)
    private String entryTime;
  
    //应用端订单号(32位数字和字母)
  
    private String externalRefNumber;
  
    //客户号(为空)
    private String customerId ;
  
    public PURTR1XMLMessage() {
    }
    public String getTxnType() {
        return txnType;
    }
  
    public void setTxnType(String txnType) {
        this.txnType = txnType;
    }
  
    public String getInteractiveStatus() {
        return interactiveStatus;
    }
  
    public void setInteractiveStatus(String interactiveStatus) {
        this.interactiveStatus = interactiveStatus;
    }
  
    public String getCardNo() {
        return cardNo;
    }
  
    public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
    }
  
    public String getExpiredDate() {
        return expiredDate;
    }
  
    public void setExpiredDate(String expiredDate) {
        this.expiredDate = expiredDate;
    }
  
    public String getCvv2() {
        return cvv2;
    }
  
    public void setCvv2(String cvv2) {
        this.cvv2 = cvv2;
    }
  
    public String getAmount() {
        return amount;
    }
  
    public void setAmount(String amount) {
        this.amount = amount;
    }
  
    public String getMerchantId() {
        return merchantId;
    }
  
    public void setMerchantId(String merchantId) {
        this.merchantId = merchantId;
    }
  
    public String getTerminalId() {
        return terminalId;
    }
  
    public void setTerminalId(String terminalId) {
        this.terminalId = terminalId;
    }
  
    public String getCardHolderName() {
        return cardHolderName;
    }
  
    public void setCardHolderName(String cardHolderName) {
        this.cardHolderName = cardHolderName;
    }
  
    public String getCardHolderId() {
        return cardHolderId;
    }
  
    public void setCardHolderId(String cardHolderId) {
        this.cardHolderId = cardHolderId;
    }
  
    public String getEntryTime() {
        return entryTime;
    }
  
    public void setEntryTime(String entryTime) {
        this.entryTime = entryTime;
    }
  
    public String getExternalRefNumber() {
        return externalRefNumber;
    }
  
    public void setExternalRefNumber(String externalRefNumber) {
        this.externalRefNumber = externalRefNumber;
    }
  
    public String getCustomerId() {
        return customerId;
    }
  
    public void setCustomerId(String customerId) {
        this.customerId = customerId;
    }
}

然后呢,我又写了一个类,把这个bean变成XML,代码如下:
public class PURModel {
  
    public static String beanToXml(Object bean) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        java.lang.reflect.Field[] flds = bean.getClass().getDeclaredFields();
        String fieldXML = getClassFields(flds, bean);  
        StringBuffer queryXML = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
            "<MasMessage xmlns=\"http://www.XXX.com/mas_cnp_merchant_interface\">"+
            "<version>1.0</version>");
      
        if (bean instanceof PURTR1XMLMessage){
             queryXML.append("<TxnMsgContent>");
             queryXML.append(fieldXML);
             queryXML.append("</TxnMsgContent></MasMessage>");
         }
         else if(bean instanceof PURTR3XMLMessage){
             queryXML.append("<QryTxnMsgContent>");
             queryXML.append(fieldXML);
             queryXML.append("</QryTxnMsgContent></MasMessage>");          
         }
        return queryXML.toString();
    }
    private static String getClassFields(java.lang.reflect.Field[] flds,Object msg) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        String xml = "";
        if(flds != null){
            for(int i = 0;i < flds.length; i++ ){
                String getMethod="get"+  flds[i].getName().substring(0, 1).toUpperCase() + flds[i].getName().substring(1);
                Class[] methodParam = null;
                Object[] params = {};
                Object retValue = null;
                //这里就是调用Bean的get方法,很爽哦,适合写在基类里!!!
                retValue = msg.getClass().getMethod(getMethod, methodParam).invoke(msg, params);
                if(retValue == null){
                    xml = xml+ "<"+flds[i].getName()+"/>";  
                }
                else{
                xml = xml+ "<"+flds[i].getName()+">"+retValue+ "</"+flds[i].getName()+">";
                }
            }
        }
        return xml;
    }
这样只需要把Bean传进来,就可以自动遍历Bean的属性,组织成XML,遍历Bean属性利用了类的反射原理
PS:

getDeclaredFields():   返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组
分享到:
评论

相关推荐

    XMLBean的例子

    - 例如,一个简单的示例可能是创建一个XML文档,通过调用`Document`类的`createInstance()`方法,然后使用XMLBean生成的Java类来设置XML元素和属性。 4. XMLBean的主要功能: - XML到Java对象的映射:XMLBean能...

    jstl-api-1.2.jar

    JSTL,全称为JavaServer Pages Standard Tag Library,是Java EE平台中一个用于简化JSP开发的库,它提供了一系列预定义的标签,帮助开发者在JSP页面上进行数据处理、控制流程、XML操作等任务,从而降低对脚本语言的...

    JAVA_API1.6文档(中文)

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    动态生成Java Bean测试页面

    在生成测试页面时,可以利用反射遍历Bean类的所有属性,为每个属性创建输入字段和提交按钮。 3. **JSP(JavaServer Pages)**:JSP是一种用于创建动态Web内容的技术,可以用于生成HTML页面。在测试页面中,JSP可以...

    java api最新7.0

    JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...

    Java 1.6 API 中文 New

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java ...

    javabean和xml互相转换工具类以及jar包

    - **使用JAXB(Java Architecture for XML Binding)**:JAXB是Java标准API,可以自动将Java对象转换为XML和从XML反序列化为Java对象。只需为JavaBean添加适当的注解,然后使用JAXBContext和Marshaller进行转换。 ...

    java面试知识点总结--EJB.pdf

    ### Java面试知识点总结——EJB详解 #### 一、EJB技术概述 EJB(Enterprise JavaBeans)是一种Java EE标准,用于开发企业级应用程序。它提供了构建可伸缩、健壮且易于维护的企业应用程序的方法。 #### 二、...

    java 解析xml 多级

    首先,Java提供了两种主要的API来处理XML:DOM(文档对象模型)和SAX(简单API for XML)。DOM解析器会将整个XML文件加载到内存中,形成一个树形结构,适合处理小到中等规模的XML文档。而SAX解析器采用事件驱动的...

    使用dom4j将xml字符串转换成Bean对象

    首先,dom4j是一个强大的Java XML API,它提供了丰富的功能,如读取、写入、修改和操作XML文档。其核心概念是Element(元素)、Attribute(属性)和Document(文档)。通过这些对象,我们可以方便地处理XML文档的...

    java面试知识点总结--JSF界面控制层技术.pdf

    - **FacesServlet**:JSF的核心控制器,负责处理HTTP请求,解析请求参数,调用生命周期方法,并生成响应。 - **Lifecycle**:JSF的生命周期包括六个阶段:恢复视图、应用请求值、校验、更新模型、调用应用程序和...

    Java技术面试 ---- 框架.md

    ### Java技术面试 ---- 框架 #### 一、Mybatis #{} 和 ${} 的区别 在 Mybatis 中,#{} 和 ${} 是用来处理 SQL 语句中的动态参数的两种方式。 - **#{}**:这种方式可以有效地避免 SQL 注入问题。它的工作原理是将...

    任意XML转实体类 实体类 转XML 方法 JAVA

    将XML数据转换为Java实体类(Bean)以及将实体类转换回XML是两个重要的操作,这对于数据的序列化和反序列化至关重要。下面将详细解释这两个过程以及涉及的相关知识点。 首先,XML转实体类的过程通常涉及到Java的...

    XML.rar_XML java_java call_java xml_xml 读写_xml读写 java

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在各种软件开发中,特别是在Java平台上。XML的设计目标是传输和存储数据,而非显示数据,因此它与HTML(HyperText Markup Language)有着本质...

    xml与javabean的相互转换

    - 使用JAXB(Java Architecture for XML Binding):JAXB是Java平台的标准API,用于在Java对象和XML之间进行绑定。首先,你需要为JavaBean创建对应的XML Schema(XSD)文件,然后使用JAXB工具自动生成JavaBean类。...

    Spring+iBatis+JDom递归生成XML树

    在IT行业中,构建一个能够递归生成XML树的系统是一项常见的任务,特别是在处理复杂的数据结构时。本项目结合了Spring、iBatis和JDom这三个强大的技术,它们各自扮演着不同的角色来实现这一目标。 首先,Spring是一...

    java和xml相关的技术电子书

    3. Java与XML的结合:Java提供了多种API来处理XML,如DOM(文档对象模型)、SAX(简单API for XML)和DOM4J等。DOM将整个XML文档加载到内存中形成一棵树形结构,适合小规模数据处理;SAX是事件驱动模型,只在解析时...

Global site tag (gtag.js) - Google Analytics