📄 industrx.cpp
字号:
/**************************************************/ /* 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("Nro.Secuencia :<%12.12s> \n", extractBuff.cuerpo.SEQ_NUM ); glLogg.Put("Fecha Negocio :<%6.6s> \n", extractBuff.cuerpo.POST_DAT ); glLogg.Put("Fecha y Hora :<%6.6s> <%8.8s> \n", extractBuff.cuerpo.TRAN_DAT , extractBuff.cuerpo.TRAN_TIM); 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 ); 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); if( isoMsg.IsValidReversal() || /* Es un Reverso valido ? */ isoMsg.IsFinancialAdvice() ) /* Es un Forzado valido ? */ { glLogg.Put("Motivo EXTRACT de Reverso/Forzado:<%2.2s> \n", extractBuff.cuerpo.RVSL_RSN ); }; glLogg.Put("Longitud a enviar : <%i> bytes\n", sizeof(extractBuff)); /***********************************************************************************/ /**********************************************************************************/ /**********************************************************************************/ /* enviar y recibir estructura compuesta */ /**********************************************************************************/ extractBuff.chETX = 0x05; /* indicador de fin de mensaje para el CBLSERVER */ extractBuff.chEOF = 0x05; /* indicador de fin de mensaje para el CBLSERVER */ extractBuff.chNUL = 0x00; /* NULL */ pCBLServerMsg->extractBuff = extractBuff; strncpy(pCBLServerMsg->chDireccionIP, tcpConn.getHost(), strlen(tcpConn.getHost())); strncpy(pCBLServerMsg->chNumeroTransaccion, extractBuff.cuerpo.ENTRY_TIM, sizeof(pCBLServerMsg->chNumeroTransaccion) ); iLenBuff = sizeof(CBLServerMsg_t); iRetval = tcpConn.send( pszCBLServerMsg , iLenBuff ); glLogg.Put("Mensaje enviado : <%i><%s>\n", iLenBuff, pszCBLServerMsg );#ifdef _DEBUG_CBL_MSG_ /************************************************/ if(hCBLFile) { fwrite( pszCBLServerMsg, iLenBuff, 1, hCBLFile ); fwrite( "\r\n" , 2, 1, hCBLFile ); } /************************************************/#endif // _DEBUG_CBL_MSG_ SETSTRUCTBLANKED( pCBLServerMsg->extractBuff ); iLenBuff = sizeof(CBLServerMsg_t); iRetval = tcpConn.recv( pszCBLServerMsg , iLenBuff ); extractBuff = pCBLServerMsg->extractBuff; glLogg.Put("Mensaje recibido : <%i><%s>\n", iRetval, pszCBLServerMsg );#ifdef _DEBUG_CBL_MSG_ /************************************************/ if(hCBLFile) { fwrite( pszCBLServerMsg, iRetval, 1, hCBLFile ); fwrite( "\r\n" , 2, 1, hCBLFile ); fclose( hCBLFile ); }#endif // _DEBUG_CBL_MSG_ /************************************************/ /**********************************************************************************/ /**********************************************************************************/ /**********************************************************************************/ if( strstr( pszCBLServerMsg, "Error COBOL" )!=NULL) { shAuthRespCde = TCP4U_CANCELLED; iRetval = TCP4U_CANCELLED; } /**********************************************************************************/ /***********************************************************************************/ // Pasar formato INDUS-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 + (sizeof(extractBuff.cuerpo.AMT_3)-sizeof(TRAN_AMT)), psztTran_Amt->chAmmount + (sizeof(extractBuff.cuerpo.AMT_3)-sizeof(TRAN_AMT)) ); // 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 B.INDUSTRIAL 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_INDUS_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", psztTran_Amt ); 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 INDUS return (wRespCode = antoi(szRespCode,2));};///////////////////////////////////////////////////////////////////////////////////////////////////////////WORD TrxResINDUS::ProcessIndividualTransfer(WORD wCause,boolean_t bIsRvsl)// Transferencia CBU de individuo{ // Respuesta default WORD wRespCde = CISO_EXTERNAL_DECLINE_I; // Precondicion = Descomponer mensaje ISO-8583 en campos estructurados wRespCde = ProcessInit(); // Denegada, no se procesa, segun sea ON/OFF, sera 91 o 06 wRespCde = ( isoMsg.IsFinancialAdvice() || isoMsg.IsValidReversal() ) ? CISO_SYSTEM_FAILURE_I : CISO_DESTINY_NOT_AVAILABLE_I; /////////////////////////////////////////////////////////////////////////// // Verificar transaccion XFER POR CBU if( isoMsg.IsATMTransferCBU() ) // Metodo generico de procesamiento de transaccion return ProcessGeneric(); else // Error generico del sistema return CISO_SYSTEM_FAILURE_I;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -