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

本文介绍了一种将Java Bean转换为XML格式的方法,用于支付平台API调用时的参数传递。通过创建特定的Bean来封装参数,并使用反射机制自动生成XML字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直也想把自己做过的东西记录下来,可是,一直都忙,没有时间(其实是自己懒,嘿嘿),今天终于下定决心,开始行动,最近刚做一个关于机票电子商务网站,接触到了与支付平台交互的东西,其实,理论上来讲这是个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属性利用了类的反射原理
getDeclaredFields():

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值