⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************                          main.cpp  -  description                             -------------------    begin                : Fri Aug 15 14:11:32 ART 2003    copyright            : (C) |YEAR| by Ma2003ernadas    email                : cernadas_martin@yahoo.com ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#ifdef HAVE_CONFIG_H#include <config.h>#endif// B24WLINK// Data Processing Center#include <qusrinc/dpciso.h>#include <qusrinc/iso8583.h>#include <qusrinc/isoredef.h>#include <qusrinc/stdiol.h>// Std Library#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// limite de transacciones a procesarconst int qTrxLimit = 99999;// CONSTANTS// TimeOuts de norma ISO, segun configuracion propietaria#define _ISO8583_ECHO_TIMEOUT_	(71)// Timers en MILISEGUNDOS en caso de que se desee una notificacion via// S.O. y eventos asincronicos mediante temporizadores.#define _ISO8583_ECHO_TIMEOUT_MSEG_	(_ISO8583_ECHO_TIMEOUT_*1000L)#define _POLLING_TIMEOUT_MSEG_		(1000L)// TimeOut general del DPC (ACCEPT - WRITE)// Se elije un TIMEOUT que es numero primo para no provocar// una secuencia que se superponga y a su vez sobrecargue los// ECHO - LOGON del HOST administrador, RED LINK#define _DPC_COMM_TIMEOUT_		(73)/////////////////////////////////////////////////////////////////////////////////////////////////////////// Traduce el codigo de transaccion de B24 hacia ISOchar *TranslateTranCode_B24_ISO(char szTranCode[]){	// Casteo a estructura	PROCCDE_ISO	*pProcCde = (PROCCDE_ISO *)szTranCode;	// Processing Code, From Acct, To Acct.	SHORT	shTran    = 0,				shFromAcc = 0,				shToAcc   = 0;	// Variable de soporte, estatica y local, ya que se retorna a la salida de la funcion	static PROCCDE_ISO	stB24TranCode;	// Copia estatica local	stB24TranCode.uProcCde    = pProcCde->uProcCde ;	stB24TranCode.chFiller[0] = 0x00; // Null-ending string	// Inicio de conversion de codigos ISO8583 a internos de Base24	// RED LINK se aleja del estandar al incorporar TRAN-CDE alfanumericos. Atencion.	// Ambos digitos numericos ?	if( isdigit(pProcCde->uProcCde.stTranCde.chTran_Cde[0]) &&		isdigit(pProcCde->uProcCde.stTranCde.chTran_Cde[1]) )		shTran = antoi(pProcCde->uProcCde.stTranCde.chTran_Cde,2);	// Solo el primer digito es numerico ?	else if (isdigit(pProcCde->uProcCde.stTranCde.chTran_Cde[0]) &&			 !isdigit(pProcCde->uProcCde.stTranCde.chTran_Cde[1]) )		shTran = -1; // Un valor negativo es un valor que NO SE CONVIERTE, se traslada identico	// En todo otro caso	else		shTran = -1; // Un valor negativo es un valor que NO SE CONVIERTE, se traslada identico	// Cuenta desde-hacia son numericos obligatorios	shFromAcc = antoi(pProcCde->uProcCde.stTranCde.chFrom_Acct_Typ,2);	shToAcc   = antoi(pProcCde->uProcCde.stTranCde.chTo_Acct_Typ,2);	switch( shTran )	{		case 10  : shTran = 1; break;	// Extraccion de cuenta		case 19  : shTran = 9; break;	// Orden de debito en cta. por transferencias		case 20  : shTran = 21; break;	// Depositos en cuenta		case 31  : shTran = 30; break;	// Consulta de saldos		case 32  : shTran = 31; break;	// PIN		case 51  : shTran = 90; break;  // Pago Servicios con debito en cuenta		default : break; // permanece sin cambios, puede ser alfanumerico....	}	switch( shFromAcc )	{		case 7  : shFromAcc = _B24_CHECKINGS_ACCOUNT_USD_; break; // 7    - CUENTA CORRIENTE EN D?ARES		case 11 : shFromAcc = _B24_SAVINGS_ACCOUNT_; break; // 10   - CAJA DE AHORROS EN PESOS		case 13 : shFromAcc = _B24_SPECIAL_ACCOUNT_AFJP_; break; // 13  - CUENTA AFJP		case 14 : shFromAcc = _B24_SAVINGS_ACCOUNT_BOND_; break; // 14  - CUENTA BONOS		case 15 : shFromAcc = _B24_SAVINGS_ACCOUNT_USD_; break; // 15	- CAJA DE AHORROS EN D?ARES		case 1  : shFromAcc = _B24_CHECKINGS_ACCOUNT_; break; // 20	- CUENTA CORRIENTE EN PESOS		case 31 : shFromAcc = _B24_CREDIT_CARD_ACCOUNT_; break; // 30	- CUENTA TARJETA DE CR?ITO EN PESOS		case 30 : shFromAcc = _B24_CREDIT_LINE_ACCOUNT_; break; // 32	- CUENTA CR?ITO VISTA EN PESOS		default : break; // permanece sin cambios	}	switch( shToAcc )	{		case 7  : shToAcc = _B24_CHECKINGS_ACCOUNT_USD_; break; // 7    - CUENTA CORRIENTE EN D?ARES		case 11 : shToAcc = _B24_SAVINGS_ACCOUNT_; break; // 10   - CAJA DE AHORROS EN PESOS		case 13 : shToAcc = _B24_SPECIAL_ACCOUNT_AFJP_; break; // 13  - CUENTA AFJP		case 14 : shToAcc = _B24_SAVINGS_ACCOUNT_BOND_; break; // 14  - CUENTA BONOS		case 15 : shToAcc = _B24_SAVINGS_ACCOUNT_USD_; break; // 15	- CAJA DE AHORROS EN D?ARES		case 1  : shToAcc = _B24_CHECKINGS_ACCOUNT_; break; // 20	- CUENTA CORRIENTE EN PESOS		case 31 : shToAcc = _B24_CREDIT_CARD_ACCOUNT_; break; // 30	- CUENTA TARJETA DE CR?ITO EN PESOS		case 30 : shToAcc = _B24_CREDIT_LINE_ACCOUNT_; break; // 32	- CUENTA CR?ITO VISTA EN PESOS		default : break; // permanece sin cambios	}	// En ASCII-DISPLAY	// Si son todos numericos....	if(shTran > 0)		sprintf( stB24TranCode.uProcCde.stTranCde.chTran_Cde, "%02d%02d%02d",				shTran, shFromAcc, shToAcc );	// Sino, si alguno es alfanumerico....	else		sprintf( stB24TranCode.uProcCde.stTranCde.chTran_Cde, "%2.2s%02d%02d",				pProcCde->uProcCde.stTranCde.chTran_Cde, shFromAcc, shToAcc );	// Retorno de valor convertido, en forma estatica	return ( stB24TranCode.uProcCde.chData );}/* Conversion de monto RED LINK positivo y negativo */void convert_extract_ammount( char *szExtAmmount , const short cEXTR_AMT_LEN){	short nAuxLen    = min(strlen(szExtAmmount),cEXTR_AMT_LEN);	char  chNegative = FALSE;	// Segun ultimo caracter de cadena alfanumerica	switch(szExtAmmount[nAuxLen-1])	 {		// Positivos		case '{' : szExtAmmount[nAuxLen-1] = '0'; break;		case 'A' : szExtAmmount[nAuxLen-1] = '1'; break;		case 'B' : szExtAmmount[nAuxLen-1] = '2'; break;		case 'C' : szExtAmmount[nAuxLen-1] = '3'; break;		case 'D' : szExtAmmount[nAuxLen-1] = '4'; break;		case 'E' : szExtAmmount[nAuxLen-1] = '5'; break;		case 'F' : szExtAmmount[nAuxLen-1] = '6'; break;		case 'G' : szExtAmmount[nAuxLen-1] = '7'; break;		case 'H' : szExtAmmount[nAuxLen-1] = '8'; break;		case 'I' : szExtAmmount[nAuxLen-1] = '9'; break;		// Negativos		case '}' : szExtAmmount[nAuxLen-1] = '0'; chNegative = TRUE; break;		case 'J' : szExtAmmount[nAuxLen-1] = '1'; chNegative = TRUE; break;		case 'K' : szExtAmmount[nAuxLen-1] = '2'; chNegative = TRUE; break;		case 'L' : szExtAmmount[nAuxLen-1] = '3'; chNegative = TRUE; break;		case 'M' : szExtAmmount[nAuxLen-1] = '4'; chNegative = TRUE; break;		case 'N' : szExtAmmount[nAuxLen-1] = '5'; chNegative = TRUE; break;		case 'O' : szExtAmmount[nAuxLen-1] = '6'; chNegative = TRUE; break;		case 'P' : szExtAmmount[nAuxLen-1] = '7'; chNegative = TRUE; break;		case 'Q' : szExtAmmount[nAuxLen-1] = '8'; chNegative = TRUE; break;		case 'R' : szExtAmmount[nAuxLen-1] = '9'; chNegative = TRUE; break;		default  : break;	 };	// Adicionar signo negativo cuando corresponda	if (TRUE == chNegative && '0'==szExtAmmount[0])		szExtAmmount[0] = '-';};// Formatear mensaje ISO, requerimiento de extraccion-consulta, para pruebaint format_message(	short shT200_or_420, unsigned short nCount ,				   char szTranCode[], char szFromAcc[] , char szToAcc[],				   char *szExtPAN = NULL, char *szExtAmmount = NULL,				   char *szTRANDAT = NULL, char *szTRANTIM=NULL,				   char *szPOSTDAT=NULL,  char *szSEQNUM=NULL,				   char *szTERM_ID = NULL, char *szTERM_LN=NULL,				   char *szTIP_EXCH_V=NULL, char *szCURR_CODE=NULL );// Formatear mensaje ISO, requerimiento de extraccion-consulta, para pruebaint format_message(	short shT200_or_420, unsigned short nCount ,				   char szTranCode[], char szFromAcc[] , char szToAcc[],				   char *szExtPAN, char *szExtAmmount,				   char *szTRANDAT , char *szTRANTIM,				   char *szPOSTDAT,  char *szSEQNUM,				   char *szTERM_ID , char *szTERM_LN,				   char *szTIP_EXCH_V, char *szCURR_CODE ){   // Estaticas y permanentes	 time_t	        tToday   = time( NULL ); /* TODAY, NOW ! */	 struct  tm     *tmToday  = localtime( &tToday );   // Estaticas y permanentes   	 static time_t	        tTodaySav   = tToday; /* TODAY, NOW ! */	 static struct  tm     *tmTodaySav  = tmToday;   static long            lRandomSav  = 0;   // Temporales	 unsigned short	wLen = 0;   	 char szCardNum[]    = "501059010820989009       "; // 25 de longitud , INDUSTRIAL	 char szCardNum_a[]  = "501059010820960201       "; // 25 de longitud , INDUSTRIAL	 char szCardNum_b[]  = "501059010300110009       "; // 25 de longitud , INDUSTRIAL	 char szCardNum_1[]  = "501075254020009001       "; // 25 de longitud , MARIVA	 char szCardNum_2[]  = "5323759700000001         "; // 25 de longitud , MASTERCARD BPI	 char szCardExpdat[] = "0912"; // YYMM, Dic-2009	 char szCardMember[] = "001"; // Member 1	 char szTrack2[]     = "501059370010043003                   "; // 37 de longitud , INDUSTRIAL	 char szTrack2_1[]   = "501075254020009001                   "; // 37 de longitud , MARIVA	 char szTrack2_2[]   = "5323759700000001                     "; // 37 de longitud , MASTERCARD BPI	 char szTrack3[]     = "NOMBRE Y APELLIDO DESCONOCIDO "; // 30 de longitud , maximo 104	 char szFIID[]       = "0285"; // INDUSTRIAL? 	 char szFIID_3[]     = "0285"; // MACRO-BANSUD (ex 067)	 char szFIID_2[]     = "0254"; // MARIVA	 char szFIID_1[]     = "0265"; // BANCA NAZIONALE DEL LAVORO, BNL	 const short cEXTR_AMT_LEN = 12;	 char szAmmount[cEXTR_AMT_LEN+1] = "000000000999"; // Monto de la trx = $ 9.99	 char szAmmountDep[cEXTR_AMT_LEN+1] = "000000999900"; // Monto de la trx = $ 9999.00	 char szRateAmmnt[]        = "00000099"; // Precio de la trx = $ 0.99	 char szFechaPosting[]     = "1231+";	 char szFechaPostingNext[] = "1231+"; 	 char szFechaHoraYYMMDDHHMMSS[] = "031231115959+";	 char szFechaActualYYYYMMDD[]   = "20031231+";	 char szSeqTran[32+1]	= {"00000000000000000000000000999999"};	 char szCountryCode[]	   = "054"; // Argentina=054	 char szCurrencyCodeARG[]= "032"; // Argentina=032,USA=840,Uruguay=858	 char szCurrencyCodeUSA[]= "840"; // Argentina=032,USA=840,Uruguay=858	 char *szCurrencyCode   = szCurrencyCodeARG; // Argentina=032	 char szLNET[]			= "TES1"; // Logical Net	 char szTermID[]		= "B24WLINK        "; // Terminal ID default	 char szPIN[]           = "ABCDEF0123456789"; // PIN HEXA	 FIELD43	  fld43;	 FIELD54		fld54;	 FIELD55		fld55;	 FIELD60		fld60;	 FIELD127		fld127;	 long			  nRandom = 0;	 short			nAuxLen = 0;	 double			fCotizacion = 1.0f,     					fAmmount1   = 0.0f;	 /* parametros externos ? */	 if(szExtPAN)	 {		 memcpy(szCardNum, szExtPAN, min(strlen(szExtPAN),sizeof(szCardNum)-1));		 memcpy(szTrack2 , szExtPAN, min(strlen(szTrack2),sizeof(szTrack2)-1));	 };	 if(szTIP_EXCH_V)	 {		 convert_extract_ammount( szTIP_EXCH_V , 8 );		 fCotizacion = antof( szTIP_EXCH_V , 8, 3 );	 };	 if(szExtAmmount)	 {		convert_extract_ammount( szExtAmmount , cEXTR_AMT_LEN);		nAuxLen = strlen(szExtAmmount);		if(nAuxLen > cEXTR_AMT_LEN)		 {			nAuxLen = strlen(szExtAmmount) - cEXTR_AMT_LEN;			memcpy(szAmmount, szExtAmmount+nAuxLen, cEXTR_AMT_LEN );		 }		else			memcpy(szAmmount, szExtAmmount, nAuxLen );		if(strlen(szAmmount) > cEXTR_AMT_LEN)			szAmmount[cEXTR_AMT_LEN]=0x00;		if(fCotizacion >= 1.0f)		{			fAmmount1 = antof( szAmmount, cEXTR_AMT_LEN, 2 );			sprintf( szAmmount, "%012i",(int)((fCotizacion * fAmmount1) * 100.0f) );		};	 };	 if(szCURR_CODE)		 memcpy(szCurrencyCode, szCURR_CODE, min(strlen(szCURR_CODE),sizeof(szCURR_CODE)-1));	 else	 {    /* Generar una transaccion DOLARES casi nunca... dejar abierta una leve posibilidad */    /* Se elige '9971' como numero primo */		if( (rand() % 9971) != 0) szCurrencyCode = szCurrencyCodeARG;		else                    	  szCurrencyCode = szCurrencyCodeUSA;	 }	 if(szTERM_ID)		 memcpy(szTermID, szTERM_ID, min(strlen(szTERM_ID),sizeof(szTermID)-1));	 if(szTERM_LN)		 memcpy(szLNET, szTERM_LN, min(strlen(szTERM_LN),sizeof(szLNET)-1));	 if(szTRANDAT && szTRANTIM)	 {		 /* fecha de prestacion */		 sprintf( szFechaActualYYYYMMDD, "20%6.6s", szTRANDAT );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -