博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ISO8583接口的详细资料
阅读量:5727 次
发布时间:2019-06-18

本文共 33331 字,大约阅读时间需要 111 分钟。

ISO8583包(简称8583包)是一个国际标准的包格式,最多由128个字段域组成,每个域都有统一的规定,并有定长与变长之分。

      8583包前面一段为位图,用来确定包的字段域组成情况。  
      其中位图是8583包的灵魂,它是打包解包确定字段域的关键, 而了解每个字段域的属性则是填写数据的基础。  

1、 位图描述如下:   

位图位置:1  
格式:定长  
类型:B16(二进制16位,16*8=128bit)  
描述:  
    如将位图的第一位设为'1',表示使用扩展位图(128个域),否则表示只使用基本位图(64个域)。  
    如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。  
选用条件:如使用65到128域,需设位图域第一位为'1'  

2、每个域的定义如下:  

typedef struct ISO8583  
{  
     int bit_flag; /*域数据类型0 -- string, 1 -- int, 2 -- binary*/  
     char *data_name; /*域名*/  
     int length; /*数据域长度*/  
     int length_in_byte;/*实际长度(如果是变长)*/  
     int variable_flag; /*是否变长标志0:否 2:2位变长, 3:3位变长*/  
     int datatyp; /*0 -- string, 1 -- int, 2 -- binary*/  
     char *data; /*存放具体值*/  
     int attribute; /*保留*/  
} ISO8583;

