📄 main.cpp
字号:
/*************************************************************************** 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 + -