`
xuyiooo
  • 浏览: 72810 次
  • 性别: 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 的数组
分享到:
评论

相关推荐

    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 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 ...

    JavaAPI1.6中文chm文档 part1

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

    JavaAPI中文chm文档 part2

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

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    [Java参考文档].JDK_API 1.6

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

    JAVA上百实例源码以及开源项目源代码

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

    JAVA上百实例源码以及开源项目

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

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包4

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

    java源码包3

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

    java源码包2

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

    [Java参考文档]

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

    JDK_1_6 API

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

Global site tag (gtag.js) - Google Analytics