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; }
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); }
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; }
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; }
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; }