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

📄 sioptrx.cpp

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