Exemplo n.º 1
0
int CTradeLogin::DoTrade(SAConnection *saConn, void * pNode)
{

    if(saConn == NULL || pNode == NULL)
    {
        trace_log(ERR, "Paramter error!");
        return RET_SYSEXP;
    }
    trace_log(DBG,"-----Login-----");
    /********************pack********************/
    unsigned int g_nChnBatchNo;
    unsigned int g_nChnVouchNo;
    TRADEDATA * pData = (TRADEDATA *)pNode;
    /**< 获取流水号批次号及是否需要签到 */
	if(0 != COperateDB::GetChannelInfo(saConn, pData))
    {
        return RET_SYSEXP;
    }

    /**<处理流水号  */
    g_nChnVouchNo=atoi(pData->VouchNo);
    g_nChnBatchNo=atoi(pData->BatchNo);
    if(g_nChnVouchNo < 999999 && g_nChnVouchNo > 0)
    {
        g_nChnVouchNo++;
    }else{
        g_nChnVouchNo = 1;
        if(g_nChnBatchNo<999999)
        {
            g_nChnBatchNo++;
        }else g_nChnBatchNo=1;
    }
    sprintf(pData->BatchNo, "%06d", g_nChnBatchNo);
    sprintf(pData->VouchNo, "%06d", g_nChnVouchNo);

      /**< 回存流水号和批次号 */
    if(0 != COperateDB::SaveChannelInfo(saConn, pData))
    {
        trace_log(ERR, "DoGetVouchNo fail.");
        return RET_SYSEXP;
    }
    trace_log(DBG,"BatchNo:%s-----VouchNo:%s",pData->BatchNo,pData->VouchNo);
	if(!pData->bIsLogin) return 0;  //不需要签到时直接返回

    int iFieldDataLen = 0;
    bool bFlag = true;
    BYTE bFieldData[64] = {0};
    BYTE bKeyData[200] = {0};

    TRADEDATA pTmpData;
    memcpy(&pTmpData, pData, sizeof(TRADEDATA));
    pTmpData.TransData.HeadData.RTradeType = POS_SIGN;
    pTmpData.TransData.HeadData.nLFlowID = 0;

    CUPS8583 sndObj;
    //0消息类型
    bFlag &= sndObj.SetValueByStr(0, "0800");
    //3 处理码
    bFlag &= sndObj.SetValueByStr(3, "990000");
    //流水号
    bFlag &= sndObj.SetValueByStr(11, pTmpData.VouchNo);
    //NII
    bFlag &= sndObj.SetValueByStr(24, "009");
	//32 受理机构代码
	bFlag &= sndObj.SetValueByStr(32, pTmpData.RcvBrchCode);
    //33 发送机构代码
    if(strlen(pData->SndBrchCode) > 0)
        bFlag &= sndObj.SetValueByStr(33, pTmpData.SndBrchCode);
    //42	受卡方标识码
    bFlag &= sndObj.SetValueByStr(42, pTmpData.TransData.HeadData.arrRMerchNo);
    //61	自定义域
    sprintf((char *)bFieldData, "%s%s", pTmpData.BatchNo, "001");
    bFlag &= sndObj.SetValueByStr(61, (char *)bFieldData);
   /**< 插入交易记录 */
    /*if(COperateDB::MyBeforeInsertDB(saConn, &pTmpData))
    {
        trace_log(ERR, "MyBeforeInsertDB(login in) return failed!");
        return 	RET_SYSEXP;
    }*/
     /**< 模拟返回数据 */
    bFlag &= sndObj.SetValueByStr(39, "00");

    bFlag &= sndObj.SetValueByHex(48,ucFiled48,165);
    /**< 打包 */
    unsigned char SndBuf[PACK_MAXLEN]={0};
    unsigned iSndLen = sizeof(SndBuf);
    bFlag &= sndObj.Pack(SndBuf, iSndLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }
    SetMsgHead(SndBuf, iSndLen, pData);/**<  设置报文头*/
    /********************communication********************/
    unsigned char RcvBuf[PACK_MAXLEN]={0};
    int iRcvLen = sizeof(RcvBuf);
    trace_log(DBG,"login SndBuf len[%d]:",iSndLen);
    trace_mem(SndBuf,iSndLen);
    /*char errDesc[512]={0};
    SocketClient client;
    if(0 !=  client.SendToHost(SndBuf,(int)iSndLen,RcvBuf,iRcvLen,g_Cfg.CupHost[0].Host,(int)g_Cfg.CupHost[0].Port,30,errDesc))
    {
        trace_log(ERR, errDesc);
        return RET_SYSEXP;
    }*/
    memcpy(RcvBuf,SndBuf,iSndLen);
    iRcvLen=iSndLen;
    trace_log(DBG,"login RcvBuf len[%d]:",iRcvLen);
    trace_mem(RcvBuf, iRcvLen);
    /********************unpack********************/
    CUPS8583 rcvObj;
    if(1 != rcvObj.UnPack(RcvBuf, iRcvLen))
    {
        trace_log(ERR, "unpack right CUPS8583 error!");
        return RET_UNPACK;
    }

    memset(bFieldData, 0, sizeof(bFieldData));
    /*iFieldDataLen = rcvObj.GetValueByStr(13, (char*)bFieldData, sizeof(bFieldData));
    if(iFieldDataLen <= 0)
    {
        trace_log(ERR, "GetValueByStr failed!(Field13)");
        return RET_MSGERR;
    }*/

    iFieldDataLen = rcvObj.GetValueByStr(39, pTmpData.TransData.HeadData.RspCode,sizeof(pTmpData.TransData.HeadData.RspCode));

    if(memcmp(pTmpData.TransData.HeadData.RspCode,"00",2)==0)
    {
        /**< 快钱下发的流水号和批次号 */
        iFieldDataLen = rcvObj.GetValueByHex(48, bKeyData, sizeof(bKeyData));
        if(iFieldDataLen >0)
        {
            if(bSoftEncrypt)
            {
                /**< 软加密 */
                trace_log(DBG, "filed48 len is %d, content is:",iFieldDataLen);
                trace_mem(bKeyData, iFieldDataLen);
                trace_log(DBG,"bAreakey");
                trace_mem(bAreakey,16);
                int nResult=GetWorkCrypt(bKeyData,bAreakey,iFieldDataLen,pData);
                if(nResult)
                {
                  trace_log(ERR, "check value failed!nResult = %d", nResult);
                  return RET_MSGERR;
                }

            }else{
                /**< 硬件加密 */
                char cWorkKey[256]={0},cTemp[256]={0};
                memcpy(cTemp,bKeyData+5+55,32);
                memcpy(cTemp+32,bKeyData+39+55,16);
                memcpy(cTemp+48,bKeyData+5+110,32);
                memcpy(cTemp+80,bKeyData+39+110,16);
                memcpy(cTemp+96,bKeyData+5,32);
                memcpy(cTemp+128,bKeyData+39,16);
                Ccommon::Asc2Bcd(cTemp,(BYTE*)cWorkKey,(32+16)*3);
                trace_log(DBG,"cWorkKeyLen = %d", (32+16)*3/2);
                trace_mem((unsigned char *)cWorkKey, (32+16)*3/2);
                if(!cryptComm.SetWorkKey(pTmpData.SndBrchCode,pTmpData.RcvBrchCode,(BYTE*) cWorkKey, (32+16)*3/2, 3))
                {
                    trace_log(ERR,"Set bank work key fail!");
                    return RET_RELOGIN;
                }
            }

        }else{
            trace_log(DBG,"sign in success ,Field[39]=%s",pTmpData.TransData.HeadData.RspCode);
            return RET_RELOGIN;
        }
        if(0 != COperateDB::UpdateTermalState(saConn, bFieldData, &pTmpData))
            return RET_SYSEXP;
    }else{
        trace_log(ERR, "login in  failed!");
        return RET_SYSEXP;
    }

    /*if(COperateDB::MyAfterUpdateDB(saConn, &pTmpData, (char)ST_SUCCESS, "00","成功"))
    {
        trace_log(ERR, "MyAfterUpdateDB (login in) return failed!");
        return RET_SYSEXP;
    }*/
    trace_log(DBG,"sign in success");
    return RET_SUCCESS;
}
Exemplo n.º 2
0
int CTradeBase::DoTrade(SAConnection *saConn, void * pNode)
{
    if(saConn == NULL || pNode == NULL)
    {
        trace_log(ERR, "Parameter error.");
        return RET_SYSEXP;
    }

    TRADEDATA *pData=(TRADEDATA *)pNode;

	if( COperateDB::GetReference(saConn, pData->cReference) )
	{
		trace_log(ERR, "GetReference() fail.");
		return RET_SYSEXP;
	}
    /**< 插入交易记录 */
    if(0 != COperateDB::MyBeforeInsertDB(saConn, pData))
    {
        trace_log(ERR, "DoInsert fail.");
        return RET_SYSEXP;
    }

	char cType=pData->TransData.HeadData.RTradeType;
	
	trace_log(DBG, "POS_UNCONSUME==g_Cfg.ChongZhengFlag:%d,cType:%d-%d",g_Cfg.ChongZhengFlag,cType,POS_UNCONSUME);
	if(cType == POS_UNCONSUME) 
	{ //冲正交易
		memcpy(pData->TransData.HeadData.RspCode,"00",2);
		if (g_Cfg.ChongZhengFlag == 2) 
		{ //不向渠道发冲正
			if(0 != COperateDB::MyAfterUpdateDB(saConn, pData, (char)ST_SUCCESS,"00", "交易成功PC"))
			{
				trace_log(ERR, "Call DoUpdate fail!");
				return RET_SYSEXP;
			}
			
			return RET_SUCCESS;
		}
	}
     /**< 组请求包 */
    unsigned char SndBuf[PACK_MAXLEN]={0};
    unsigned iSndLen = sizeof(SndBuf);
    if(RET_SUCCESS != DoPack(saConn, pNode, SndBuf, iSndLen))
    {
        if( strcmp(pData->TransData.HeadData.RspCode, "25")==0 )
        {
            return -1;
        }
        if( 0==strlen(pData->TransData.HeadData.RspCode)) memcpy(pData->TransData.HeadData.RspCode,"96",2);
        if(0 != COperateDB::MyAfterUpdateDB(saConn, (TRADEDATA *)pNode, (char)ST_FAILURE,pData->TransData.HeadData.RspCode, ""))
        {
            trace_log(ERR, "Call MyUpdateDB fail!");
        }
        return RET_PACK;
    }

     /**< 设置报文头 */
    SetMsgHead(SndBuf, iSndLen, pData);
    /**< 写冲正表 */
    //char cType=pData->TransData.HeadData.RTradeType;
    if(cType==POS_CONSUME||cType==POS_REPEAL||cType==POS_PREAUTH||cType==POS_PREAUTHREVE||
        cType==POS_PREAUTHCPLREQ||cType==POS_PREAUTHCPLREVE)
    {

        if(0 != COperateDB::BuildResetData(saConn, pData,&sndObj))
        {
            trace_log(ERR, "DoIstRstRcd fail.");
            if( 0==strlen(pData->TransData.HeadData.RspCode)) memcpy(pData->TransData.HeadData.RspCode,"96",2);
            if(0 != COperateDB::MyAfterUpdateDB(saConn, pData, (char)ST_FAILURE,pData->TransData.HeadData.RspCode, ""))
            {
                trace_log(ERR, "Call DoUpdate fail!");
            }
            return RET_SYSEXP;
        }
    }

    /**<  发送请求包并接收响应包 */
    unsigned char RcvBuf[PACK_MAXLEN]={0};
    unsigned iRcvLen = sizeof(RcvBuf);
    char errDesc[248]={0};
    int iRet = DoSendAndRcv(SndBuf, iSndLen, RcvBuf, (int*)&iRcvLen, g_Cfg.nSendTimeOut,errDesc);
    if(0 !=iRet)
    {
        int nRET;
        char cErr[512];
        sprintf(cErr, "Channel[%d]:%s",iRet,errDesc);
        if(2==iRet)
        {
            memcpy(pData->TransData.HeadData.RspCode,TIMEOUT_FLAG,2);/**< 第三方响应超时 */
            nRET=RET_RECV;
        }else {
            if( 0==strlen(pData->TransData.HeadData.RspCode)) memcpy(pData->TransData.HeadData.RspCode,"96",2);
            nRET=RET_SYSEXP;
        }

        if(0 != COperateDB::MyAfterUpdateDB(saConn, pData, (char)ST_FAILURE,pData->TransData.HeadData.RspCode, cErr))
        {
            trace_log(ERR, "Call MyUpdateDB fail!");
        }
        return nRET;
    }
    /**<  处理响应包 */
    return DoUnpack(saConn, pNode, RcvBuf, iRcvLen);
}
Exemplo n.º 3
0
        bool TMdbNtcMessageQueue::Send(MDB_UINT16 uiType, const void* pBuffer, MDB_UINT32 uiLength /* = -1 */, bool bAllowOverlap /* = false */)
        {
            MDB_NTC_ZF_ASSERT(m_pMgrInfo);            
            if (uiLength == (MDB_UINT32)-1)
            {
                uiLength = pBuffer?  (MDB_UINT32)strlen((const char*)pBuffer):0;
            }
            if(GetFreeSize() < uiLength && !bAllowOverlap)
            {
                return false;
            }
            MDB_UINT32 uiMsgLen = ms_uiMsgHeadLen + uiLength;
            bool bRet = false;
            if(!m_pPushLock->Lock())
            {
                return false;
            }
            MDB_UINT32 uiPopCursor  = m_pMgrInfo->uiPopCursor;
            MDB_UINT32 uiNewPushCursor = m_pMgrInfo->uiPushCursor;
            bool bNotify = false; //是否需要通知等待Receive的线程
            do
            {
                if (uiNewPushCursor > uiPopCursor)
                {
                    if (uiNewPushCursor > m_uiShmSize-uiMsgLen)//末端不够存放
                    {
                        uiNewPushCursor = 0; //将Push游标移到共享内存前段
                        if (uiPopCursor >= uiMsgLen)//前端够存放
                        {
                            bRet = true;
                            break;
                        }
                    }
                    else//末端够存放
                    {
                        bRet = true;
                        break;
                    }
                }
                else if(uiNewPushCursor == uiPopCursor)
                {
                    if(m_pMgrInfo->uiPushTimes == m_pMgrInfo->uiPopTimes)
                    {
                        uiNewPushCursor = 0;//说明无数据,将游标移到头部
                        if(!m_pPopLock->Lock())
                        {
                            m_pPushLock->Unlock();
                            return false;
                        }
                        m_pMgrInfo->uiPopCursor = 0;
                        m_pPopLock->Unlock();
                        bRet = true;
                        break;
                    }
                }
                else if (uiPopCursor-uiNewPushCursor >= uiMsgLen)//说明之间的区域是够存放
                {
                    bRet = true;
                    break;
                }
                //如果之间区域不够存放,且push到末尾的区域也不够存放,则需要将push移到头位置
                else if(m_uiShmSize-uiNewPushCursor < uiMsgLen)
                {
                    uiNewPushCursor = 0;
                }
                //下面是针对不够存放的情况,做覆盖处理
                if(bAllowOverlap && m_uiShmSize >= uiMsgLen)
                {
                    bRet = true;//做覆盖
                    if(!m_pPopLock->Lock())
                    {
                        bRet = false;
                        break;
                    }
                    MDB_UINT32& uiPopCursor  = m_pMgrInfo->uiPopCursor;//重新赋值一次,得到最新的
                    MDB_UINT32 uiCurMsgLen = 0, iValidLength = uiPopCursor-uiNewPushCursor;
                    while(iValidLength < uiMsgLen)
                    {
                        if(uiPopCursor == m_pMgrInfo->uiPushCursor
                            && m_pMgrInfo->uiPushTimes == m_pMgrInfo->uiPopTimes)//说明已经全部取完,故可以从头开始存放
                        {
                            uiPopCursor = 0;
                            uiNewPushCursor = 0;
                            break;
                        }
                        else if(uiPopCursor <= m_uiShmSize-ms_uiMsgHeadLen)
                        {
                            memcpy(&uiCurMsgLen, m_pContentAddr + uiPopCursor + sizeof(uiType), sizeof(uiCurMsgLen));
                        }
                        else//末尾不够存放
                        {
                            uiCurMsgLen = (MDB_UINT32)-1;                            
                        }
                        if(uiCurMsgLen == (MDB_UINT32)-1)
                        {
                            uiPopCursor = 0;//从头开始
                            uiNewPushCursor = 0;//必须从头开始连续存放
                            iValidLength = 0;
                        }
                        else
                        {
                            /*
                            printf("now[%u] pop %u vs %u\nused_size[%u], pop_cursor[%u], push_cursor[%u], newpush_cursor[%u]\n",
                                m_uiShmSize,
                                m_pMgrInfo->uiPushTimes, m_pMgrInfo->uiPopTimes,
                                GetUsedSize(),
                                m_pMgrInfo->uiPopCursor, m_pMgrInfo->uiPushCursor, uiNewPushCursor); 
                                */
                            if(m_fnMsgOverlappedCallback)
                            {
                                m_fnMsgOverlappedCallback(this, *(MDB_UINT16*)(m_pContentAddr + uiPopCursor),
                                    m_pContentAddr + uiPopCursor+ms_uiMsgHeadLen, uiCurMsgLen, m_pMsgOverlappedArg);
                            }
                            uiPopCursor += uiCurMsgLen+ms_uiMsgHeadLen;
                            ++m_pMgrInfo->uiPopTimes;
                            iValidLength += uiCurMsgLen+ms_uiMsgHeadLen;
                        }
                    }
                    m_pPopLock->Unlock();
                }
            } while (0);
            if(bRet)
            {
                if(m_pMgrInfo->uiPushCursor != uiNewPushCursor)
                {
                    if(m_pMgrInfo->uiPushCursor <= m_uiShmSize-ms_uiMsgHeadLen)//需要将上一次push开始的位置置为0xFF,这样不至于被pop到
                    {
                        memset(m_pContentAddr+m_pMgrInfo->uiPushCursor, 0xFF, ms_uiMsgHeadLen); //写消息头长度信息为-1
                    }
                    m_pMgrInfo->uiPushCursor = uiNewPushCursor;
                }
                SetMsgHead(uiType, uiLength); //写消息头长度信息
                if(pBuffer && uiLength > 0)
                {
                    memcpy(m_pContentAddr + uiNewPushCursor + ms_uiMsgHeadLen, pBuffer, uiLength); //写消息体
                }
                m_pMgrInfo->uiPushCursor += uiMsgLen;
                m_pMgrInfo->uiPushTimes++;
                m_pMgrInfo->uiLastPushTime = (MDB_UINT32)time(NULL);
                bNotify = MDB_ABS(m_pMgrInfo->uiPushTimes-m_pMgrInfo->uiPopTimes)==1;
            }
            m_pPushLock->Unlock();
            if (bNotify)
            {
                m_pEvent->SetEvent();
            }

            return bRet;
        }
