📄 sioptrx.cpp
字号:
int iLenBuff = 0,
iRetval = 0;
WORD wBuff = 0,
wRespCode = CISO_EXTERNAL_DECLINE_I ; /* respuesta default */
char szMsgTypeID[4+1] = {0},
szRespCode[8] = { CISO_GENERIC_ERROR }; /* preasignado error="05" */
// Constantes de soporte
const boolean_t cbCONNECT_BY_TRX = is_true; /* conectarse por cada trx ? */
/***********************************************************************/
/* Precondicion = Descomponer mensaje ISO-8583 en campos estructurados */
wRespCode = ProcessInit();
/***********************************************************************/
/* default de procesamiento del autorizador back end */
shAuthRespCde = TCP4U_SUCCESS;
/***********************************************************************/
/* Comienzo a procesar trx. para SIOP32 */
glLogg.Put("############# PARSEO DE TRX SIOP-ATM-POS #############\n");
/* Configurar direccion del Back End de autorizacion */
if(szIPBackEnd != NULL)
tcpConn.setHost( szIPBackEnd );
if(usPortBackEnd > 0)
tcpConn.setUsPort( usPortBackEnd );
/* Conectar al Back End de autorizacion, si no esta conectado ya */
if ( tcpConn.getMyActiveSock() != 0 && cbCONNECT_BY_TRX )
{
glLogg.Put("### Conexion-Desconexion transaccion a transaccion ###\n");
tcpConn.disconnect( );
};
/* Conectar al Back End de autorizacion, si no esta conectado ya */
if ( tcpConn.getMyActiveSock() == 0 )
{
/* Conectar al Back End de autorizacion, si no esta conectado ya */
tcpConn.connect( );
if( tcpConn.getIrc() != TCP4U_SUCCESS )
{
glLogg.Put("### No se pudo conectar:<%i> ###\n", tcpConn.getIrc() );
//////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #44, RESP_DATA, saldo y disponible
FormatField44_RESP_DATA( NULL, NULL );
// Formatear campo ISO #122, SECNDRY_RSRVD3_PRVT
FormatField122_SECNDRY_RSRVD3_PRVT();
// Formatear campo ISO #123, SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
FormatField123_SECNDRY_RSRVD4_PRVT();
// Borrar campos no validos en la rta. : 43,48,52,63
isoMsg.DeleteField ( 43 );
isoMsg.DeleteField ( 48 );
isoMsg.DeleteField ( 52 );
isoMsg.DeleteField ( 63 );
// Borrar campo 120, OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO
isoMsg.DeleteField ( 120 );
//////////////////////////////////////////////////////////////////////////
// Destino no esta disponible, codigo de error para ISO8583
wRespCode = ( isoMsg.IsFinancialAdvice() || isoMsg.IsValidReversal() )
? CISO_SYSTEM_FAILURE_I
: CISO_DESTINY_NOT_AVAILABLE_I ;
// Resultado del BACK END interno (-37268..+32767)
shAuthRespCde = TCP4U_ERROR;
// Retornar resultado ISO
return (wRespCode);
}
else
glLogg.Put("### Conectado OK ###\n");
};
/**************************************************/
/* Completar campos de estructura , modo default */
/**************************************************/
SETSTRUCTZEROED( extractBuff );
wRespCode = Completar_MSG_EXTRACT( &extractBuff);
if(CISO_APPROVED_I != wRespCode)
{
/* Desconexion x / c/transa */
glLogg.Put("### Desconexion x/cada transaccion ###\n");
tcpConn.disconnect( );
/* Transa con errores, retornar codigo de error para ISO8583 */
return (wRespCode);
};
/**************************************************/
/************************************************************************/
/* Logger de estructura EXTRACT para mejor visualizacion en modo DEBUG */
/************************************************************************/
isoMsg.GetMsgTypeId((PBYTE)szMsgTypeID,sizeof(szMsgTypeID));
glLogg.Put("### Requerimiento ###\n");
glLogg.Put("Header y long. :<%i> MSG:<%120.120s...>\n", strlen(pszExtractBuff), pszExtractBuff);
glLogg.Put("Cod.Transaccion:<%6.6s> MsgTyp:<%4.4s>\n",
extractBuff.cuerpo.stTRAN_CDE.T_CDE, szMsgTypeID);
glLogg.Put("Entry-Time :<%19.19s> \n", extractBuff.cuerpo.ENTRY_TIM );
glLogg.Put("Monto Online :<%12.12s> \n", isoFields.field4.chAmmount );
glLogg.Put("Monto-1 Extr :<%19.19s> \n", extractBuff.cuerpo.AMT_1 );
glLogg.Put("Monto-2 Extr :<%19.19s> \n", extractBuff.cuerpo.AMT_2 );
glLogg.Put("Monto-3 Extr :<%19.19s> \n", extractBuff.cuerpo.AMT_3 );
glLogg.Put("Moneda :<%3.3s> \n", extractBuff.cuerpo.ORIG_CRNCY_CDE );
glLogg.Put("Cotiz.Comprador:<%8.8s> \n", extractBuff.cuerpo.uDATOS.stDATOS2.TIP_EXCHA_COMP);
glLogg.Put("Cotiz.Vendedor :<%8.8s> \n", extractBuff.cuerpo.TIP_EXCHA_VEND);
glLogg.Put("Arbitraje :<%8.8s> \n", extractBuff.cuerpo.uDATOS.stDATOS2.ARBITRAJE);
glLogg.Put("Nro.Secuencia :<%12.12s> \n", extractBuff.cuerpo.SEQ_NUM );
glLogg.Put("Fecha Ingreso :<%6.6s> \n", extractBuff.cuerpo.POST_DAT );
glLogg.Put("Terminal :<%16.16s> \n", extractBuff.header.TERM_ID );
glLogg.Put("Numero Tarjeta :<%28.28s> \n" , extractBuff.header.CARD_PAN );
glLogg.Put("Cuenta Desde :<%28.28s> \n" , extractBuff.cuerpo.FROM_ACCT );
glLogg.Put("Cuenta Hasta :<%28.28s> \n" , extractBuff.cuerpo.TO_ACCT );
if( isoMsg.IsValidReversal() ) /* Es un Reverso valido ? */
glLogg.Put("Motivo EXTRACT de reverso:<%2.2s> \n", extractBuff.cuerpo.RVSL_RSN );
glLogg.Put("Longitud a enviar : <%i> bytes\n", sizeof(extractBuff));
/***********************************************************************************/
/**********************************************************************************/
/**********************************************************************************/
/* enviar y recibir */
/**********************************************************************************/
iLenBuff = sizeof(extractBuff);
iRetval = tcpConn.send( (char *) &extractBuff , iLenBuff );
/**********************************************************************************/
SETSTRUCTBLANKED( extractBuff );
extractBuff.chETX = 0x03; /* END-OF-TEXT */
extractBuff.chEOF = 0x0A; /* END-OF-FILE */
extractBuff.chNUL = 0x00;
iLenBuff = sizeof(extractBuff);
iRetval = tcpConn.recv( (char *) &extractBuff , iLenBuff );
/**********************************************************************************/
/**********************************************************************************/
/***********************************************************************************/
// Pasar formato SIOP-EXTRACT a ISO8583-Red Link, la respuesta ISO
/***********************************************************************************/
if( iRetval <= 0 )
{
glLogg.Put("Error de comunicaciones:<%i=%s> \n", iRetval, Tcp4uErrorString(iRetval) );
//////////////////////////////////////////////////////////////////////////
// Formatear campo ISO #44, RESP_DATA, saldo y disponible
FormatField44_RESP_DATA( NULL, NULL );
// Formatear campo ISO #122, SECNDRY_RSRVD3_PRVT
FormatField122_SECNDRY_RSRVD3_PRVT();
// Formatear campo ISO #123, SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
FormatField123_SECNDRY_RSRVD4_PRVT();
// Borrar campos no validos en la rta. : 43,48,52,63
isoMsg.DeleteField ( 43 );
isoMsg.DeleteField ( 48 );
isoMsg.DeleteField ( 52 );
isoMsg.DeleteField ( 63 );
// Borrar campo 120, OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO
isoMsg.DeleteField ( 120 );
//////////////////////////////////////////////////////////////////////////
// Destino no esta disponible, codigo de error para ISO8583, o si es SAF :
// Declinacion del Sistema, no es respuesta, codigo de error para ISO8583
wRespCode = ( isoMsg.IsFinancialAdvice() || isoMsg.IsValidReversal() )
? CISO_SYSTEM_FAILURE_I
: CISO_DESTINY_NOT_AVAILABLE_I ;
return (wRespCode);
//////////////////////////////////////////////////////////////////////////
};
glLogg.Put("Longitud recibida : <%i> bytes\n", iRetval );
// Convertir posibles signos NEGATIVOS en el monto del saldo (monto ISO de 12 posiciones)
// En este caso es el saldo,que se espera en el MONTO 3 del diseno de registro EXTRACT
psztTran_Amt = (TRAN_AMT *)extractBuff.cuerpo.AMT_3;
Convert_Extract_Ammount( psztTran_Amt->chAmmount +
(sizeof(extractBuff.cuerpo.AMT_3)-sizeof(TRAN_AMT)),
sizeof(TRAN_AMT));
// Formatear campos 15 y 61 , OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO
FormatFields15_61();
// Formatear campo ISO #44, RESP_DATA, saldo y disponible
FormatField44_RESP_DATA( psztTran_Amt->chAmmount, psztTran_Amt->chAmmount );
// Formatear campo ISO #54 de rta., stB24_0210_Def_Data
// Balance Inquiry, Xfer, Withdrawal, Deposit, Payment
FormatField54_B24_0210_Def_Data(
"99", // chWITH_ADV_AVAIL, : contador extracciones o adelantos
NULL, // chINT_OWE_AUSTRAL,12 : LIBRE DISPONIBILIDAD (CORRALITO) o intereses
psztTran_Amt->chAmmount +
(sizeof(extractBuff.cuerpo.AMT_3)-sizeof(TRAN_AMT)), // chCASH_AVAIL,12 : saldo disponible
NULL, // chMIN_PAYMENT,12
NULL, // chPAYMENT_DAT,6
NULL, // chINTEREST_RATE,6
NULL, // chOWE_DOLAR,10 : ACUMULADOR DE EXTRACCIONES (CORRALITO)
NULL, // chMIN_PAYMENT_DOLAR,10
NULL, // chPURCHASE_DOLAR,10
NULL ); // chCASH_FEE,8 : arancel de usuario
// Formatear campo ISO #122, SECNDRY_RSRVD3_PRVT
// Balance Inquiry, Xfer, Withdrawal, Deposit, Payment
FormatField122_SECNDRY_RSRVD3_PRVT();
// Formatear campo ISO #123, SECNDRY_RSRVD4_PRVT, "DEPOSIT AMMOUNT"
// Balance Inquiry, Xfer, Withdrawal, Deposit, Payment
FormatField123_SECNDRY_RSRVD4_PRVT();
// Formatear campo ISO #125, SECNDRY_RSRVD6_PRVT, "ACCOUNT INDICATOR"
// Balance Inquiry, Xfer, Withdrawal, & Deposit, NOT FOR PAYMENT
if(!isoMsg.IsATMPayment()) // Pagos
FormatField125_SECNDRY_RSRVD6_PRVT( '1' );
// Formatear campo ISO #127, SECNDRY_RSRVD8_PRVT
// Balance Inquiry, Xfer, Withdrawal, & Deposit, NOT FOR PAYMENT
if(!isoMsg.IsATMPayment()) // Pagos
FormatField127_SECNDRY_RSRVD8_PRVT();
////////////////////////////////////////////////////
// Borrar campos no validos en la rta. : 43,48,52,63
isoMsg.DeleteField ( 43 );
isoMsg.DeleteField ( 48 );
isoMsg.DeleteField ( 52 );
isoMsg.DeleteField ( 63 );
// Borrar campo 120, OPCIONALMENTE PODRIAN NO VENIR EN UN REQUERIMIENTO
isoMsg.DeleteField ( 120 );
////////////////////////////////////////////////////
/**********************************************************************************/
/* Mapear codigo de respuesta SIOP hacia RED LINK */
/**********************************************************************************/
COPYSTRING(szRespCode, CISO_GENERIC_ERROR); // default pre-asignado
// El Cod.Rta. viene informada en el campo PREFIJO1 del diseno de registro EXTRACT
Mapear_RespCde_SIOP_REDLINK( extractBuff.cuerpo.RESP_CDE,
szRespCode, sizeof(szRespCode));
/////////////////////////////////////////////////////////////////
// Pasar a binario el codigo de respuesta alfanumerico
wRespCode = antoi(szRespCode,2);
/////////////////////////////////////////////////////////////////
// Actualizar mensaje ISO de respuesta
if(isoMsg.IsValidField( 39 ))
isoMsg.SetField(39,&(wBuff=2),(PBYTE)szRespCode, 2);
else
isoMsg.InsertField(39,&(wBuff=2),(PBYTE)szRespCode, 2);
////////////////////////////////////////////////////////////////
/**********************************************************************************************/
glLogg.Put("Saldo informado :<%19.19s>\n", extractBuff.cuerpo.AMT_3);
glLogg.Put("Resultado interno:<%7.7s>, EXTRACT:<%3.3s>, ISO para LINK:<%2.2s>\n",
extractBuff.header.PREFIX1, extractBuff.cuerpo.RESP_CDE, szRespCode );
/**********************************************************************************************/
/*************************************************************************************/
/* Verificar el numero de secuencia, si difiere del original */
/* (solo los primeros 6 digitos ya que estan alineados diferentes (izq. y derecha) */
/*************************************************************************************/
wBuff = sizeof(isoFields.field37.chNum);
if( antofix(extractBuff.cuerpo.SEQ_NUM,wBuff) != antofix(isoFields.field37.chNum,wBuff)
&& CISO_APPROVED_I == wRespCode)
{
/* Si es diferente, actualizar la respuesta del mensaje ISO */
wBuff = 2;
isoMsg.SetField( 39, &wBuff,(PBYTE)CISO_GENERIC_ERROR,2);
/* Si es diferente, informar */
glLogg.Put("Nro. de secuencia difiere del de requerimiento:<%12.12s>\n",
extractBuff.cuerpo.SEQ_NUM);
};
/*************************************************************************************/
/* Verificar que la cuenta de respuesta sea la misma que la de requerimiento */
/*************************************************************************************/
wBuff = sizeof(isoFields.field102.chNum);
if( strncmp(extractBuff.cuerpo.FROM_ACCT,isoFields.field102.chNum,wBuff)!=0
&& CISO_APPROVED_I == wRespCode )
{
/* Si es diferente, actualizar la respuesta del mensaje ISO */
wBuff = sizeof(isoFields.field102.chNum);
isoMsg.SetField( 102, &wBuff,(PBYTE)extractBuff.cuerpo.FROM_ACCT,wBuff);
/* Si es diferente, informar */
glLogg.Put("Cuenta de respuesta difiere de la del requerimiento, rta.actualizada\n");
};
/*************************************************************************************/
/* Desconectar del Back End, si asi se requiere */
if (tcpConn.getMyActiveSock() != 0 && cbCONNECT_BY_TRX )
{
glLogg.Put("### Desconectado ###\n");
tcpConn.disconnect( );
};
// Ultima linea, codigo de rta segun SIOP
return (wRespCode = antoi(szRespCode,2));
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -