将 Jpos 请求转换为手动请求

问题描述 投票:0回答:1

我正在向 iso8583 发出 JPOS 请求并使用代码:

String FileParam = "jpos_fields.xml";
    
GenericPackager packager = new GenericPackager(FileParam);

 ISOMsg isoMsg = new ISOMsg();
        isoMsg.setPackager(packager);
               
        isoMsg.setMTI("0800");
isoMsg.set(3, "990000");
        isoMsg.set(7, "0605144125");
        isoMsg.set(11, "000001");
        isoMsg.set(24, "831");
        isoMsg.set(29, "001");
        isoMsg.set(41, "S01JS020");
        isoMsg.set(42, "0187490");

 isoMsg.recalcBitMap();
        BitSet bset = (BitSet) isoMsg.getValue(-1);

 TPDUChannel channel = new TPDUChannel();
        channel.setHost("127.0.0.1");
        channel.setPort(8185);
        channel.setPackager(packager);
        
        byte [] TPDU = new byte [5];

        TPDU [0] = (byte) 0x68; //0800/0810 only
        TPDU [1] = (byte) 0x00;
        TPDU [2] = (byte) 0x03;
        TPDU [3] = (byte) 0x02;
        TPDU [4] = (byte) 0x00;

channel.setTPDU(TPDU);

    //channel.pr
    
    channel.connect();
    channel.send(isoMsg);
    
    ISOMsg r = channel.receive ();
    channel.disconnect ();
    
    BitSet bsetRe = (BitSet) r.getValue(-1);`

和 TPDUChannel 类:

public class TPDUChannel extends ASCIIChannel {
  
    private static byte[] TPDU = new byte[5];
    
    public static void setTPDU(byte[] b) { 
        System.arraycopy(b, 0, TPDU, 0, TPDU.length);
    }
    
    protected void sendMessageLength(int len) throws IOException {
        // write TPDU
        if (TPDU != null) serverOut.write(TPDU);
        //write ASCIIChannel length
        super.sendMessageLength(len);
    }

    protected int getMessageLength()  throws IOException, ISOException {
        // skip header
        if (TPDU != null) {
            byte[] b = new byte[TPDU.length];
            serverIn.readFully(b, 0, TPDU.length);
        }
        // read ASCIIChannel length
        return super.getMessageLength();
    }

}

工作正常,我得到了答案,但需要通过套接字发出手动请求。我知道如何生成 isoMsg 并通过套接字发送,但真的不知道如何设置 TPDU。请帮忙

尝试像 JPOS 一样手动发送套接字请求

emv iso8583 jpos bank
1个回答
0
投票

此消息考虑了 OP 的评论。

要发送 TPDU,您只需使用

NACChannel


在你的代码中,它会是这样的:

String FileParam = "jpos_fields.xml"; GenericPackager packager = new GenericPackager(FileParam); ISOMsg isoMsg = new ISOMsg(); isoMsg.setPackager(packager); isoMsg.setMTI("0800"); isoMsg.set(3, "990000"); isoMsg.set(7, "0605144125"); isoMsg.set(11, "000001"); isoMsg.set(24, "831"); isoMsg.set(29, "001"); isoMsg.set(41, "S01JS020"); isoMsg.set(42, "0187490"); // you don`t need the recalc bitmap, the m.pack will do it for you BaseChannel channel = new NACChannel(); channel.setHost("127.0.0.1"); channel.setPort(8185); channel.setPackager(packager); byte [] TPDU = new byte [5]; TPDU [0] = (byte) 0x68; //0800/0810 only TPDU [1] = (byte) 0x00; TPDU [2] = (byte) 0x03; TPDU [3] = (byte) 0x02; TPDU [4] = (byte) 0x00; channel.setHeader(TPDU);
您甚至可以将主机、端口、打包程序和 tpdu 传递给 

NACChannel

 构造函数:

byte [] TPDU = new byte [5]; ... BaseChannel channel = new NACChannel("127.0.0.1", 8185, packager, TPDU); channel.send(isoMsg); ...
但是,我强烈建议使用 

Q2

 来配置和启动您的通道,因为这样您就可以在 XML 文件中配置通道属性,而不是对其进行硬编码。在调整超时和许多其他 TCP/IP 参数时为您提供更大的灵活性,而无需重新编译,也无需自己实现设置每个参数的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.