Exemplo n.º 4
0
int CTradegetmainkey::DoTrade(SAConnection *saConn, void * pNode)
{

    if(saConn == NULL || pNode == NULL)
    {
        trace_log(ERR, "Paramter error!");
        return RET_SYSEXP;
    }
    trace_log(DBG,"-----getmainkey-----");
    /********************pack********************/
    TRADEDATA * pData = (TRADEDATA *)pNode;

    int iFieldDataLen = 0;
    bool bFlag = true;
    BYTE bFieldData[64] = {0};
    BYTE bKeyData[200] = {0};
    trace_log(DBG,"pack 8583");

    TRADEDATA pTmpData;
    memcpy(&pTmpData, pData, sizeof(TRADEDATA));
    pTmpData.TransData.HeadData.RTradeType = POS_GETMAINKEY;
    pTmpData.TransData.HeadData.nLFlowID = 0;

    CUPS8583 sndObj;
    //0消息类型
    bFlag &= sndObj.SetValueByStr(0, "0820");
	 //41	受卡机终端标识码
    bFlag &= sndObj.SetValueByStr(41, pTmpData.TransData.HeadData.arrRTermNo);

    //42	受卡方标识码
    bFlag &= sndObj.SetValueByStr(42, pTmpData.TransData.HeadData.arrRMerchNo);
    //60	自定义域
    memcpy(bFieldData,"00",2);
	strcat((char *)bFieldData,(char *)pData->BatchNo);
	strcat((char *)bFieldData,(char *)"102");
    bFlag &= sndObj.SetValueByStr(60, (char *)bFieldData);
    //62域 秘钥信息
    /*BYTE fieldData62[120]={0};
    memset(fieldData62,20,15);//ip地址
    strcat((char *)fieldData62,"00000000000000000000");//sim卡号
    strcat((char *)fieldData62,"0000.00.00");
    strcat((char *)fieldData62,"0000.00.00");
    strcat((char *)fieldData62,"460");
    strcat((char *)fieldData62,"00");
    strcat((char *)fieldData62,"0000");
    strcat((char *)fieldData62,"0000");
    strcat((char *)fieldData62,"00000000000000000000000000000000");*/

    /*rsa_init(&rsa,RSA_PKCS_V15, 0 );
    rsa_gen_key(&rsa,NULL,NULL,1024,65537);
    rsa_public(&rsa,KLK,bFieldData);*/
    bFlag &=sndObj.SetValueByHex(62,bFieldData,100);
   /**< 插入交易记录 */
    if(COperateDB::MyBeforeInsertDB(saConn, &pTmpData))
    {
        trace_log(ERR, "MyBeforeInsertDB(getmainkey) return failed!");
        return 	RET_SYSEXP;
    }

    /**< 打包 */
    unsigned char SndBuf[PACK_MAXLEN]={0};
    unsigned iSndLen = sizeof(SndBuf);
    bFlag &= sndObj.Pack(SndBuf, iSndLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }

    SetMsgHead(SndBuf, iSndLen, pData);/**<  设置报文头*/
    /********************communication********************/
    unsigned char RcvBuf[PACK_MAXLEN]={0};
    int iRcvLen = sizeof(RcvBuf);
    trace_log(DBG,"getmainkey SndBuf len:",iSndLen);
    trace_mem(SndBuf,iSndLen);
    char errDesc[512]={0};
    SocketClient client;
    if(0 !=  client.SendToHost(SndBuf,(int)iSndLen,RcvBuf,iRcvLen,g_Cfg.CupHost[0].Host,(int)g_Cfg.CupHost[0].Port,60000,errDesc))
    {
        trace_log(ERR, errDesc);
        return RET_SYSEXP;
    }
    /********************unpack********************/
	trace_log(DBG,"RcvBuf len:",iRcvLen);
    trace_mem(RcvBuf,iRcvLen);
    CUPS8583 rcvObj;
    if(1 != rcvObj.UnPack(RcvBuf, iRcvLen))
    {
        trace_log(ERR, "unpack right CUPS8583 error!");
        return RET_UNPACK;
    }

    iFieldDataLen = rcvObj.GetValueByStr(39, pTmpData.TransData.HeadData.RspCode,
                                          sizeof(pTmpData.TransData.HeadData.RspCode));
    if(iFieldDataLen != 2)
    {
        trace_log(ERR, "GetValueByStr fail!(Field39)");
        return RET_MSGERR;
    }
    if(memcmp(pTmpData.TransData.HeadData.RspCode,"00",2)==0)
    {
    	iFieldDataLen = rcvObj.GetValueByStr(62, (char *)bKeyData,sizeof(bKeyData));
        if(bSoftEncrypt)
        {
            /**< 软加密 */
            trace_log(DBG, "filed62 len is %d, content is:",iFieldDataLen);
            trace_mem(bKeyData, iFieldDataLen);
            trace_log(DBG,"bKek");
            trace_mem(bKek,16);
            int nResult=GetMainCrypt(saConn,bKeyData,bKek,iFieldDataLen,&pTmpData);
			/*拷贝密钥否则签到是密钥无法使用*/
			memcpy(pData->bMacKey,pTmpData.bMacKey,32);
			memcpy(pData->bPinKey,pTmpData.bPinKey,32);
			memcpy(pData->bTdkKey,pTmpData.bTdkKey,32);
			memcpy(pData->bMainKey,pTmpData.bMainKey,32);
            if(nResult)
            {
              trace_log(ERR, "check value failed!nResult = %d", nResult);
              return RET_MSGERR;
            }

        }
		else
		{
			if(!cryptComm.SetMainKey(pData->TransData.HeadData.arrRMerchNo,pData->TransData.HeadData.arrRTermNo,bKeyData,iFieldDataLen))
            {
                trace_log(ERR, "Call TranslatePin fail!");
                return RET_SYSEXP;
            }
		}
        if(0 != COperateDB::UpdateMainKey(saConn, &pTmpData))
            return RET_SYSEXP;
    }else{
        trace_log(ERR, "getmainkey  failed!");
        return RET_SYSEXP;
    }

    if(COperateDB::MyAfterUpdateDB(saConn, &pTmpData, (char)ST_SUCCESS, (char *)"00",(char *)"成功"))
    {
        trace_log(ERR, "MyAfterUpdateDB (getmainkey) return failed!");
        return RET_SYSEXP;
    }
    trace_log(DBG,"getmainkey success");
    return RET_SUCCESS;
}
Exemplo n.º 5
0
int CTradeLogin::DoTrade(SAConnection *saConn, void * pNode)
{

    if(saConn == NULL || pNode == NULL)
    {
        trace_log(ERR, "Paramter error!");
        return RET_SYSEXP;
    }
    trace_log(DBG,"-----Login-----");

    unsigned int 	g_nChnBatchNo;
    unsigned int 	g_nChnVouchNo;
    TRADEDATA * 	pData = (TRADEDATA *)pNode;
	bool bIsRelogin = false; //重签到标识
	if(pData->bIsLogin)
		bIsRelogin = true;
    /**< 获取流水号批次号及是否需要签到 */
    pthread_mutex_lock(&mutex_load);
	if(COperateDB::GetChannelInfo(saConn, pData))
    {
        pthread_mutex_unlock(&mutex_load);
        return RET_SYSEXP;
    }
    /**<处理流水号  */
    g_nChnVouchNo=atoi(pData->VouchNo);
    g_nChnBatchNo=atoi(pData->BatchNo);
    if(g_nChnVouchNo < 999999 && g_nChnVouchNo > 0)
    {
        g_nChnVouchNo++;
    }else{
        g_nChnVouchNo = 1;
        if(g_nChnBatchNo<999999)
        {
            g_nChnBatchNo++;
        }else g_nChnBatchNo=1;
    }
    sprintf(pData->BatchNo, "%06d", g_nChnBatchNo);
    sprintf(pData->VouchNo, "%06d", g_nChnVouchNo);

      /**< 回存流水号和批次号 */
    if(0 != COperateDB::SaveChannelInfo(saConn, pData))
    {
        trace_log(ERR, "DoGetVouchNo fail.");
        pthread_mutex_unlock(&mutex_load);
        return RET_SYSEXP;
    }
    trace_log(DBG,"BatchNo:%s-----VouchNo:%s",pData->BatchNo,pData->VouchNo);
    pthread_mutex_unlock(&mutex_load);


	if(!pData->bIsLogin) return 0;  //不需要签到时直接返回

    int iFieldDataLen = 0;
    bool bFlag = true;
    BYTE bFieldData[64] = {0};
    BYTE bKeyData[200] = {0};
	BYTE bMainKey[16+1] = {0};

    TRADEDATA pTmpData;
    memcpy(&pTmpData, pData, sizeof(TRADEDATA));
    pTmpData.TransData.HeadData.RTradeType = POS_SIGN;

    CUPS8583 sndObj;
    //0消息类型
    bFlag &= sndObj.SetValueByStr(0, "0800");
    //流水号
    bFlag &= sndObj.SetValueByStr(11, pData->VouchNo);

	
	 //41	受卡机终端标识码
    bFlag &= sndObj.SetValueByStr(41, pTmpData.TransData.HeadData.arrRTermNo);

    //42	受卡方标识码
    bFlag &= sndObj.SetValueByStr(42, pTmpData.TransData.HeadData.arrRMerchNo);
	
    //60	自定义域
    memcpy(bFieldData,"00",2);
	strcat((char *)bFieldData,(char *)pData->BatchNo);
	strcat((char *)bFieldData,(char *)"003");
    bFlag &= sndObj.SetValueByStr(60, (char *)bFieldData);
	//63	自定义域
	bFlag &= sndObj.SetValueByStr(63, (char *)"001");


    /**< 打包 */
    unsigned char SndBuf[PACK_MAXLEN]={0};
    unsigned iSndLen = sizeof(SndBuf);
    bFlag &= sndObj.Pack(SndBuf, iSndLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }

    SetMsgHead(SndBuf, iSndLen, pData);/**<  设置报文头*/
    /********************communication********************/
    unsigned char RcvBuf[PACK_MAXLEN]={0};
    int iRcvLen = sizeof(RcvBuf);
    trace_log(DBG,"login SndBuf len:%d",iSndLen);
    trace_mem(SndBuf,iSndLen);
    char errDesc[512]={0};
    SocketClient client;
	trace_log(DBG,"SendToHost:%s:%d",g_Cfg.CupHost.cIp, g_Cfg.CupHost.iPort);
    if(0 !=  client.SendToHost(SndBuf,(int)iSndLen,RcvBuf,iRcvLen,g_Cfg.CupHost.cIp,(int)g_Cfg.CupHost.iPort,60000,errDesc))
    {
        trace_log(ERR, errDesc);
        return RET_SYSEXP;
    }
    /********************unpack********************/
	trace_log(DBG,"RcvBuf len:",iRcvLen);
    trace_mem(RcvBuf,iRcvLen);
    CUPS8583 rcvObj;
    if(1 != rcvObj.UnPack(RcvBuf, iRcvLen))
    {
        trace_log(ERR, "unpack right CUPS8583 error!");
        return RET_UNPACK;
    }

    memset(bFieldData, 0, sizeof(bFieldData));
    iFieldDataLen = rcvObj.GetValueByStr(13, (char*)bFieldData, sizeof(bFieldData));
    if(iFieldDataLen <= 0)
    {
        trace_log(ERR, "GetValueByStr failed!(Field13)");
        return RET_MSGERR;
    }

    iFieldDataLen = rcvObj.GetValueByStr(39, pTmpData.TransData.HeadData.RspCode,
                                          sizeof(pTmpData.TransData.HeadData.RspCode));
    if(iFieldDataLen != 2)
    {
        trace_log(ERR, "GetValueByStr fail!(Field39)");
        return RET_MSGERR;
    }
    if(memcmp(pTmpData.TransData.HeadData.RspCode,"00",2)==0)
    {
        /**< 快钱下发的流水号和批次号 */
        iFieldDataLen = rcvObj.GetValueByHex(62, bKeyData, sizeof(bKeyData));
        if(iFieldDataLen >0)
        {
            if(bSoftEncrypt)
            {
                /**< 软加密 */
                trace_log(DBG, "filed62 len is %d, content is:",iFieldDataLen);
                trace_mem(bKeyData, iFieldDataLen);
				memset((char *)bMainKey,0x00,sizeof((char *)bMainKey));
				if(COperateDB::GetMainKey(saConn,pData))
				{
					trace_log(ERR, "GetMainKey() fail.");
				}
				Ccommon::Asc2Bcd((const char*)pData->bMainKey, (unsigned char *)bMainKey, 32, NL);
                
                int nResult=GetWorkCrypt(saConn,bKeyData,bMainKey,iFieldDataLen,&pTmpData);
				/*拷贝密钥否则签到是密钥无法使用*/
				memcpy(pData->bMacKey,pTmpData.bMacKey,32);
				memcpy(pData->bPinKey,pTmpData.bPinKey,32);
				if(nResult)
                {
					trace_log(ERR, "check value failed!nResult = %d", nResult);
					return RET_MSGERR;
                }
				
				
				if(COperateDB::UpdateworkKey(saConn,bKeyData,&pTmpData))
				{
					trace_log(ERR, "UpdateworkKey() fail.");
					return RET_RELOGIN;
				}
				
            }
			else
			{
                /**< 硬件加密 */
                trace_log(DBG,"cWorkKeyLen(Field62_DataLen)= %d", iFieldDataLen);
                trace_mem((unsigned char *)bKeyData, iFieldDataLen);
                if(!cryptComm.SetWorkKey(pData->TransData.HeadData.arrRMerchNo,
                    pData->TransData.HeadData.arrRTermNo,/*pData->RcvBrchCode,pData->RcvBrchCode,*/(BYTE*) bKeyData, iFieldDataLen, 2))
                {
                    trace_log(ERR,"Set bank work key fail!");
                    return RET_RELOGIN;
                }
            }

        }else{
            trace_log(ERR, "Get security key failed!");
            return RET_RELOGIN;
        }
		//获取批次
		iFieldDataLen = rcvObj.GetValueByStr(60, (char *)bFieldData, sizeof(bFieldData));
		if(iFieldDataLen > 0)
		{
			memcpy(pData->BatchNo,bFieldData+2,6);
			memcpy(pTmpData.BatchNo,pData->BatchNo,6);
		}
		//获取签到日期
		iFieldDataLen = rcvObj.GetValueByStr(13, (char *)bFieldData, sizeof(bFieldData));
        if(0 != COperateDB::UpdateTermalState(saConn, bFieldData, &pTmpData))
            return RET_SYSEXP;
    }else{
        trace_log(ERR, "login in  failed!");
        return RET_SYSEXP;
    }

    trace_log(DBG,"sign in success");
    return RET_SUCCESS;
}