ISO8583 Tbl8583[128] =  
{  
/* FLD 1 */ {0,"BIT MAP,EXTENDED ", 8, 0, 0, 2, NULL,0},  
/* FLD 2 */ {0,"PRIMARY ACCOUNT NUMBER ", 22, 0, 2, 0, NULL,0},  
/* FLD 3 */ {0,"PROCESSING CODE ", 6, 0, 0, 0, NULL,0},  
/* FLD 4 */ {0,"AMOUNT, TRANSACTION ", 12, 0, 0, 1, NULL,0},  
/* FLD 5 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},  
/* FLD 6 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},  
/* FLD 7 */ {0,"TRANSACTION DATE AND TIME ", 10, 0, 0, 0, NULL,0},  
/* FLD 8 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},  
/* FLD 9 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},  
/* FLD 10 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},  
/* FLD 11 */ {0,"SYSTEM TRACE AUDIT NUMBER ", 6, 0, 0, 1, NULL,0},  
/* FLD 12 */ {0,"TIME, LOCAL TRANSACTION ", 6, 0, 0, 0, NULL,0},  
/* FLD 13 */ {0,"DATE, LOCAL TRANSACTION ", 4, 0, 0, 0, NULL,0},  
/* FLD 14 */ {0,"DATE, EXPIRATION ", 4, 0, 0, 0, NULL,0},  
/* FLD 15 */ {0,"DATE, SETTLEMENT ", 4, 0, 0, 0, NULL,0},  
/* FLD 16 */ {0,"NO USE ", 4, 0, 0, 0, NULL,0},  
/* FLD 17 */ {0,"DATE, CAPTURE ", 4, 0, 0, 0, NULL,0},  
/* FLD 18 */ {0,"MERCHANT'S TYPE ", 4, 0, 0, 0, NULL,0},  
/* FLD 19 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 20 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 21 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 22 */ {0,"POINT OF SERVICE ENTRY MODE ", 3, 0, 0, 0, NULL,0},  
/* FLD 23 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 24 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 25 */ {0,"POINT OF SERVICE CONDITION CODE ", 2, 0, 0, 0, NULL,0},  
/* FLD 26 */ {0,"NO USE ", 2, 0, 0, 0, NULL,0},  
/* FLD 27 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},  
/* FLD 28 */ {0,"field27 ", 6, 0, 0, 0, NULL,0},  
/* FLD 29 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},  
/* FLD 30 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},  
/* FLD 31 */ {0,"NO USE ", 8, 0, 1, 0, NULL,0},  
/* FLD 32 */ {0,"ACQUIRER INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,0},  
/* FLD 33 */ {0,"FORWARDING INSTITUTION ID. CODE ", 11, 0, 2, 0, NULL,0},  
/* FLD 34 */ {0,"NO USE ", 28, 0, 2, 0, NULL,0},  
/* FLD 35 */ {0,"TRACK 2 DATA ", 37, 0, 2, 0, NULL,0},  
/* FLD 36 */ {0,"TRACK 3 DATA ",104, 0, 3, 0, NULL,0},  
/* FLD 37 */ {0,"RETRIEVAL REFERENCE NUMBER ", 12, 0, 0, 0, NULL,0},  
/* FLD 38 */ {0,"AUTH. IDENTIFICATION RESPONSE ", 6, 0, 0, 0, NULL,0},  
/* FLD 39 */ {0,"RESPONSE CODE ", 2, 0, 0, 0, NULL,0},  
/* FLD 40 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 41 */ {0,"CARD ACCEPTOR TERMINAL ID. ", 8, 0, 0, 0, NULL,0},  
/* FLD 42 */ {0,"CARD ACCEPTOR IDENTIFICATION CODE ", 15, 0, 0, 0, NULL,0},  
/* FLD 43 */ {0,"CARD ACCEPTOR NAME LOCATION ", 40, 0, 0, 0, NULL,0},  
/* FLD 44 */ {0,"ADDITIONAL RESPONSE DATA ", 25, 0, 2, 0, NULL,0},  
/* FLD 45 */ {0,"NO USE ", 76, 0, 2, 0, NULL,0},  
/* FLD 46 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 47 */ {0,"field47 ",999, 0, 3, 0, NULL,0},  
/* FLD 48 */ {0,"ADDITIONAL DATA --- PRIVATE ",999, 0, 3, 0, NULL,0},  
/* FLD 49 */ {0,"CURRENCY CODE,TRANSACTION ", 3, 0, 0, 0, NULL,0},  
/* FLD 50 */ {0,"CURRENCY CODE,SETTLEMENT ", 3, 0, 0, 0, NULL,0},  
/* FLD 51 */ {0,"NO USE ", 3, 0, 0, 0, NULL,0},  
/* FLD 52 */ {0,"PERSONAL IDENTIFICATION NUMBER DATA ", 8, 0, 0, 2, NULL,0},  
/* FLD 53 */ {0,"SECURITY RELATED CONTROL INformATION", 16, 0, 0, 0, NULL,0},  
/* FLD 54 */ {0,"ADDITIONAL AMOUNTS ",120, 0, 3, 0, NULL,0},  
/* FLD 55 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 56 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 57 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 58 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 59 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 60 */ {0,"NO USE ", 5, 0, 3, 0, NULL,0},  
/* FLD 61 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 62 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},  
/* FLD 63 */ {0,"NO USE ", 11, 0, 3, 0, NULL,0},  
/* FLD 64 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},  
/* FLD 65 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 66 */ {0,"NO USE ", 1, 0, 0, 0, NULL,0},  
/* FLD 67 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 68 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 69 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 70 */ {0,"SYSTEM MANAGEMENT INformATION CODE ", 3, 0, 0, 0, NULL,0},  
/* FLD 71 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 72 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 73 */ {0,"NO USE ", 6, 0, 0, 0, NULL,0},  
/* FLD 74 */ {0,"NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},  
/* FLD 75 */ {0,"REVERSAL NUMBER OF CREDITS ", 10, 0, 0, 0, NULL,0},  
/* FLD 76 */ {0,"NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},  
/* FLD 77 */ {0,"REVERSAL NUMBER OF DEBITS ", 10, 0, 0, 0, NULL,0},  
/* FLD 78 */ {0,"NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},  
/* FLD 79 */ {0,"REVERSAL NUMBER OF TRANSFER ", 10, 0, 0, 0, NULL,0},  
/* FLD 80 */ {0,"NUMBER OF INQUIRS ", 10, 0, 0, 0, NULL,0},  
/* FLD 81 */ {0,"AUTHORIZATION NUMBER ", 10, 0, 0, 0, NULL,0},  
/* FLD 82 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},  
/* FLD 83 */ {0,"CREDITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0},  
/* FLD 84 */ {0,"NO USE ", 12, 0, 0, 0, NULL,0},  
/* FLD 85 */ {0,"DEBITS,TRANSCATION FEEAMOUNT ", 12, 0, 0, 0, NULL,0},  
/* FLD 86 */ {0,"AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},  
/* FLD 87 */ {0,"REVERSAL AMOUNT OF CREDITS ", 16, 0, 0, 0, NULL,0},  
/* FLD 88 */ {0,"AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},  
/* FLD 89 */ {0,"REVERSAL AMOUNT OF DEBITS ", 16, 0, 0, 0, NULL,0},  
/* FLD 90 */ {0,"ORIGINAL DATA ELEMENTS ", 42, 0, 0, 0, NULL,0},  
/* FLD 91 */ {0,"FILE UPDATE CODE ", 1, 0, 0, 0, NULL,0},  
/* FLD 92 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 93 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 94 */ {0,"SERVICE INDICATOR ", 7, 0, 0, 0, NULL,0},  
/* FLD 95 */ {0,"REPLACEMENT AMOUNTS ", 42, 0, 0, 0, NULL,0},  
/* FLD 96 */ {0,"NO USE ", 8, 0, 0, 0, NULL,0},  
/* FLD 97 */ {0,"AMOUNT OF NET SETTLEMENT ", 16, 0, 0, 0, NULL,0},  
/* FLD 98 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 99 */ {0,"SETTLEMENT INSTITUTION ID ", 11, 0, 2, 0, NULL,0},  
/* FLD 100 */ {0,"RECVEING INSTITUTION ID ", 11, 0, 2, 0, NULL,0},  
/* FLD 101 */ {0,"FILENAME ", 17, 0, 2, 0, NULL,0},  
/* FLD 102 */ {0,"ACCOUNT IDENTIFICATION1 ", 28, 0, 2, 0, NULL,0},  
/* FLD 103 */ {0,"ACCOUNT IDENTIFICATION2 ", 28, 0, 2, 0, NULL,0},  
/* FLD 104 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 105 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 106 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 107 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 108 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 109 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 110 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 111 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 112 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 113 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 114 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 115 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 116 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 117 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 118 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 119 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 120 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 121 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 122 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 123 */ {0,"NEW PIN DATA ", 8, 0, 3, 2, NULL,0},  
/* FLD 124 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 125 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 126 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 127 */ {0,"NO USE ",999, 0, 3, 0, NULL,0},  
/* FLD 128 */ {0,"MESSAGE AUTHENTICATION CODE FIELD ", 8, 0, 0, 2, NULL,0},  
}; 

3、变长,定长域说明  
如第二域:域名为主帐号,  
数据类型为string  
长度为22(是长长度不得超过此数)  
是个2位变长域  
由于是2位变长,在打包时需在数据域前加上数据的实际长度,如为19位,则表示为:  
19+数据值(即前两位为长度)  
如第三域:域名为处理码,  
数据类型为string  
长度为6  
是个定长域  
必须填满6位。  

 

附A:ISO8583各域段的说明  

1,信息类型(message type)定义  
位图位置:-  
格式:定长  
类型:N4  
描述:  
数据包的第一部分,定义数据包的类型。  
数据类型由数据包的发起者设定,应遵循以下要求:  
数据包开始部分必须是信息类型;  
对不支持的信息类型能给出拒绝应答。  
0100授权交易  
0110授权交易答复  
0200金融交易  
0210金融交易答复  
0240查询交易  
0250查询交易答复  
0400冲正交易  
0410冲正交易答复  
0800管理交易  
0810管理交易答复  
2,位图(Bit Map) - 基本位图和扩展位图  
位图位置:1  
格式:定长  
类型:B16  
描述:  
如将位图的第一位设为'1',表示使用扩展位图,否则表示只使用基本位图。  
如使用某数据域,应在位图中将相应的位设位'1',如使用41域,需将位图的41位设为'1'。  
选用条件:如使用65到128域,需设位图域为'1'  
3、Bit02主帐号(Primary Account Number)

位图位置:02  

格式:变长,LLVAR  
类型:N..22  
描述:  
唯一的确认一个用户交易的基本帐号。  
由于银行电子服务系统涉及多个应用系统,而帐号长度最多为22位,故将原标准的19长度改为22位。  
4、Bit03 处理代码 (Processing Code)  
位图位置:03  
格式:定长  
类型:N6  
描述:用于描述交易对客户帐户造成何种影响的代码。  
处理代码和信息码一起可唯一定义一种交易的类型。  
处理代码由以下三部分组成:  
位置描述  
1-2交易动作码  
3-4付出帐户类型,用于借记类,如查询、代收费、转场交易。  
5-6收入帐户类型,用于代收费、转帐等。  
其中:  
ff : 付出帐户  
tt: 收入帐户  
* 视主机而定  
5,Bit04 交易金额 (Amount, Transaction)  
位图位置:04  
格式:定长  
类型:N12  
描述:帐户人要求交易的交易金额,不含任何处理和交易费用。  
金额的表示和货币代码有关,应能表示相应货币的最小单位。参ISO4217有关货币代码定义。  
如“000000000100”用于表示美元,表示1.00元;如用于表示意大利货币,则表示100里拉。  
对于查询等交易,应设交易金额为“000000000000”。  
6,Bit06交易日期和时间(Transmission Date and Time)  
位图位置:07  
格式:定长,MMDDhhmmss  
类型:N10  
描述:本地交易日期和时间  
7,Bit11系统跟踪号(Systems Trace Audit Number)  
位图位置:11  
格式:定长  
类型:N6  
描述:终端交易的跟踪号码。  
交易发起终端填写,和“交易日期、时间”、信息类型等合在一起可唯一定义某一个终端的唯一一笔交易。即是说,在同一天,对一终端,同一类交易的系统跟踪号应保证不同。系统跟踪号在交易过程中不能修改。使用此域来匹配请求和通知类交易的返回。  
应用系统使用此域来检查收到的授权、金融、自动冲正、结算、管理和网管等类交易的应答包是否是其请求包的应答。  
系统跟踪号不用于匹配自动冲正交易,也不用于在预授权消费时匹配前面的预授权交易。参90域。  
对于银行电子服务系统,其系统跟踪号是交易流水号。  
8,Bit12本地交易时间(Time ,Local Transaction)  
位图位置:12  
格式:定长,hhmmss  
类型:N6  
描述:交易在终端上发生的时间。  
本地交易时间在交易处理过程中不能改变。在自动冲正,存贮转发时,本地交易时间不能改变。  
9,Bit13本地交易日期(Date ,Local Transaction)  
位图位置:13  
格式:定长,MMDD  
类型:N4  
描述:交易在终端上发生的时间。  
本地交易时间不能改变,在自动冲正、存储转发交易时,本地交易时间也不能改变。  
10,Bit14有效期(Date ,Expiration)   
位图位置:14  
格式:定长,YYMM  
类型:N4  
描述:卡的有效期,年年月月  
由于卡类写磁格式不同,收单行可能提不出卡的有效期,授权机构从卡的二磁道中提取卡的有效期。如卡无二磁道,收单行应要求手工录入卡的有效期。  
选用条件:100、200、400等交易如没有2、3磁道时,一定要有此域。  
11,Bit15结算日期(Date ,Settlement)  
位图位置:15  
格式:定长,MMDD  
类型:N4  
描述:  
银行电子服务系统和主机结算的时间,格式月月日日。  
结帐日期前发生的交易参加当天结算。  
在结算时,结帐日期也用于计算处理、交易费用。  
12,Bit17获取日期(Date ,Capture)  
位图位置:17  
格式:定长,MMDD  
类型:N4  
描述:从主机获取交易的记帐日期。通常用于主机和商户清算。  
13,Bit18商户类型(Merchant's Type)  
位图位置:18  
格式:定长  
类型:N4  
描述:定义商户产品和服务类型的代码  
商户类型用于金融、授权交易,用于指定服务点的类型。它主要有以下用途:  
决定预授权交易得到确认的最长时间;  
控制合法限额;  
为交易授权处理,控制网络操作规则;  
欺诈检测;  
用于商户分类报表;  
交易费用处理。  
根据ISO8583标准,应使用相应的国家标准。  
商户类型代码表如下:  
商户类型代码行业类型说明  
4215邮递服务  
4511民航  
4722旅游  
4782过桥费  
4789其他运输服务  
4614电信服务  
5542加油站  
5812餐馆  
5999购物  
6010金融机构-人工现金支付  
6011金融机构-自动现金支付  
6012金融机构-各类服务  
7011酒店、旅馆  
7299各类个人服务:洗衣、美容、  
7399各类商业服务:停车场、租车、广告、其他服务  
7699各类维修服务:维修、洗车、拖车  
7996娱乐:电影、剧院、体育、游戏  
8099医疗服务  
8111法律服务  
8999各类专业服务:会计、教育、装修、工程  
选用条件:服务点终端发起的交易一定要有此域。  
14,Bit22服务点输入方式(Point-of-Service Entry Mode)  
位图位置:22  
格式:定长  
类型:N3  
描述:在服务终端上定义PIN和PAN的输入方式。  
服务点输入方式包含以下两个方面组合而成:  
位置描述   
1-2在服务终端上PAN有效期输入方式  
3-3在服务终端上PIN的输入方式  
PAN的输入方式编码如下:   
PAN输入方式描述  
00不知  
01手工  
02读磁卡  
03条码扫描仪(BAR)  
04光学符号阅读器(OCR)  
05集成电路卡(IC卡)  
PIN的输入方式编码如下 :  
PIN输入方式描述  
0不知  
1终端能接收PIN  
2终端不能接收PIN  
选用条件:服务点终端发起的交易一定要有此域。  
15,Bit25服务点类型代码(Point-of-Service Condition Code)   
位图位置:25  
格式:定长  
类型:N2  
描述:定义交易发生的服务点类型  
用法说明:下面是CYBERBANK支持的服务点条件代码。  
服务点条件代码服务点终端类型  
2自动柜员机(ATM)  
10银行终端(10)  
14POS  
20电话银行  
16,Bit32收单机构标识码(Acquirer institution Identification)  
位图位置:32  
格式:LLVAR  
类型:N..11  
描述:在金融交易中此域表示交易发生的银行机构的标识码  
应答数据包必须和请求数据包此域相同。  
17,Bit3向前机构标识码 (Forwarding Institution Identification Code)  
位图位置:33  
格式:LLVAR  
类型:N..11  
描述:在金融交易中此域表示帐户所在的银行机构的标识码  
在网管交易800/810中,本域含有交易发起机构的代码。  
应答数据包必须和请求数据包此域相同。  
18,Bit35二磁道数据(Track 2 Data)  
位图位置:35  
格式:LLVAR  
类型:Z..37  
描述:写在卡二磁道的数据。数据组成遵循ISO7811-1985标准,数据中包含域分隔符,但不包含卡启始、结束符、LRC等。  
收卡行应检测卡的二磁道是否符合国际标准。  
为支持国际交换收单行应将二磁道中的分隔符换为“=”。除此外不能对二磁道数据进行任何修改,如修改PAN的校验字、有效期、服务码等。  
19,Bit36三磁道数据(Track 3 Data)  
位图位置:36  
格式:LLLVAR  
类型:Z...104  
描述:写在卡三磁道的数据。数据应组成遵循ISO4909标准,数据中包含域分隔符,但不包含卡启始、结束符、LRC等。  
注意:长度说明为3位数字长。  
20,Bit37检索索引号(Retrieval Reference Number)  
位图位置:37  
格式:定长  
类型:AN12  
描述:检索索引号用来在任何时间标识一个金融、授权、自动冲正交易。   
检索索引号不要求打印在持卡人的帐单上。它的主要目的是在收单行和授权行之间定义一个数据项用于跟踪和检索交易。授权机构可以将检索索引号打印在客户的对帐单上。  
检索索引号由收单行分配。  
选用条件:可包含在收单机构的交易请求中。如在交易请求中有,则应答数据中一定应原样返回。  
21,Bit38授权码(Authorization Identification)  
位图位置:38  
格式:定长  
类型:AN6  
描述:交易授权机构返回的返回代码 。  
授权码用于在服务点终端上信用卡授权;  
授权机构按网络操作规定,可选使用本域。  
22,Bit39返回码(Response Code)  
位图位置:39  
格式:定长  
类型:AN2  
描述:对一交易定义其处理结果的编码。  
返回码用于说明授权机构对金融(授权)交易的处理状态;也用来指明自动冲正交易的冲正原因;还用来指出目标主机已接收到文件修改、结算、管理、网管等交易请求 。  
返回码应尽可能准确,应尽可能描述清楚所遇到的问题和状态。网络交换主机、收单行主机有可能会按不同的返回码收取不同的交易处理费用,并执行不同的处理过程。  
23,Bit41收卡单位终端标识码(Card Acceptor Terminal Identification)  
位图位置:41  
格式:定长  
类型:ANS8  
描述:定义在收单单位中定义一个服务终端的标识码,在同一商户中服务终端标识码应唯一。 
24,Bit42收卡商户定义码(Card Acceptor Identification Code)  
位图位置:42  
格式:定长  
类型:ANS15  
描述:在本地和网络中定义交易单位(商户)的编码。  
25,Bit43收卡商户位置(Card Acceptor Location)  
位图位置:43  
格式:定长  
类型:ANS40  
描述:在本地和网络中定义收卡单位(商户)的国家、省。城市等。  
选用条件:如对外卡网络,一定要包含此域。  
26,Bit44附加返回数据(Additional ResponseData)  
位图位置:44  
格式:LLVAR  
类型:ANS..25  
描述:在金融(授权)交易中授权机构返回的其他信息。  
27,Bit48附加数据-私用(Additional Data-Private)  
位图位置:48  
格式:LLLVAR  
类型:ANS...999  
描述:银行电子服务系统使用此域作以下用途:  
存放批量查询的返回数据  
其格式与输出格式表对应  
28,Bit49交易货币代码(Currency Code,Transaction)  
位图位置:49  
格式:定长  
类型:AN3  
描述:按ISO4217定义的交易货币代码,用来表示“交易金额”(field04)所用的货币种类。 
交易货币代码是指在收单单位进行交易所用的交易种类 。  
29,Bit50结算货币代码(Currency Code,Settlement)   
位图位置:50  
格式:定长  
类型:AN3  
描述:按ISO4217定义的结算货币代码,用来表示结算金额、结算处理费、结算交易费等所用的货币种类。  
结算货币代码是指在进行结算和清算过程中所用的货币种类 。  
30,Bit52用户密码(PIN)数据(PIN Data)  
位图位置:52  
格式:定长  
类型:B16  
描述:用户在服务终端上交易用于识别用户合法性的一些数字。  
PIN在分行主机用分行主机密钥按ANSIX9.8标准加密,形成密文块。  
选用条件:如果在终端上输入了密码,就需要此域。  
31,Bit53密码相关控制信息(Security Related Control)  
位图位置:53  
格式:定长  
类型:AN16  
描述:本域提供有关密码块的附加信息,用于指出用于PIN计算的PIN key,用于MAC计算的MAC key。  
本域格式如下表所示:  
0-1格式代码2N“20”  
2-3PIN加密算法2N“01”:DES  
4-5密文块格式2N“01”:ANSI  
6PIN密钥索引1N‘1’或‘2’  
7MAC密钥索引1N‘1’或‘2’  
8-11MAC检查数据4B  
12-15填充4N  
在BOC信用卡网络中PIN和MAC各使用两个密钥---'1'号和'2'密钥,交易中计算PIN和MAC时只能各用某一个KEY,同时需将所用的KEY索引号填写此域。  
选用条件:如果有PIN域或MAC域,一定需有此域。   
32,Bit54附加金额(Additional Amounts)  
位图位置:54  
格式:LLLVAR  
类型:ANS...120  
描述:此域由授权行主机将客户的余额 返回给收单终端,以显示或打印在客户回单上。  
在此域中最多可有6个余额返回,每个余额返回格式如下:  
位置描述  
0-1处理码3-4或5-6位定义的帐号类型  
2-3金额类型:01-帐户金额  
02-可用金额  
03-拥有金额  
04-应付金额  
40-可用取款限额  
56-可用转帐限额  
4-6金额的货币代码  
7‘D’-借记金额,’C’-贷记金额  
8-19余额数目  
六个余额中必须返回可用余额,在ATM、POS上显示可用余额  
33,Bit64信息确认码(MAC)  
位图位置:64  
格式:定长  
类型:B16  
描述:数据包的最后一个域,用于验证信息来源的合法性,以及数据包中数据是否未被篡改 。  
MAC的计算参ANSIX.99,(最后八字节未满八位者左补零,右补零?)  
为提高效率,在发送者和接收者之间,只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域,它们将参加MAC的计算。  
位图域名  
2基本帐号  
3处理代码  
4交易金额  
11系统跟踪号  
12本地交易时间  
13本地交易日期  
32收单机构代码  
38授权码  
39返回码  
41收单终端代码  
49交易货币代码  
95替换金额  
选用条件:只使用了1-64域的数据包使用此域。  
34,Bit70管理信息码(System Management Indormation Code)  
位图位置:70  
格式:定长  
类型:N3  
描述:  
用于定义和维护银行电子服务系统内部通讯网络状态和应用工作状态。  
网络管理信息代码用于管理清算日期"cutoff",通讯"sign on/sign off","key exchange"等。  
支持以下一些网络管理信息码  
NMIC网络管理信息码动作  
001签到(Sign on)  
002签退(Sign off)  
101交换密钥(Key exchange)  
201结帐日期切换(Cutoff)  
202结帐日期切换完成  
301测试(Echo test)  
35,Bit74贷记交易笔数(Transaction Number)  
位图位置:74  
格式:定长  
类型:N10  
描述:贷记金融交易总的成功交易次数  
CYBERBANK软件在收到如下一个处理代码时会增加贷记交易次数。  
交易码交易服务  
00贷记,购物与服务  
01贷记,取现  
02贷记,调整(客户调整)  
36,Bit75贷记自动冲正交易笔数(Credits,Reversal Number)  
位图位置:75  
格式:定长  
类型:N10  
描述:贷记收单行自动冲正、“ChargeBack"等交易总的交易次数  
CYBERBANK软件在收到如下一个处理代码时会增加贷记自动冲正交易笔数  
交易码交易服务  
20贷记,退货  
21贷记,存款  
22贷记,调整(客户修改)  
37,Bit76借记交易笔数(Debits,Number)  
位图位置:76  
格式:定长  
类型:N10  
描述:借记金融交易总的成功交易次数  
CYBERBANK软件在收到如下一个处理代码时会增加借记交易次数。  
交易码交易服务  
00借记,购物与服务  
01借记,取现  
02借记,调整(客户调整)  
38,Bit77借记自动冲正交易笔数(Debits,Reversal Number)   
位图位置:77  
格式:定长  
类型:N10  
描述:借记收单行自动冲正、“ChargeBack"等交易总的交易次数  
CYBERBANK软件在收到如下一个处理代码时会增加借记重发交易次数,并在清算表报中反映。  
交易码交易服务  
20借记(!!!),退货  
21借记,存款  
22借记,调整(客户修改)  
39,Bit78转帐交易笔数(Transfers,Number)  
位图位置:78  
格式:定长  
类型:N10  
描述:转帐的交易总次数。  
系统在收到如下一个处理代码的金融交易时会增加转帐交易的次数。  
交易码交易服务  
40客户相关帐户间转帐  
40,Bit79转帐自动冲正交易笔数(Transfers,Reversal Number)  
位图位置:79  
格式:定长  
类型:N10  
描述:转帐的自动冲正交易总次数。  
系统在收到如下一个处理代码的自动冲正交易时会增加转帐自动冲正交易的次数。  
交易码交易服务  
40客户相关帐户间转帐  
41,Bit80查询交易笔数(Inquiries,Number)  
位图位置:80  
格式:定长  
类型:N10  
描述:成功的查询交易次数。  
系统软件在收到如下一个处理代码时会增加查询交易次数。  
交易码交易服务  
30查询可用金额  
42,Bit81授权交易笔数(Authorization,Number)  
位图位置:81  
格式:定长  
类型:N10  
描述:成功的授权交易总额  
在收到一个授权交易时系统将授权交易笔数加一。  
43,Bit83贷记交易费金额(Credits,Transaction FeeAmount)  
位图位置:83  
格式:定长  
类型:N12  
描述:净交易费用,如交易金额为正。  
44,Bit85借记交易费金额(Debits,Transaction FeeAmount)  
位图位置:85  
格式:定长  
类型:N12  
描述:净交易费用,如交易金额为负。  
45,Bit86贷记交易金额(Credits,Amount)  
位图位置:86  
格式:定长  
类型:N16  
描述:贷记金融交易总的交易金额,不含任何费用。  
系统在收到如下一个处理代码时会增加贷记交易金额,并在清算表报中反映。  
交易码交易服务  
20贷记,退货  
21贷记,存款  
22贷记,调整(客户修改)  
46,Bit87贷记自动冲正金额(Credits,Reversal Amount)  
位图位置:87  
格式:定长  
类型:N16  
描述:信用卡自动冲正交易的总金额,不含任何费用。  
47,Bit88借记交易金额(Debits,Amount)   
位图位置:88  
格式:定长  
类型:N16  
描述:借记金融交易总的交易金额,不含任何费用。  
系统在收到如下一个处理代码时会增加借记交易金额,并在清算表报中反映。  
交易码交易服务  
00借记,购物与服务  
01借记,取现  
02借记,调整(客户调整)  
48,Bit89借记自动冲正交易金额(Debits,Reversal Amount)   
位图位置:89  
格式:定长  
类型:N16  
描述:借记自动冲正交易的总金额,不含任何费用。  
49,Bit90原交易的数据元素(Original Data Elements)   
位图位置:90  
格式:定长  
类型:N42  
描述:存放原交易的一些数据,用于修改或自动冲正。  
数据由以下五部分组成:  
位置描述  
1-4信息类型码  
设为原交易的信息类型代码  
5-10系统跟踪号  
原交易系统跟踪号  
11-20交易日期和时间  
原交易的交易日期和时间  
21-31原收单机构  
原交易的收单机构  
不足11位的机构代码,左补‘0’  
32-42原向前机构  
原交易的收单机构  
不足11位的机构代码,左补‘0’  
50,Bit91文件修改编码(File Update Code)   
位图位置:91  
格式:定长  
类型:AN1  
描述:用此域指示某文件怎样维护。   
CYBERBANK支持以下一些修改代码:  
1增加记录  
2改变记录  
3删除记录  
5查询  
7增加文件  
选用条件:  
51,Bit94服务指示码(Service Indicator)  
位图位置:94  
格式:定长  
类型:AN7  
描述:指示文件修改服务。  
选用条件:  
52,Bit95代替金额(Replacement Amounts)   
位图位置:95  
格式:定长  
类型:N42!!!  
描述:客户修改或部分取消已完成的交易,最后实际发生的交易金额 ,  
交易的原交易金额存放在90域。  
本域由以下4部分组成  
Sub-ElementAmountAttribute  
交易实际金额N12  
结算实际金额N12  
实际交易费用X+N8  
实际结算费用X+N8  
53,Bit97净结算金额(Net Settlement Amount)  
位图位置:97  
格式:定长  
类型:X+N16  
描述:此域为净结帐金额。  
502交易中用于发送当天的净结算金额  
例:“C0000000020000000”,表示贷方('+'?)200000.00元。  
“D0000000020000000”,表示借方('-'?)200000.00元。  
54,Bit99结算机构码(Settlement Institution Identification)  
位图位置:99  
格式:LLVAR  
类型:N..11  
描述:此域存放接收清算信息的机构代码。  
返回数据包此域必须和请求数据包一致。  
55,Bit100接收机构码(Receiving Institution Identification)  
位图位置:100  
格式:LLVAR  
类型:N..11  
描述:金融交易此域存放授权机构代码 。  
网管类交易,800/820交易,此域存放请求的目的机构代码。  
返回数据包此域必须和请求数据包一致。  
56,Bit101文件名(FileName)  
位图位置:101  
格式:LLVAR  
类型:ANS..17  
描述:发送机构设置的文件名。  
57,Bit102帐号1(Account Identification1)  
位图位置:102  
格式:LLVAR  
类型:ANS..28  
描述:一个特定的客户帐号。帐号1用来描述受借记、转出、支付等交易影响的帐户。  
选用条件:转帐时使用 。  
58,Bit103帐号2(Account Identiication2)  
位图位置:103  
格式:LLVAR  
类型:ANS..28  
描述:交易的补充信息,如:第二货币号、利率代码、起止日期等。  
定义如下表  
0000000000000000000000000000000000000000000000000  
位置长度描述  
00-2122帐户  
22-276发卡机构号  
如果此域存在,将按此机构代码作为路由信息。  
选用条件:机构间转帐时使用。  
60,Bit123新密码数据(New PIN Data)  
位图位置:123  
格式:LLLVAR  
类型:B...16  
描述:修改密码交易时存放新密码 。  
格式参考52域  
选用条件:修改密码交易时必须有此域。  
61,Bit128信息确认码(MAC)  
位图位置:128  
格式:定长  
类型:B16  
描述:数据包的最后一个域,用于验证信息来源的合法性,以及数据包中数据是否未被篡改。 
MAC的计算参ANSIX.99  
为提高效率,在发送者和接收者之间,只有以下一些重要的域参加MAC的计算。数据包中如果存在以下数据域,它们将参加MAC的计算。  
位图域名  
2基本帐号  
3处理代码  
4交易金额  
11系统跟踪号  
12本地交易时间  
13本地交易日期  
32收单机构代码  
38授权码  
39返回码  
41收单终端代码  
49交易货币代码  
95替换金额  
选用条件:使用65-128数据域的数据包需使用此域。 

 

消费交易实例 :

消费交易,需要上送交易类型,卡号等等,定义如下

卡号 第2域 LLVAR BCD 5309987876545342
交易类型 第3域 长度6 BCD 900000 
金额 第4域 长度12 BCD 100分
时间 第7域 长度8 BCD 20030802
2磁道信息 第35域 LLVAR ASCII 123456 
3磁道信息 第36域 LLLVAR BCD 123456001
商户号 第41域 LLVAR ASCII 98765432
好了我们现在开始打包,首先按照长度和类型把上面的数据处理一下
卡号 165309987876545342
交易类型 900000
金额 000000000100
时间 20030802
2磁道 06313233343536
3磁道 0009123456001
商户号 083938373635343332
接下来我们按照域信息生成位图
因为有第2域,所以第二个位置是1,由第三域,所以第三个位置
是1,。。。
依此类推得到一串数字
0111 0010 0000 0000 0000 0000 0000 0000 0011 0000 1000 0000 0000 0000 0000 0000
转换过来,就是
72 00 00 00 30 80 00 00 这个就是BITMAP了
然后把上面的数据按照BITMAP+每个域的内容,依次排列
就得到这个包的内容了
7200000030800000165309987876545342900000000000000100
20030802063132333435360009123456001083938373635343332
前头再加上TPDU和MSGID就是最后的数据包

c++源代码:

<bank8583.h>:   

    
  #ifndef   __BANK_8583_H__   
  #define   __BANK_8583_H__   
    
  #pragma   warning(   disable   :   4786)   
  //identifier   was   truncated   to   'number'   characters   in   the   debug   information   
  #include   "tchar.h"   
  #include   "ttrace.h"   
  #include   "basedef.h"   
  #include   "public.h"   
  #include   <vector>   
  #include   <map>   
  #include   <list>   
  using   namespace   std;   
    
  #include   "tsock.h"   
  using   namespace   STDNS;   
    
  #define   F8583T_STR   0   
  #define   F8583T_INT   1   
  #define   F8583T_BIN   2   
  typedef   struct   tagISO8583_FIELD   
  {       
  int   bit_flag;   //域数据类型0   --   string,   1   --   int,   2   --   binary   
  char   *data_name;   //域名   
  int   length;   //数据域长度   
  int   length_in_byte;//实际长度(如果是变长)   
  int   variable_flag;   //是否变长标志0:否   2:2位变长,3:3位变长   
  int   datatyp;   //0   --   string,   1   --   int,   2   --   binary   
  char   *data;   //存放具体值   
  int   attribute;   //保留   
  }   ISO8583_FIELD;   
  void   Get8583Field(   int   index,   ISO8583_FIELD**   ppField   );   
  void   Set8583ValidFields(   BYTE*   pindex   );   
    
  typedef   struct   tagTRADE_8583   
  {   
  const   char*   name;   
  DWORD bankcode;   
  BYTE bm[128];   
  }TRADE_8583;   
    
  typedef   struct   tagTRADE_8583_DEF   
  {   
  DWORD   tcode;   
  TRADE_8583   req;   
  TRADE_8583   ans;   
  }TRADE_8583_DEF;   
  BOOL   Set8583TradeInfo(   TRADE_8583_DEF*   pInfo   );   
    
  typedef   vector<BYTE>   PACK_8583_ITEM;   
    
  class   Pack8583   
  {   
  public:   
  Pack8583(   BOOL   bCompressInt   =   FALSE);   
  virtual   ~Pack8583();   
  BOOL   Init(DWORD   tcode);   
  int   SetReqField(int   field,char*   buf,int   len);   
  BOOL   BuildReqPack(   vector<BYTE>&   A,   BOOL   bForceFillAll   =   TRUE   );   
  BOOL   GetReqPackItem(   int   index,   PACK_8583_ITEM&   item);   
    
  DWORD   GetReqBankCode();   
  DWORD   GetAnsBankCode();   
  //-1   package   is   not   full   
  //-2   any   field   is   not   exist   
  //-3   LVAR,LLVAR,LLLVAR的长度不是DIGIT   
  //-4   LVAR,LLVAR,LLLVAR的长度太大   
  int   UnPack(BYTE*   pack,int   len);//把缓冲区的数据解包到ansdata里   
  //0   OK   
  //1   time   out   
  //2   recv   error   
  //-3   LVAR,LLVAR,LLLVAR的长度不是DIGIT   
  int   UnPack(   TCPSocket&   sock   );//接收解包   
  BOOL   GetAnsPackItem(   int   index,   PACK_8583_ITEM&   item);   
    
  PACK_8583_ITEM*   GetFromReq(   int   index   );   
  PACK_8583_ITEM*   GetFromAns(   int   index   );   
    
  void   ShowReq();   
  void   ShowAns();   
  char   m_recvbuf[1024];   
  int   m_recvbytes;   
  protected:   
  BOOL   m_bCompInt;   
  int   GetReqPackLen();   
  BOOL   IsReqFieldValid(int);   
  BOOL   IsAnsFieldValid(int);   
  BOOL   IsReqFieldNotFill();   
    
  void   BuildReqMask(   BYTE*   mask,   BOOL   bext,   BYTE*   bm   );   
  BOOL   IsReqExtExist();   
    
  void   MaskToBM(   BYTE*   mask,   BYTE*   bm   );//mask   BYTE[16],bm   BYTE[64]   
  TRADE_8583_DEF*   m_pTradeDef;   
  map<   int,   PACK_8583_ITEM   >   m_reqdata;   
  map<   int,   PACK_8583_ITEM   >   m_ansdata;   
  };   
    
    
  #endif

<bank8583.cpp>:   

  #include   "stdafx.h"   
  #include   <stdio.h>   
  #include   <string.h>   
  #include   <assert.h>   
  #include   "bank/bank8583.h"   
    
  ISO8583_FIELD   Tbl8583[128]   =       
  {       
  /*   FLD   1   */   {0,"BIT   MAP,EXTENDED   ",   8,   0,   0,   2,   NULL,0},       
  /*   FLD   2   */   {0,"PRIMARY   ACCOUNT   NUMBER   ",   22,   0,   2,   1,   NULL,0},       
  /*   FLD   3   */   {0,"PROCESSING   CODE   ",   6,   0,   0,   1,   NULL,0},       
  /*   FLD   4   */   {0,"AMOUNT,   TRANSACTION   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   5   */   {0,"NO   USE   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   6   */   {0,"NO   USE   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   7   */   {0,"TRANSACTION   DATE   AND   TIME   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   8   */   {0,"NO   USE   ",   8,   0,   0,   1,   NULL,0},       
  /*   FLD   9   */   {0,"NO   USE   ",   8,   0,   0,   1,   NULL,0},       
  /*   FLD   10   */   {0,"NO   USE   ",   8,   0,   0,   1,   NULL,0},       
  /*   FLD   11   */   {0,"SYSTEM   TRACE   AUDIT   NUMBER   ",   6,   0,   0,   1,   NULL,0},       
  /*   FLD   12   */   {0,"TIME,   LOCAL   TRANSACTION   ",   6,   0,   0,   1,   NULL,0},       
  /*   FLD   13   */   {0,"DATE,   LOCAL   TRANSACTION   ",   4,   0,   0,   1,   NULL,0},       
  /*   FLD   14   */   {0,"DATE,   EXPIRATION   ",   4,   0,   0,   1,   NULL,0},       
  /*   FLD   15   */   {0,"DATE,   SETTLEMENT   ",   4,   0,   0,   1,   NULL,0},       
  /*   FLD   16   */   {0,"NO   USE   ",   4,   0,   0,   1,   NULL,0},       
  /*   FLD   17   */   {0,"DATE,   CAPTURE   ",   4,   0,   0,   1,   NULL,0},       
  /*   FLD   18   */   {0,"MERCHANT'S   TYPE   ",   4,   0,   0,   1,   NULL,0},       
  /*   FLD   19   */   {0,"NO   USE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   20   */   {0,"NO   USE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   21   */   {0,"NO   USE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   22   */   {0,"POINT   OF   SERVICE   ENTRY   MODE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   23   */   {0,"NO   USE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   24   */   {0,"NO   USE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   25   */   {0,"POINT   OF   SERVICE   CONDITION   CODE   ",   2,   0,   0,   1,   NULL,0},       
  /*   FLD   26   */   {0,"NO   USE   ",   2,   0,   0,   1,   NULL,0},   
  /*   FLD   27   */   {0,"NO   USE   ",   1,   0,   0,   1,   NULL,0},       
  /*   FLD   28   */   {0,"field27   ",   6,   0,   0,   1,   NULL,0},       
  /*   FLD   29   */   {0,"NO   USE   ",   8,   0,   1,   1,   NULL,0},       
  /*   FLD   30   */   {0,"NO   USE   ",   8,   0,   1,   1,   NULL,0},       
  /*   FLD   31   */   {0,"NO   USE   ",   8,   0,   1,   1,   NULL,0},       
  /*   FLD   32   */   {0,"ACQUIRER   INSTITUTION   ID.   CODE   ",   11,   0,   2,   1,   NULL,0},       
  /*   FLD   33   */   {0,"FORWARDING   INSTITUTION   ID.   CODE   ",   11,   0,   2,   1,   NULL,0},       
  /*   FLD   34   */   {0,"NO   USE   ",   28,   0,   2,   0,   NULL,0},       
  /*   FLD   35   */   {0,"TRACK   2   DATA   ",   37,   0,   2,   0,   NULL,0},       
  /*   FLD   36   */   {0,"TRACK   3   DATA   ",104,   0,   3,   0,   NULL,0},       
  /*   FLD   37   */   {0,"RETRIEVAL   REFERENCE   NUMBER   ",   12,   0,   0,   0,   NULL,0},       
  /*   FLD   38   */   {0,"AUTH.   IDENTIFICATION   RESPONSE   ",   6,   0,   0,   0,   NULL,0},       
  /*   FLD   39   */   {0,"RESPONSE   CODE   ",   2,   0,   0,   0,   NULL,0},       
  /*   FLD   40   */   {0,"NO   USE   ",   3,   0,   0,   0,   NULL,0},       
  /*   FLD   41   */   {0,"CARD   ACCEPTOR   TERMINAL   ID.   ",   8,   0,   0,   0,   NULL,0},       
  /*   FLD   42   */   {0,"CARD   ACCEPTOR   IDENTIFICATION   CODE   ",   15,   0,   0,   0,   NULL,0},       
  /*   FLD   43   */   {0,"CARD   ACCEPTOR   NAME   LOCATION   ",   40,   0,   0,   0,   NULL,0},       
  /*   FLD   44   */   {0,"ADDITIONAL   RESPONSE   DATA   ",   25,   0,   2,   0,   NULL,0},       
  /*   FLD   45   */   {0,"NO   USE   ",   76,   0,   2,   0,   NULL,0},       
  /*   FLD   46   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   47   */   {0,"field47   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   48   */   {0,"ADDITIONAL   DATA   ---   PRIVATE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   49   */   {0,"CURRENCY   CODE,TRANSACTION   ",   3,   0,   0,   0,   NULL,0},       
  /*   FLD   50   */   {0,"CURRENCY   CODE,SETTLEMENT   ",   3,   0,   0,   0,   NULL,0},       
  /*   FLD   51   */   {0,"NO   USE   ",   3,   0,   0,   0,   NULL,0},       
  /*   FLD   52   */   {0,"PERSONAL   IDENTIFICATION   NUMBER   DATA   ",   8,   0,   0,   2,   NULL,0},       
  /*   FLD   53   */   {0,"SECURITY   RELATED   CONTROL   INformATION",   16,   0,   0,   1,   NULL,0},       
  /*   FLD   54   */   {0,"ADDITIONAL   AMOUNTS   ",120,   0,   3,   0,   NULL,0},       
  /*   FLD   55   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   56   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   57   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   58   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   59   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   60   */   {0,"NO   USE   ",   5,   0,   3,   0,   NULL,0},       
  /*   FLD   61   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   62   */   {0,"NO   USE   ",   11,   0,   3,   0,   NULL,0},       
  /*   FLD   63   */   {0,"NO   USE   ",   11,   0,   3,   0,   NULL,0},       
  /*   FLD   64   */   {0,"MESSAGE   AUTHENTICATION   CODE   FIELD   ",   8,   0,   0,   2,   NULL,0},       
  /*   FLD   65   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   66   */   {0,"NO   USE   ",   1,   0,   0,   1,   NULL,0},       
  /*   FLD   67   */   {0,"NO   USE   ",999,   0,   3,   1,   NULL,0},       
  /*   FLD   68   */   {0,"NO   USE   ",999,   0,   3,   1,   NULL,0},       
  /*   FLD   69   */   {0,"NO   USE   ",999,   0,   3,   1,   NULL,0},       
  /*   FLD   70   */   {0,"SYSTEM   MANAGEMENT   INformATION   CODE   ",   3,   0,   0,   1,   NULL,0},       
  /*   FLD   71   */   {0,"NO   USE   ",999,   0,   3,   1,   NULL,0},       
  /*   FLD   72   */   {0,"NO   USE   ",999,   0,   3,   1,   NULL,0},       
  /*   FLD   73   */   {0,"NO   USE   ",   6,   0,   0,   1,   NULL,0},       
  /*   FLD   74   */   {0,"NUMBER   OF   CREDITS   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   75   */   {0,"REVERSAL   NUMBER   OF   CREDITS   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   76   */   {0,"NUMBER   OF   DEBITS   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   77   */   {0,"REVERSAL   NUMBER   OF   DEBITS   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   78   */   {0,"NUMBER   OF   TRANSFER   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   79   */   {0,"REVERSAL   NUMBER   OF   TRANSFER   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   80   */   {0,"NUMBER   OF   INQUIRS   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   81   */   {0,"AUTHORIZATION   NUMBER   ",   10,   0,   0,   1,   NULL,0},       
  /*   FLD   82   */   {0,"NO   USE   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   83   */   {0,"CREDITS,TRANSCATION   FEEAMOUNT   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   84   */   {0,"NO   USE   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   85   */   {0,"DEBITS,TRANSCATION   FEEAMOUNT   ",   12,   0,   0,   1,   NULL,0},       
  /*   FLD   86   */   {0,"AMOUNT   OF   CREDITS   ",   16,   0,   0,   1,   NULL,0},       
  /*   FLD   87   */   {0,"REVERSAL   AMOUNT   OF   CREDITS   ",   16,   0,   0,   1,   NULL,0},       
  /*   FLD   88   */   {0,"AMOUNT   OF   DEBITS   ",   16,   0,   0,   1,   NULL,0},       
  /*   FLD   89   */   {0,"REVERSAL   AMOUNT   OF   DEBITS   ",   16,   0,   0,   1,   NULL,0},       
  /*   FLD   90   */   {0,"ORIGINAL   DATA   ELEMENTS   ",   42,   0,   0,   1,   NULL,0},       
  /*   FLD   91   */   {0,"FILE   UPDATE   CODE   ",   1,   0,   0,   0,   NULL,0},       
  /*   FLD   92   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   93   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   94   */   {0,"SERVICE   INDICATOR   ",   7,   0,   0,   0,   NULL,0},       
  /*   FLD   95   */   {0,"REPLACEMENT   AMOUNTS   ",   42,   0,   0,   0,   NULL,0},       
  /*   FLD   96   */   {0,"NO   USE   ",   8,   0,   0,   0,   NULL,0},       
  /*   FLD   97   */   {0,"AMOUNT   OF   NET   SETTLEMENT   ",   16,   0,   0,   0,   NULL,0},       
  /*   FLD   98   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   99   */   {0,"SETTLEMENT   INSTITUTION   ID   ",   11,   0,   2,   1,   NULL,0},       
  /*   FLD   100   */   {0,"RECVEING   INSTITUTION   ID   ",   11,   0,   2,   1,   NULL,0},       
  /*   FLD   101   */   {0,"FILENAME   ",   17,   0,   2,   0,   NULL,0},       
  /*   FLD   102   */   {0,"ACCOUNT   IDENTIFICATION1   ",   28,   0,   2,   0,   NULL,0},       
  /*   FLD   103   */   {0,"ACCOUNT   IDENTIFICATION2   ",   28,   0,   2,   0,   NULL,0},       
  /*   FLD   104   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   105   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   106   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   107   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   108   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   109   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   110   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   111   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   112   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   113   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   114   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   115   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   116   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   117   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   118   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   119   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   120   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   121   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   122   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   123   */   {0,"NEW   PIN   DATA   ",   8,   0,   3,   2,   NULL,0},       
  /*   FLD   124   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   125   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   126   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   127   */   {0,"NO   USE   ",999,   0,   3,   0,   NULL,0},       
  /*   FLD   128   */   {0,"MESSAGE   AUTHENTICATION   CODE   FIELD   ",   8,   0,   0,   2,   NULL,0},       
  };       
  void   Get8583Field(   int   index,   ISO8583_FIELD**   ppField   )   
  {   
  assert(   index>=1   &&   index   <=   128   );   
  *ppField   =   &Tbl8583[index-1];   
  }   
BYTE   g_8583ValidFields[16]   =   {0};   
  void   Set8583ValidFields(   BYTE*   pindex   )   
  {   
  memset(   g_8583ValidFields,   0,   sizeof(g_8583ValidFields)   );   
    
  while(   *pindex   >=   1   &&   *pindex   <=   128   )   
  {   
  int   num   =   (*pindex)-1;   
  int   n   =   num   /   8;   
  BYTE   mask   =   0x80;   
  mask   >>=   num   -   n   *   8;   
  g_8583ValidFields[n]   |=   mask;   
  pindex   ++;   
  }   
  }   
  BOOL   IsValidField(   int   index   )   
  {   
  if(   index   >=   128   ||   index   <=   1   )   return   FALSE;   
  int   num   =   index-1;   
  int   n   =   num   /   8;   
  BYTE   mask   =   0x80;   
  mask   >>=   num   -   n   *   8;   
  return   (   g_8583ValidFields[n]   &   mask   );   
  }   
    
  TRADE_8583_DEF*   g_8583TradeDef   =   NULL;   
    
  TRADE_8583_DEF*   Get8583TradeInfo(   DWORD   tcode   )   
  {   
  if(   g_8583TradeDef   ==   NULL   )   
  {   
  printf("Please   call   [Set8583TradeInfo]   function   first/r/n");   
  return   NULL;   
  }   
  for(   int   i   =   0;   g_8583TradeDef[i].req.name   !=   NULL;   i   ++   )   
  {   
  if(   g_8583TradeDef[i].tcode   &   tcode   )   return   &g_8583TradeDef[i];   
  }   
  printf("   trade   not   find   !   /r/n");   
  return   NULL;   
  }   
    
  BOOL   Set8583TradeInfo(   TRADE_8583_DEF   *   pDef   )   
  {   
  g_8583TradeDef   =   NULL;   
  for(   int   i   =   0   ;   pDef[i].req.name   !=   NULL   ;   i   ++   )   
  {   
  int   j;   
  for(   j   =   0;   ;   j   ++   )   
  {//保证所有的域都是声明了的   
  int   index   =   pDef[i].req.bm[j];   
  if(   index   >=   128   ||   index   <=   1   )   break;   
  if(   !IsValidField(   index   )   )   
  {   
  printf("field[%d]   is   not   valid!/r/n",index);   
  return   FALSE;   
  }   
  if(!(   Tbl8583[index-1].variable_flag   ==   0   ||   
  Tbl8583[index-1].variable_flag   ==   1   ||   
  Tbl8583[index-1].variable_flag   ==   2   ||   
  Tbl8583[index-1].variable_flag   ==   3   )   )   
  {   
  printf("field[%d]   variable_flag   is   not   a   valid   number!/r/n",index);   
  return   FALSE;   
  }   
  }   
  }   
  g_8583TradeDef   =   pDef;   
  return   TRUE;   
  }   
    
  Pack8583::Pack8583(   BOOL   bCompressInt   )   
  {   
  m_pTradeDef   =   NULL;   
  m_bCompInt   =   bCompressInt;   
  }   
    
  Pack8583::~Pack8583()   
  {   
  }   
    
  BOOL   Pack8583::Init(DWORD   tcode)   
  {   
  m_pTradeDef   =   Get8583TradeInfo(   tcode   );   
  if(   m_pTradeDef   ==   NULL   )   return   FALSE;   
  return   TRUE;   
  }   
    
  BOOL   Pack8583::IsReqFieldValid(   int   field   )   
  {   
  for(   int   i   =   0   ;;   i   ++)   
  {   
  int   findex   =   m_pTradeDef->req.bm[i];   
  if(   findex   <   0   ||   findex   >   128   )   break;   
  if(   field   ==   findex   )   return   TRUE;   
  }   
  return   FALSE;   
  }   
  BOOL   Pack8583::IsAnsFieldValid(   int   field   )   
  {   
  for(   int   i   =   0   ;;   i   ++)   
  {   
  int   findex   =   m_pTradeDef->ans.bm[i];   
  if(   findex   <   0   ||   findex   >   128   )   break;   
  if(   field   ==   findex   )   return   TRUE;   
  }   
  return   FALSE;   
  }   
  BOOL   Pack8583::SetReqField(int   field,char*   buf,int   len)   
  {   
  if(   !IsReqFieldValid(   field)   )   
  {   
  printf("field   [%d]   is   not   valid!/r/n",field);   
  return   FALSE;   
  }   
    
  pair<   int,   PACK_8583_ITEM   >   item_insert;   
  pair<   map<   int,   PACK_8583_ITEM   >::iterator,   BOOL   >   ret;   
    
  ISO8583_FIELD   &F   =   Tbl8583[field-1];   
  if(   F.variable_flag   ==   0   )   
  {   
  if(   len   !=   F.length   )   
  {   
  printf("field   [%d]   length   not   match!/r/n",field);   
  return   FALSE;   
  }   
  }   
  else   
  {//1,2,3   
  int   maxlen   =   0;   
  if(   F.variable_flag   ==   1   )   maxlen   =   9;   
  else   if(   F.variable_flag   ==   2   )   maxlen   =   99;   
  else   if(   F.variable_flag   ==   3   )   maxlen   =   999;   
  if(   len   >   maxlen   ||   len   <   0   )   
  {   
  printf("field   [%d]   data   length   out   of   range!/r/n",field);   
  return   FALSE;   
  }   
  }   
    
  item_insert.first   =   field;   
  ret   =   m_reqdata.insert(   item_insert   );   
  PACK_8583_ITEM   &item   =   ret.first->second;   
  item.resize(   len   );   
  memcpy(   &item[0],   buf,   len   );   
  return   TRUE;   
  }   
  PACK_8583_ITEM*   Pack8583::GetFromReq(   int   index   )   
  {   
  map<   int,   PACK_8583_ITEM   >   ::iterator   pos   =   m_reqdata.lower_bound(   index   );   
  if(   pos   ==   m_reqdata.end()   ||   pos->first   !=   index   )   return   NULL;   
  return   &pos->second;   
  }   
  PACK_8583_ITEM*   Pack8583::GetFromAns(   int   index   )   
  {   
  map<   int,   PACK_8583_ITEM   >   ::iterator   pos   =   m_ansdata.lower_bound(   index   );   
  if(   pos   ==   m_ansdata.end()   ||   pos->first   !=   index   )   return   NULL;   
  return   &pos->second;   
  }   
    
  int   Pack8583::GetReqPackLen()   
  {   
  int   len   =   8;   
  map<   int,   PACK_8583_ITEM   >::iterator   p;   
  for(   p   =   m_reqdata.begin()   ;   p   !=   m_reqdata.end();   ++   p   )   
  {   
  int   findex   =   p->first;   
  int   datalen   =   p->second.size();   
  if(   m_bCompInt   &&   Tbl8583[findex-1].datatyp   ==   1   )   
  {   
  int   flen   =   Tbl8583[findex-1].variable_flag   +   datalen;   
  len   +=   flen   /   2   +   flen   %   2;   
  }   
  else   
  {   
  len   +=   Tbl8583[findex-1].variable_flag;   
  len   +=   datalen;   
  }   
  }   
  if(   IsReqExtExist()   )   len   +=   8;   
  return   len;   
  }

C#的转换:

ASCII->string

Convert.ToInt32(ASCII);
Binary->string
Encoding.ASCII.GetString(Binary);

报文数据实例:

msgType :0200 30323030

1域 :01110010 00111000 00000000 00010000 00110010 11000000 00010000 00001001

Bitmap:72 38 00 10 32 C0 10 09

2 域:166224780001888456 313636323234373830303031383838343536

3 域:000200 303030323030

4 域:000000000001 303030303030303030303031

7 域:0412103355 30343132313033333535

11 域:000001 303030303031

12 域:103355 313033333535

13 域:0412 30343132

28 域:C00000000 433030303030303030

35 域:00 3030

36 域:000 303030

41 域:61006566 3631303036353636

42 域: 860010030210013 383630303130303330323130303133

52 123456--06123456FFFFFFFF--C4F1029F060CA9B9--43344631303239463036304341394239

61 域: 0186224780300001835 30313836323234373830333030303031383335

64 域:4635BED3EC4B24C7

转载于:https://www.cnblogs.com/brucewon/archive/2012/02/21/2360980.html

你可能感兴趣的文章
一例ssh key 无密码登录失败案例 (dsa,openssh7)
查看>>
list的sublist用法
查看>>
java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化
查看>>
Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程
查看>>
MongoDB ReplicaSet 集群搭建
查看>>
iOS开发之《英语词汇学习》
查看>>
WordPress创建多个page页面模板文件
查看>>
仿Gin搭建自己的web框架(六)
查看>>
数据化决策(期末复习)
查看>>
阿里云全民云计算云服务器2折起 只需293元/年
查看>>
进制转换Visual Basic-更新
查看>>
Oracel用rownum实现真分页
查看>>
swiper一组图片,点击图片出现中间,看效果
查看>>
ubuntu svn 常用命令
查看>>
发送HTTP请求 -- HttpUtil
查看>>
1.ehcache实现页面整体缓存和页面局部缓存
查看>>
JAVA之IO流(字符流)
查看>>
电路和电子学第一课:集总电路抽象
查看>>
20145237《网络对抗》网络欺诈技术防范
查看>>
菜鸟第一发:jdbc多条件组合查询
查看>>