0100 授权类请求消息(授权、撤消授权。余额查询等)
0110 授权类应答消息(授权、撤消授权。余额查询等)
[@more@]2、位图表BITMAP就是对消息报文格式的描述,每一位用“0”或“1”来表示与该位对应的数据元不存在或存在,用来对其后的数据元进行索引。位图表的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。对于授权/撤消授权类交易只使用基本位图,因此位图表第一位设为0。授权/撤消授权类交易的BITMAP常数如表二所示:
消 息 名 称 | 数 据 元 位(BIT) 号 | BITMAP 常 数 |
POS 授 权 请 求 消 息 | 2,3,4,7,22,26,35,36,37,41, 42,43,49,52,60,61,64 | 7200 0440 38E0 9019 |
POS 授 权 应 答 消 息 | 2,3,4,7,11,15,22,37,38,39,41,42,43,,49, 54,60,63,64 | 7222 0400 0EE0 8413 |
POS 撤 消 授 权 请 求 消 息 | 2,3,4,7,22,26,35,36,37, 41,42,43,49,52,60,61,64 | 7200 0440 38E0 9019 |
POS 撤 消 授 权 应 答 消 息 | 2,3,4,7,11,15,22,37,38,39,41,42,43,49,60,62,63,64 | 7222 0400 0EE0 8013 |
表二 授权/撤消授权类交易的BITMAP常数表
为尽量减少传送消息的长度,提高通信效率。位号为26、35、36、52 和 61的数据元仅在请求消息中出现,在 应答 消 息 中 将 不 出 现。 而位号为11、15、38、39、63 的数据元仅在应答消息中出现,在请求消息中将不出现。
3、在银行卡交换中心和卡终端之间的消息交换中,ISO8583标准定义的数据元有以下基本类型:
A 字母,左靠,右部多余部分填空格
B 二进制位
DD 日
hh 时
LL 可变长域的长度值(二位数)
LLL 可变长域的长度值(三位数)
MM 月
mm 分
N 数值,右靠,首位有效数字前充零。若表示金额,则最右二位为角分
S 特殊符号
ss 秒
X 借贷符号,在数值之前,D表示借记,C表示贷记
YY 年
ISO8583的标准文献中有对于关这些数据元更详细的描述,并且在应用中可对基本数据类型进行任意组合构造出新的数据类型,如:
AN 字母和/或数字,左靠,右部多余部分填空格
ANS字母、数字和/或特殊符号,左靠,右部多余部分填空格
AS 字母和/或特殊符号,左靠,右部多余部分填空格
三、ISO8583标准的程序实现
1、数据元类型
根据ISO8583标准规定,我们用类ISO_8583用来描述一个数据元的属性:
class ISO_8583{ // ISO8583数据元定义
private:
char data_name; // 数据元名
int len; // 最大长度或固定长度
unsigned char type; // 数据类型 bit 0: C/D 数据域
// bit 1:数值数据域
// bit 2: track2/track3 数据域
// bit 3: BIN数据域
unsigned char flag; // 长度类型 0:固定长度
// 1:可变长度 (00--99),
// 2:可变长度 (00--999);
friend class ISO_8583_message;
public:
ISO_8583()
}
然后,用类ISO_8583来构造一个对象数组ISO8583[128]作为数据元素描述表作为打包和解包的依据。ISO8583[128]中的每一个数组元素描述了一个数据元的属性,例如:
ISO8583[1]={“PRIMARY-ACCOUNT-NUMBER”,19,2,1}
ISO8583[2]={“PROCESSING-CODE”,6,2,0}
上面的定义说明,在ISO8583数据元素描述表中,第二个数据元为用户主帐号、最大长度19位、数值类型、可变长度,第三个数据元为交易类型码、长度为6、数值类型、固定长度。
2、数据元定义
对数据元类型进行描述之后,需要对数据元进行定义。为了实现通用的打包/解包接口, 在对数据元进行定义时需要一种通用的数据元类型, 这种类型应涵盖ISO8583标准中128个数据元所有可能出现的各种类型:
class data_element_flag{
int bitf;
int len;
int dbuf_addr;
}
class ISO_8583_data{
private:
int off; //数据指针
data_element_flag f[128];
char message_id[8]; //消息类型标识符
char dbuf[512];
public:
ISO_8583_data();
ISO_8583_data(const ISO_8583_data &);
~ISO_8583_data();
asc_to_bcd(int);
bcd_to_asc(int);
}
为提高线路上数据的传输效率,规定在上送的消息包中,数据类型为“N”的域一律采用BCD码压缩,不足位数右补零处理。
3、消息处理
对消息的主要处理是:提供ISO8583的打包和解释报文的函数功能,不同的银行可以定义不同的交易报文格式。类ISO_8583_MESSAGE实现了消息处理,简化了ISO8583消息操作的复杂性,为应用提供了一个通用的打包和解包的接口。解包和打包处理在程序实现中类似于两个互逆的操作过程。在解包时进行如下处理:首先进行预处理,即将收到的消息中的报文类型标识符和位图表去掉,其余部分作为一个原封不动的字符串保留在dstr中,并不进行继续解包。而实际上当某个应用需要对数据元进行具体访问时,真正的解包操作才发生,并且处理函数只为该应用解释它要访问的那个位域。
class ISO_8583_message{
private:
union{
ISO_8583_data *iso; //存放要打包的数据
unsigned char *dstr; //存放解包的数据
}
static int index;
public:
ISO_8583_message();
~ ISO_8583_message();
int strtoiso(int); //初始化接收报文
int isotostr(unsigned char); //初始化发送报文
void pack8583();
void unpack8583();
const ISO_8583_data &operator[](int ); //读取ISO8583数据元
ISO_8583_data &operator()(int ); // 设置ISO8583位域
void clearbit();
}
为了应用方便,在ISO_8583_message的成员函数(具体实现程序略)中,重载了 []和()运算符,这两个运算符用以对对数据元进行访问,其参数为ISO8583报文中的位域号。当需要设置数据元时,可使用()加下标的方法作为左值来设置一个数据元;当需要读取数据元时,可使用[]加下标的方法作为右值来取值。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/61327/viewspace-822843/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/61327/viewspace-822843/