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

📄 industrx.cpp

📁 ISO 8583 with c++ for financial transaction standard
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    /**************************************************/    /* 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 + -