📄 testiso.cpp
字号:
//
// IT24 Sistemas S.A.
// Application ISO-8583 Messages as released by RED LINK S.A.
//
// Libreria Propietaria de Mensajes ISO Aplicados
//
// Tarea Fecha Autor Observaciones
// (Beta) 2002.08.05 mdc EXPORT int ISO_Test(BYTE *bBuffer, int iBuffer, bool bFields, FILE* fOutput);
// Headers propios
// Header Type Definitions
#include <qusrinc/typedefs.h>
// Aliases
#include <qusrinc/alias.h>
// ISO-8583
#include <qusrinc/iso8583.h>
// ISO-APP Msg
#include <qusrinc/isoapp.h>
// ISO-MSG REDEFINITIONS
#include <qusrinc/isoredef.h>
// C Language string library
#include <string.h>
#ifndef BUFFER_SIZE
#define BUFFER_SIZE (8192)
#endif // BUFFER_SIZE
// Boolean String Constants
const char szTRUE[] = "TRUE";
const char szFALSE[] = "FALSE";
// Boolean String Parser
#define BoolStr( x ) ((x) ? szTRUE : szFALSE )
// ISO Test
EXPORT int ISO_Test(BYTE *bBuffer, int iBuffer, bool bFields,
char* szOutFile, bool bTruncate)
{
// ISO8583 object and secondary fields
APPMSG isoMsg;
BOOL bResult = FALSE,
bCheckIt = FALSE;
WORD wFieldLength = 0;
BYTE szMsgType[10] = {""};
BYTE szFieldDesc[64] = {""};
BYTE szFieldValue[BUFFER_SIZE] = {""};
ADDAMTS_ISO stAddAmts;
SECRSRVD8_ISO stSecRes8;
SECRSRVD7_ISO stSecRes7;
PRIRSRVD1_ISO stRsrvd1;
FILE *fOutput = NULL;
CHAR szTranCode[10] = {"000000"};
// Precondition
if(NULL == szOutFile || iBuffer <= 0 || NULL == bBuffer)
return (-1);
// Verify output file
if ( bTruncate )
{
// Open truncating
if ((fOutput = fopen(szOutFile, "w")) ==NULL )
return (-2);
}
else
{
// Open appending
if ((fOutput = fopen(szOutFile, "a")) ==NULL )
return (-2);
};
// Just do it...
bCheckIt = isoMsg.CheckExternParameters(NULL);
if( !(bResult = isoMsg.Import((PBYTE)bBuffer, iBuffer)) )
{
//printf("PAS Message=[%s]\n",bBuffer);
fprintf(fOutput,"PAS Message=[%s]\n",bBuffer);
bResult=isoMsg.IsPASPaymentFromPOSTerminal();
//printf("PAS-Payment-From-POS=%s\n", BoolStr(bResult));
fprintf(fOutput,"PAS-Payment-From-POS=%s\n", BoolStr(bResult));
}
bResult = isoMsg.IsValidMessage();
if(isoMsg.IsPASTransaction())
{
//printf("PAS Message=[%s]\n",bBuffer);
fprintf(fOutput,"PAS Message=[%s]\n",bBuffer);
bResult=isoMsg.IsPASPaymentFromPOSTerminal();
//printf("PAS-Payment-From-POS=%s\n", BoolStr(bResult));
fprintf(fOutput,"PAS-Payment-From-POS=%s\n", BoolStr(bResult));
}
else if(isoMsg.IsAFJPTransaction())
{
//printf("AFJP Message=[%s]\n",bBuffer);
fprintf(fOutput, "AFJP Message=[%s]\n",bBuffer);
}
else if(isoMsg.IsULTMOVTransaction())
{
//printf("AFJP Message=[%s]\n",bBuffer);
fprintf(fOutput, "AFJP Message=[%s]\n",bBuffer);
}
else if(isoMsg.IsSOATTransaction())
{
//printf("SOAT Message=[%s]\n",bBuffer);
fprintf(fOutput, "\nSOAT Message=[%s]\n",bBuffer);
}
else if(isoMsg.IsATMTransaction())
{
//printf("ATM Message=[%s]\n",bBuffer);
fprintf(fOutput, "\nATM Message=[%s]\n",bBuffer);
}
else
{
//printf("ISO-8583 Message=[%s]\n",bBuffer);
fprintf(fOutput,"\nISO-8583 Message=[%s]\n",bBuffer);
}
// Header [0..31]
//printf("\n#Header=[%-32.32s]\n", (PSTR)bBuffer);
bFields?fprintf(fOutput,"\n#Header=[%-32.32s]\n", (PSTR)bBuffer):0;
// Primary Bitmap [16..31]
//printf("#PrimaryBitmap=[%-16.16s]\n", (PSTR)&bBuffer[16]);
bFields?fprintf(fOutput,"#PrimaryBitmap=[%-16.16s]\n", (PSTR)&bBuffer[16]):0;
// MsgType
wFieldLength = sizeof szMsgType;
bResult = isoMsg.GetMsgTypeId( szMsgType, wFieldLength );
//printf("#MsgType=[%s]-Valid?=[%s]\n\n", szFieldValue, BoolStr(bResult));
bFields?fprintf(fOutput,"#MsgType=[%s]\n\n", szMsgType):0;
// For each field present...
for(int i=1,j=0; i < 128; i++)
{
// Check presence...
if (!isoMsg.IsValidField( i )) continue ;
// Increment field presence counter
j++;
// Field Descriptions
switch ( i )
{
case 1 : strcpy( (PSTR)szFieldDesc, "-SecBitmap"); break;
case 2 : strcpy( (PSTR)szFieldDesc, "-PAN"); break;
case 3 : strcpy( (PSTR)szFieldDesc, "-TranCode"); break;
case 4 : strcpy( (PSTR)szFieldDesc, "-Ammount"); break;
case 7 : strcpy( (PSTR)szFieldDesc, "-XMitDatTim"); break;
case 11 : strcpy( (PSTR)szFieldDesc, "-TraceNum"); break;
case 12 : strcpy( (PSTR)szFieldDesc, "-TranTim"); break;
case 13 : strcpy( (PSTR)szFieldDesc, "-TranDat"); break;
case 14 : strcpy( (PSTR)szFieldDesc, "-ExpDat"); break;
case 15 : strcpy( (PSTR)szFieldDesc, "-SetlDat"); break;
case 17 : strcpy( (PSTR)szFieldDesc, "-PostDate"); break;
case 19 : strcpy( (PSTR)szFieldDesc, "-CntryCde"); break;
case 23 : strcpy( (PSTR)szFieldDesc, "-Member"); break;
case 24 : strcpy( (PSTR)szFieldDesc, "-NetID"); break;
case 32 : strcpy( (PSTR)szFieldDesc, "-InstID"); break;
case 34 : strcpy( (PSTR)szFieldDesc, "-PANext"); break;
case 35 : strcpy( (PSTR)szFieldDesc, "-Track2"); break;
case 37 : strcpy( (PSTR)szFieldDesc, "-RefNum"); break;
case 36 : strcpy( (PSTR)szFieldDesc, "-Track3"); break;
case 39 : strcpy( (PSTR)szFieldDesc, "-RespCode"); break;
case 41 : strcpy( (PSTR)szFieldDesc, "-TermID"); break;
case 42 : strcpy( (PSTR)szFieldDesc, "-AccpID"); break;
case 43 : strcpy( (PSTR)szFieldDesc, "-TermName"); break;
case 44 : strcpy( (PSTR)szFieldDesc, "-RespData"); break;
case 46 : strcpy( (PSTR)szFieldDesc, "-AddDataISO"); break;
case 48 : strcpy( (PSTR)szFieldDesc, "-AddDataPrvt"); break;
case 49 : strcpy( (PSTR)szFieldDesc, "-Currency"); break;
case 52 : strcpy( (PSTR)szFieldDesc, "-PIN"); break;
case 54 : strcpy( (PSTR)szFieldDesc, "-AddAmts"); break;
case 55 : strcpy( (PSTR)szFieldDesc, "-PriRsrvd1ISO"); break;
case 60 : strcpy( (PSTR)szFieldDesc, "-PriRsrvd1Prvt"); break;
case 61 : strcpy( (PSTR)szFieldDesc, "-PriRsrvd2Prvt"); break;
case 63 : strcpy( (PSTR)szFieldDesc, "-PriRsrvd4Prvt"); break;
case 70 : strcpy( (PSTR)szFieldDesc, "-NetMngmnt"); break;
case 100: strcpy( (PSTR)szFieldDesc, "-RcvInstID"); break;
case 102: strcpy( (PSTR)szFieldDesc, "-Acct1"); break;
case 103: strcpy( (PSTR)szFieldDesc, "-Acct2"); break;
case 124: strcpy( (PSTR)szFieldDesc, "-SecRsrvd5"); break;
case 125: strcpy( (PSTR)szFieldDesc, "-SecRsrvd6"); break;
case 126: strcpy( (PSTR)szFieldDesc, "-SecRsrvd7"); break;
case 127: strcpy( (PSTR)szFieldDesc, "-SecRsrvd8"); break;
default : strcpy( (PSTR)szFieldDesc, ""); break;
}
// Specific Field Printing
if(i == 127)
{
// Field #127, Micr-Data
szFieldValue[0] = 0x00;
memset((PBYTE)&stSecRes8, 0, sizeof stSecRes8);
wFieldLength = sizeof stSecRes8;
bResult = isoMsg.GetField( 127,
&wFieldLength,
(PBYTE)&stSecRes8,
sizeof stSecRes8 );
if( strcmp((char *)szMsgType,"0200")==0 ||
strcmp((char *)szMsgType,"0220")==0 ||
strcmp((char *)szMsgType,"0420")==0 )
// Cotizaciones campo 127, requerimiento
fprintf(fOutput,
"#127-Micr-Data[%i]=[Region=%.*s][CambioC=%.*s][CambioV=%.*s]\n"
" [Cambio1=%.*s][Cambio2=%.*s]\n",
wFieldLength,
4,stSecRes8.stATM.stATM_Dl_Rqst.chRegnId ,
8,stSecRes8.stATM.stATM_Dl_Rqst.chCambio_C,
8,stSecRes8.stATM.stATM_Dl_Rqst.chCambio_V,
8,stSecRes8.stATM.stATM_Dl_Rqst.chCambio_1,
8,stSecRes8.stATM.stATM_Dl_Rqst.chCambio_2 );
else
// Cotizaciones campo 127, respuesta
fprintf(fOutput,
"#127-Micr-Data[%i]=[Aplic=%c][CambioC=%.*s][CambioV=%.*s]\n"
" [Cambio1=%.*s][Cambio2=%.*s]\n",
wFieldLength,
stSecRes8.stATM.stATM_Dl_Resp.chCamb_Aplic,
8,stSecRes8.stATM.stATM_Dl_Resp.chCambio_C,
8,stSecRes8.stATM.stATM_Dl_Resp.chCambio_V,
8,stSecRes8.stATM.stATM_Dl_Resp.chCambio_1,
8,stSecRes8.stATM.stATM_Dl_Resp.chCambio_2 );
}
else if(i == 126)
{
// Field #126, SecRsrvd7
szFieldValue[0] = 0x00;
memset((PBYTE)&stSecRes7, 0, sizeof stSecRes7);
wFieldLength = sizeof stSecRes7;
bResult = isoMsg.GetField( 126,
&wFieldLength,
(PBYTE)&stSecRes7,
sizeof stSecRes7 );
fprintf(fOutput,"#126-SecRsrv7[%i]=[%s]\n",
wFieldLength, stSecRes7.chData);
}
else if(i == 55)
{
// Field#55, AddDataPrvt1
szFieldValue[0] = 0x00;
memset((PBYTE)&stRsrvd1, 0, sizeof stRsrvd1);
wFieldLength = sizeof stRsrvd1;
bResult = isoMsg.GetField( 55,
&wFieldLength,
(PBYTE)&stRsrvd1,
sizeof(stRsrvd1));
if( strncmp(szTranCode,"39",2)==0 ||
strncmp(szTranCode,"09",2)==0 ||
strncmp(szTranCode,"19",2)==0 ||
strncmp(szTranCode,"29",2)==0 ||
strncmp(szTranCode,"40",2)==0 )
fprintf(fOutput,
"#055-XFER-BANK-DATA[%i]="
"[Track2=%.*s][CA=%.*s]\n"
" [From Account FIID-TYP-NUM=%.*s-%.*s-%.*s]\n"
" [To Account FIID-TYP-NUM=%.*s-%.*s-%.*s]\n"
" [Libre disponibilidad=FromAcct='%c' ToAcct='%c']\n",
wFieldLength,
40,stRsrvd1.stInterbancarias.chTrack2,
2,stRsrvd1.stInterbancarias.chCA,
4,stRsrvd1.stInterbancarias.stFrom_Acct.chFiid,
2,stRsrvd1.stInterbancarias.stFrom_Acct.chTyp,
19,stRsrvd1.stInterbancarias.stFrom_Acct.chAcct_num,
4,stRsrvd1.stInterbancarias.stTo_Acct.chFiid,
2,stRsrvd1.stInterbancarias.stTo_Acct.chTyp,
19,stRsrvd1.stInterbancarias.stTo_Acct.chAcct_num,
stRsrvd1.stInterbancarias.chFr_Acct_Typ,
stRsrvd1.stInterbancarias.chTo_Acct_Typ
); // arancel de usuario
else
bFields?fprintf(fOutput,"#055-PasData[%i]=[%*.*s]\n",
wFieldLength, sizeof stRsrvd1.chData, sizeof stRsrvd1.chData,
(char*)stRsrvd1.chData):0;
}
else if(i == 54)
{
// Field#54
szFieldValue[0] = 0x00;
memset((PBYTE)&stAddAmts, 0, sizeof stAddAmts);
wFieldLength = sizeof stAddAmts;
bResult = isoMsg.GetField( 54,
&wFieldLength,
(PBYTE)&stAddAmts,
sizeof(stAddAmts));
fprintf(fOutput,
"#054-B24-0210-DEF-DATA[%i]="
"[Amt=%.*s]"
"[With_adv_avail=%.*s]"
"[Int_owe_austral=%.*s]\n"
" [Cash_avail=%.*s]"
"[Min_payment=%.*s]"
"[Payment_dat=%.*s]"
"[Interest_rate=%.*s]\n"
" [Owe_dollar=%.*s]"
"[Min_payment_dollar=%.*s]"
"[Purchase_dollar=%.*s]"
"[Cash_fee=%.*s]\n",
wFieldLength,
12,stAddAmts.stB24_0210_Def_Data.chAMT, // 12 + reseved 108 bytes
2 ,stAddAmts.stB24_0210_Def_Data.chWITH_ADV_AVAIL, // contador extracciones o adelantos
12,stAddAmts.stB24_0210_Def_Data.chINT_OWE_AUSTRAL, // intereses ganados o deuda anterior y LIBRE DISPONIBILIDAD
12,stAddAmts.stB24_0210_Def_Data.chCASH_AVAIL, // saldo disponible
12,stAddAmts.stB24_0210_Def_Data.chMIN_PAYMENT,
6 ,stAddAmts.stB24_0210_Def_Data.chPAYMENT_DAT,
6 ,stAddAmts.stB24_0210_Def_Data.chINTEREST_RATE,
10,stAddAmts.stB24_0210_Def_Data.chOWE_DOLAR, // deuda en dolares y ACUMULADOR DE EXTRACCIONES
10,stAddAmts.stB24_0210_Def_Data.chMIN_PAYMENT_DOLAR,
10,stAddAmts.stB24_0210_Def_Data.chPURCHASE_DOLAR,
8 ,stAddAmts.stB24_0210_Def_Data.chCASH_FEE); // arancel de usuario
}
else
{
// Field#i
szFieldValue[0] = 0x00;
wFieldLength = sizeof szFieldValue;
bResult = isoMsg.GetField( i,
&wFieldLength,
szFieldValue,
sizeof(szFieldValue));
// TranCode resguardado
if(3==i)
strcpy(szTranCode,(char *)szFieldValue);
bFields?fprintf(fOutput,"#%3.3i%s=[%s]\n",
i, szFieldDesc, szFieldValue):0;
}
}//for-i
// Cerrar archivo de salida
fclose( fOutput );
fOutput = NULL;
// Ok !
return (0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -