void LongQuery(void *addl) { if(WaitForSingleObject(hQueryMutex, 75L) == WAIT_TIMEOUT) { WaitForSingleObject(hScreenMutex, INFINITE); std::cout << "query still running, use 'C' to cancel it." << std::endl; ReleaseMutex(hScreenMutex); return; } try { g_Cmd.setCommandText(LONG_RUNNING_QUERY); WaitForSingleObject(hScreenMutex, INFINITE); std::cout << "executing " << (const char*)g_Cmd.CommandText() << std::endl; ReleaseMutex(hScreenMutex); g_Cmd.Execute(); WaitForSingleObject(hScreenMutex, INFINITE); std::cout << "executed" << std::endl; ReleaseMutex(hScreenMutex); } catch(SAException &x) { WaitForSingleObject(hScreenMutex, INFINITE); std::cout << (const char*)x.ErrText() << std::endl; ReleaseMutex(hScreenMutex); } ReleaseMutex(hQueryMutex); }
/**< 更新流水和批次 */ int COperateDB::SaveChannelInfo(SAConnection *pSaconn, TRADEDATA * pData) { if(pData == NULL || pSaconn == NULL) { trace_log(ERR, "parameter error!"); return -1; } SAString sSql; SACommand Cmd; try { Cmd.setConnection(pSaconn); sSql.Format("update T_CHANNEL_TERMINAL set CT_VOUCHNO='%s',CT_BATCHNO='%s' where CM_MCHT='%s'" "and CT_TMNL='%s' and CF_INTERFACE=%d and CT_STATUS = 1", pData->VouchNo, pData->BatchNo, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.nInterface); Cmd.setCommandText(sSql); Cmd.Execute(); pSaconn->Commit(); }catch(SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); throw; return -1; } return 0; }
void Oracle_Cancel() { SAConnection con2; SAConnection con; SACommand cmd2; SACommand cmd; cmd2.setConnection(&con2); cmd.setConnection(&con); try { con2.Connect( "test", "scott", "tiger", SA_Oracle_Client); //con.setOption("UseAPI") = "OCI7"; con.Connect( "test", "scott", "tiger", SA_Oracle_Client); // block cmd2.setCommandText("Update DEPT set DNAME=DNAME"); cmd2.Execute(); DWORD ThreadId; HANDLE hThread; hThread = ::CreateThread( NULL, 0, Oracle_Cancel_Thread, &con, 0, &ThreadId); WaitForSingleObject(hThread, 1000); cout << "Calling Cancel!" << endl; cmd.Open(); cmd.Cancel(); cout << "Cancel has been called!" << endl; WaitForSingleObject(hThread, 2000); cout << "Calling con2.Rollback()!" << endl; con2.Rollback(); cout << "con2.Rollback() has been called!" << endl; WaitForSingleObject(hThread, INFINITE); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message cout << (const char*)x.ErrText() << endl; } }
void InterBaseEvents() { SAConnection con; SACommand cmd; event_data_t event_data; try { con.Connect( "transfer:d:/temp/siemens/controller.gdb", // database name "sysdba", // user name "masterkey", // password SA_InterBase_Client); event_data.pibAPI = (ibAPI *)con.NativeAPI(); event_data.pibConnectionHandles = (ibConnectionHandles *)con.NativeHandles(); con.setAutoCommit(SA_AutoCommitOn); // register interest for "TestEvent" event event_data.length = event_data.pibAPI->isc_event_block( &event_data.event_buffer, &event_data.result_buffer, 1, "TestEvent"); event_data.que_events(); // this should fire event cmd.setConnection(&con); cmd.setCommandText("a"); cmd.Param("sEvent").setAsString() = "TestEvent"; cmd.Execute(); // wait for event to be fired getchar(); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message printf("Err = %s\nCode = %d\n", (const char*)x.ErrText(), x.ErrNativeCode()); } }
void OracleRefCursor() { SAConnection con; try { SACommand cmd(&con); con.Connect( "demo", "scott", "tiger", SA_Oracle_Client); cout << "Connected OK!" << "\n"; cmd.setCommandText("TestRefCursorPkg.TestRefCursorProc"); cmd.Execute(); cout << "Stored procedure executed OK!" << "\n"; SACommand *pRefCursor = cmd.Param("REFCURSOR"); while(pRefCursor->FetchNext()) { cout << (const char*)pRefCursor->Field(1).Name() << "=" << (const char*)pRefCursor->Field(1).asString() << "\n"; } cout << "Ref cursor fetched OK!" << "\n"; } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message cout << (const char*)x.ErrText() << "\n"; } }
DWORD WINAPI Oracle_Cancel_Thread(void *_pCon) { SAConnection *pCon = (SAConnection *)_pCon; SACommand cmd; cmd.setConnection(pCon); try { cmd.setCommandText("Update DEPT set DNAME=DNAME"); //cmd.setCommandText("sys.DBMS_PIPE.receive_message"); //cmd << SAPos("pipename") << "myPipe" << SAPos("timeout") << 10L; cout << "Calling Execute!" << endl; cmd.Execute(); cout << "Execute has been called!" << endl; } catch(SAException &x) { cout << "Oracle_Cancel_Thread: " << (const char*)x.ErrText() << endl; } return 0; }
int main(int argc, char* argv[]) { SAConnection con; // connection object SACommand cmd; // command object try { // connect to database (Oracle in our example) con.Connect("test", "tester", "tester", SA_Oracle_Client); // associate a command with connection cmd.setConnection(&con); // Insert 2 rows cmd.setCommandText( "Insert into test_tbl(fid, fvarchar20) values(:1, :2)"); // use first method of binding - param assignment cmd.Param(1).setAsLong() = 2; cmd.Param(2).setAsString() = "Some string (2)"; // Insert first row cmd.Execute(); // use second method of binding - stream binding cmd << (long)3 << "Some string (3)"; // Insert second row cmd.Execute(); // commit changes on success con.Commit(); printf("Input parameters bound, rows inserted!\n"); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message printf("%s\n", (const char*)x.ErrText()); } return 0; }
/**< 更新渠道某一终端的签到状态 */ int COperateDB::UpdateTermalState(SAConnection *pSaconn, BYTE *bDate, TRADEDATA *pData) { if(pSaconn == NULL ||pData == NULL) { trace_log(ERR, "Input Parameter error!"); return -1; } SAString sSql; SACommand Cmd; Cmd.setConnection(pSaconn); try{ sSql.Format("update t_channel_finance set cf_sign='1' where CF_INTERFACE=%d",pData->TransData.HeadData.nInterface); Cmd.setCommandText(sSql); Cmd.Execute(); sSql.Format("update T_CHANNEL_TERMINAL set CT_PARA1='%s',CT_PARA2='1',CT_PARA3='1' where CM_MCHT='%s' and CT_TMNL='%s' and CF_INTERFACE=%d", bDate, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.nInterface); Cmd.setCommandText(sSql); Cmd.Execute(); #if SoftEnc sSql.Format("update T_BANK_KEY set PINK='%s',MACK='%s',TRACK='%s' " "where MERNO='%s' and TERMNO='%s'", pData->bPinKey,pData->bMacKey,pData->bTdkKey, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo); trace_log(DBG, "sql=%s", _T(sSql)); Cmd.setCommandText(sSql); Cmd.Execute(); #endif pSaconn->Commit(); trace_log(DBG, "update successful. sql=%s", _T(sSql)); }catch (SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql)); return -1; } return 0; }
int main(int argc, char* argv[]) { SAConnection con; // connection object SACommand cmd; // create command object try { // connect to database (Oracle in our example) con.Connect("test", "tester", "tester", SA_Oracle_Client); // associate a command with connection // connection can also be specified in SACommand constructor cmd.setConnection(&con); // create table cmd.setCommandText( "Create table test_tbl(fid integer, fvarchar20 varchar(20), fblob blob)"); cmd.Execute(); // insert value cmd.setCommandText( "Insert into test_tbl(fid, fvarchar20) values (1, 'Some string (1)')"); cmd.Execute(); // commit changes on success con.Commit(); printf("Table created, row inserted!\n"); } catch(SAException &x) { // SAConnection::Rollback() // can also throw an exception // (if a network error for example), // we will be ready try { // on error rollback changes con.Rollback(); } catch(SAException &) { } // print error message printf("%s\n", (const char*)x.ErrText()); } return 0; }
void LongQueryCancel() { try { WaitForSingleObject(hScreenMutex, INFINITE); std::cout << "CANCELLING..." << std::endl; ReleaseMutex(hScreenMutex); g_Cmd.Cancel(); WaitForSingleObject(hScreenMutex, INFINITE); std::cout << "CANCELLED" << std::endl; ReleaseMutex(hScreenMutex); } catch(SAException &x) { WaitForSingleObject(hScreenMutex, INFINITE); std::cout << (const char*)x.ErrText() << std::endl; ReleaseMutex(hScreenMutex); } }
/**< 更新渠道流水 */ int COperateDB::MyAfterUpdateDB(SAConnection *pSaconn, TRADEDATA *pData, char status,char* respcode, char * respcode_desc) { if (pSaconn == NULL || pData == NULL) { trace_log(ERR, "Parameter error!"); return -1; } SAString sSql; SACommand Cmd; Cmd.setConnection(pSaconn); try { char DateTime[16]={0}; char cDate[5]={0}; int nTmpDataLen = 0; // 解tlv包 CTLVTemplet TlvObj; TlvObj.UnPackTLVData(pData->TransData.TlvDataLen,pData->TransData.TlvData); //获取银行交易时间 nTmpDataLen = TlvObj.GetTLVItemByHex(TAG_DATETIME, (BYTE *)DateTime, sizeof(DateTime)); if(nTmpDataLen > 0) { memcpy(cDate, DateTime, sizeof(cDate) -1); } /**< 更新交易流水表 */ if (4 > strlen(pData->TransData.HeadData.SettDate) || 10 > strlen(DateTime)) //判断时间日期不合法性 { sSql.Format("update T_CHANNEL_TRADELIST set CTL_CARDNO='%s', CTL_REFERENCE='%s',CTL_CUPTIME=nvl(TO_DATE('%s', 'MM-DD HH24:MI:SS'),CTL_CUPTIME), \ CTL_RECKON=nvl(TO_DATE('%s', 'MM-DD') + 1,ctl_reckon),CTL_AUTHCODE='%s', CTL_SATATE='%c',CTL_REPCODE='%s', CTL_DEMO='%s' where CTL_AUTOID = '%ld'", pData->TransData.HeadData.Account, pData->TransData.HeadData.SysRefNo,DateTime, cDate,pData->TransData.HeadData.OrigAuthCode, status, respcode,respcode_desc, pData->iRAutoId); }else{ sSql.Format("update T_CHANNEL_TRADELIST set CTL_CARDNO='%s', CTL_REFERENCE='%s', \ CTL_RECKON=TO_DATE('%s', 'MM-DD'),CTL_CUPTIME=nvl(TO_DATE('%s', 'MM-DD HH24:MI:SS'),CTL_CUPTIME), \ CTL_AUTHCODE='%s', CTL_SATATE='%c',CTL_REPCODE='%s', CTL_DEMO='%s' where CTL_AUTOID = '%ld'", pData->TransData.HeadData.Account, pData->TransData.HeadData.SysRefNo, pData->TransData.HeadData.SettDate, DateTime, pData->TransData.HeadData.OrigAuthCode, status, respcode,respcode_desc, pData->iRAutoId); } trace_log(DBG, "Sql: %s",_T(sSql)); Cmd.setCommandText(sSql); Cmd.Execute(); /**<取原交易的索引ID */ int nOrigAutoID = 0; POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType; if(posType < POS_PAYBACK && posType >=POS_UNCONSUME) { sSql.Format("select CTL_AUTOID from T_CHANNEL_TRADELIST where RTL_TLAUTOID='%ld'", pData->TransData.HeadData.nOrigLFlowID); Cmd.setCommandText(sSql); Cmd.Execute(); if(Cmd.FetchNext()) { nOrigAutoID = Cmd.Field("CTL_AUTOID").asLong(); trace_log(DBG, "CTL_AUTOID[%d]", nOrigAutoID); }else{ trace_log(ERR, "Get CTL_AUTOID fail[sql:%s]!", _T(sSql)); return -1; } } if(posType < POS_UNCONSUME || posType > POS_PAYBACK) { //保存冲正信息 sSql.Format("update T_CHANNEL_RESETLIST set FIELD12='%s',FIELD13='%s',FIELD15='%s',FIELD37='%s'," "FIELD39='%s' where FIELD41='%s' and FIELD42='%s' and FIELD11='%s' and CRT_BATCHNO='%s' " "and CRT_TYPE='%c'", DateTime + 4, cDate, pData->TransData.HeadData.SettDate, pData->TransData.HeadData.SysRefNo, pData->TransData.HeadData.RspCode, pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, pData->VouchNo, pData->BatchNo, posType); Cmd.setCommandText(sSql); Cmd.Execute(); trace_log(DBG, "Sql: %s", _T(sSql)); } //修改原交易状态 if(status == ST_SUCCESS && (posType == POS_REPEAL || posType == POS_PREAUTHREVE ||posType == POS_PREAUTHCPLREVE)) { //原交易状态改为已撤销 sSql.Format("update T_CHANNEL_TRADELIST set CTL_SATATE='%c' where CTL_AUTOID='%ld'",ST_HASRPL, nOrigAutoID); Cmd.setCommandText(sSql); Cmd.Execute(); }else if(posType >= POS_UNCONSUME && posType < POS_PAYBACK ){ if(strcmp(pData->TransData.HeadData.RspCode, "00") == 0 || strcmp(pData->TransData.HeadData.RspCode, "25") == 0) { //删除冲正信息 map<POS_TRADE_TYPE, POS_TRADE_TYPE> ::iterator it =CTradeDoReset::m_unTradeOrgMap.find( posType); if(it!=CTradeDoReset::m_unTradeOrgMap.end()) { sSql.Format("delete from T_CHANNEL_RESETLIST where FIELD41='%s' and FIELD42='%s' and FIELD13<>to_char(sysdate,'mmdd') and CRT_TYPE='%c'", pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.arrRMerchNo, it->second); Cmd.setCommandText(sSql); Cmd.Execute(); //交易状态改为已冲正 sSql.Format("update T_CHANNEL_TRADELIST set CTL_SATATE='%c' where CTL_AUTOID='%ld'",ST_HASRST, nOrigAutoID); Cmd.setCommandText(sSql); trace_log(DBG, "pData->VouchNo=%s, pData->BatchNo=%s", pData->VouchNo, pData->BatchNo); Cmd.Execute(); //更新原交易状态 if(posType == POS_UNREPEAL || posType == POS_UNPREAUTHREVE ||posType == POS_UNPREAUTHCPLREVE) { sSql.Format("select CTL_ORIGVOUCH,CTL_ORGIBATCH,CTL_TYPE from T_CHANNEL_TRADELIST where CTL_AUTOID = %d", nOrigAutoID); Cmd.setCommandText(sSql); Cmd.Execute(); if(Cmd.FetchNext()) { char cOrgBatch[7] = {0}; char cOrgVouch[7] = {0}; int nLen = Cmd.Field("CTL_ORIGVOUCH").asString().GetLength(); memcpy(cOrgVouch, Cmd.Field("CTL_ORIGVOUCH").asString(), nLen); nLen = Cmd.Field("CTL_ORGIBATCH").asString().GetLength(); memcpy(cOrgBatch, Cmd.Field("CTL_ORGIBATCH").asString(), nLen); char cType; memcpy(&cType, Cmd.Field("CTL_TYPE").asString(), 1); it =CTradeDoReset::m_unTradeOrgMap.find( (POS_TRADE_TYPE)cType); if(it!=CTradeDoReset::m_unTradeOrgMap.end()) { sSql.Format("update T_CHANNEL_TRADELIST set CTL_SATATE='%c' where CM_MCHT='%s' " "and CT_TMNL='%s' and CTL_TYPE='%c' and CTL_VOUCHNO='%s' and CTL_BATCHNO='%s'", ST_SUCCESS, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo, it->second, cOrgVouch, cOrgBatch); Cmd.setCommandText(sSql); Cmd.Execute(); trace_log(DBG, "Sql: %s", _T(sSql)); } } } } }else{ //更新冲正表 sSql.Format("update T_CHANNEL_RESETLIST set FIELD12='%s',FIELD13='%s',FIELD15='%s',FIELD39='%s' " "where FIELD41='%s' and FIELD42='%s' and FIELD11='%s' and CRT_BATCHNO='%s' and CRT_TYPE='%c'", DateTime + 4, cDate, pData->TransData.HeadData.SettDate, pData->TransData.HeadData.RspCode, pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, pData->VouchNo, pData->BatchNo, pData->TransData.HeadData.RTradeType); Cmd.setCommandText(sSql); Cmd.Execute(); } } pSaconn->Commit(); }catch (SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); return -1; } return 0; }
/**< 生成渠道流水 */ int COperateDB::MyBeforeInsertDB(SAConnection *pSaconn, TRADEDATA *pData) { if (pSaconn == NULL || pData == NULL) { trace_log(ERR, "Parameter error!"); return -1; } char cOrgVouchNo[8] = { 0 }; char cCurTime[15] = {0}; SAString sSql; SACommand Cmd; Cmd.setConnection(pSaconn); try { /**< 如果有原交易流水ID,则先取原交易流水号*/ if (pData->TransData.HeadData.nOrigLFlowID > 0) { sSql.Format("select CTL_VOUCHNO, CTL_BATCHNO, to_char(SYSDATE, 'yyyymmddHH24MISS') CTL_TIME, " "lpad(CTL_AMOUNT, 12, '0') CTL_AMOUNT, CTL_REFERENCE, CTL_AUTHCODE,to_char(CTL_CUPTIME,'mmddHH24MISS') ori_trandatetime from T_CHANNEL_TRADELIST" " where RTL_TLAUTOID='%ld'", pData->TransData.HeadData.nOrigLFlowID); Cmd.setCommandText(sSql); Cmd.Execute(); if (Cmd.FetchNext()) { // 左边没送金额才取原金额 if (atoi(pData->TransData.HeadData.ReqAmount) <= 0) strncpy(pData->TransData.HeadData.ReqAmount, (char *)_T(Cmd.Field("CTL_AMOUNT").asString()),Cmd.Field("CTL_AMOUNT").asString().GetLength()); if(Cmd.Field("CTL_VOUCHNO").asString().GetLength() > 0) { strncpy(cOrgVouchNo, (char *)_T(Cmd.Field("CTL_VOUCHNO").asString()), 6); memcpy(pData->TransData.HeadData.OrigLPosSeq, cOrgVouchNo,strlen(cOrgVouchNo)); //暂时将原流水号保存于该字段 trace_log(DBG,"[CTL_VOUCHNO]:%s ",_T(Cmd.Field("CTL_VOUCHNO").asString())); } if(Cmd.Field("CTL_BATCHNO").asString().GetLength() > 0) { //暂时将原批次号保存于OrigLBatchNo memcpy(pData->TransData.HeadData.OrigLBatchNo, Cmd.Field("CTL_BATCHNO").asString(),Cmd.Field("CTL_BATCHNO").asString().GetLength()); trace_log(DBG,"[CTL_BATCHNO]:%s ",_T(Cmd.Field("CTL_BATCHNO").asString())); } if(Cmd.Field("CTL_REFERENCE").asString().GetLength() > 0) { trace_log(DBG,"CTL_REFERENCE[%s]", _T(Cmd.Field("CTL_REFERENCE").asString())); memcpy(pData->TransData.HeadData.SysRefNo,_T(Cmd.Field("CTL_REFERENCE").asString()),Cmd.Field("CTL_REFERENCE").asString().GetLength()); } if(Cmd.Field("CTL_AUTHCODE").asString().GetLength() > 0) { trace_log(DBG,"CTL_AUTHCODE[%s]", _T(Cmd.Field("CTL_AUTHCODE").asString())); memcpy(pData->TransData.HeadData.OrigAuthCode,_T(Cmd.Field("CTL_AUTHCODE").asString()),Cmd.Field("CTL_AUTHCODE").asString().GetLength()); } if(Cmd.Field("ori_trandatetime").asString().GetLength()> 0) { memcpy(pData->cOri_DateTime,_T(Cmd.Field("ori_trandatetime").asString()),Cmd.Field("ori_trandatetime").asString().GetLength()); trace_log(DBG, "[trandatetime]:%s ", _T(Cmd.Field("ori_trandatetime").asString())); } } } /**< 获取自动编号和日期时间*/ sSql.Format("select SEQ_C_TRADELIST_ATUOID.NEXTVAL NEXTVAL, to_char(SYSDATE, 'yyyymmddHH24MISS') CURTIME from dual"); Cmd.setCommandText(sSql); Cmd.Execute(); if (Cmd.FetchNext()) { pData->iRAutoId = Cmd.Field("NEXTVAL").asLong(); int nLen = Cmd.Field("CURTIME").asString().GetLength(); if(nLen > 0) memcpy(cCurTime, _T(Cmd.Field("CURTIME").asString()), nLen); trace_log(DBG, "CURTIME[%s] ", cCurTime); }else{ trace_log(ERR, "Get NEXTVAL fail[sql:%s]!", _T(sSql)); return -1; } if(strlen(pData->TransData.HeadData.ReqAmount) == 0) strcpy(pData->TransData.HeadData.ReqAmount, "0"); //添加渠道手续费 long pTradeFee = 0; char cTime[9]={0}; memcpy(cTime,cCurTime,8); sSql.Format("insert into T_CHANNEL_TRADELIST(CTL_AUTOID, CF_INTERFACE, RTL_TLAUTOID, CT_TMNL, CM_MCHT, CTL_TYPE, CTL_CARDNO," "CTL_AMOUNT, CTL_VOUCHNO, CTL_BATCHNO, CTL_ORIGVOUCH, CTL_ORGIBATCH, CTL_TIME,CTL_RECKON,CTL_CUPTIME, CTL_SATATE, CTL_EXPENSE) " "values('%ld', '%d','%ld', '%s', '%s', '%c', '%s', '%s', '%s', '%s', '%s', '%s', to_date('%s','yyyymmddHH24MISS'),TO_DATE('%s', 'yyyymmdd') + 1, to_date('%s','yyyymmddHH24MISS'), '%c', '%ld')", pData->iRAutoId, pData->TransData.HeadData.nInterface, pData->TransData.HeadData.nLFlowID, pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.RTradeType, pData->TransData.HeadData.RTradeType == POS_SIGN ? "" : pData->TransData.HeadData.Account, pData->TransData.HeadData.ReqAmount, pData->VouchNo, pData->BatchNo, cOrgVouchNo, pData->TransData.HeadData.OrigLBatchNo, cCurTime, cTime, cCurTime,ST_HASSEND, pTradeFee); Cmd.setCommandText(sSql); trace_log(DBG, "Sql: %s",_T(sSql)); Cmd.Execute(); pSaconn->Commit(); }catch (SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); return -1; } return 0; }
/**< 获取渠道部分信息*/ int COperateDB::GetChannelInfo(SAConnection * pSaconn, TRADEDATA * pData) { if (NULL == pData || NULL == pSaconn) { trace_log(ERR, "GetChannelInfo: param error."); return -1; } int nLen = 0; char cDate[5] = {0}; char cCurTime[9] = {0}; struct tm stCurTime; time_t ltime; time( <ime ); localtime_xgd(<ime, &stCurTime); sprintf(cCurTime, "%4d%02d%02d", stCurTime.tm_year + 1900, stCurTime.tm_mon + 1,stCurTime.tm_mday); if(!pData->bIsLogin) { SAString sSql; SACommand Cmd; Cmd.setConnection(pSaconn); try{ sSql.Format("select cf_sign,cf_signdate from t_channel_finance where cf_interface =%d",pData->TransData.HeadData.nInterface ); Cmd.setCommandText(sSql); Cmd.Execute(); if(Cmd.FetchNext()) { char cDownSign[2]={0}; /**<是否所有的重新 签到 */ nLen = Cmd.Field("cf_sign").asString().GetLength(); if(nLen > 0) memcpy(cDownSign, Cmd.Field("cf_sign").asString(), nLen); nLen = Cmd.Field("cf_signdate").asString().GetLength(); if(nLen > 0) memcpy(cDate, Cmd.Field("cf_signdate").asString(), nLen); char cCurDate[32] = {0}; struct tm stCurTime; time_t ltime; time( <ime ); strftime(cCurDate, sizeof(cCurDate), "%Y%m%d%H%M%S", localtime_xgd(<ime, &stCurTime)); trace_log(DBG, "cDownSign = %s,cCurDate = %s",cDownSign,cCurDate); if(cDownSign[0] != '1' || strncmp(cDate, cCurDate+4, 4) != 0) { pData->bIsLogin = true; } }else{ trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql)); return -1; } sSql.Format("select m.cm_name, t.CT_VOUCHNO,t.CT_BATCHNO from T_CHANNEL_MERCHANT m,T_CHANNEL_TERMINAL t " " where m.cf_interface=t.CF_INTERFACE and m.cm_mcht=t.CM_MCHT and t.CT_STATUS = '1' and t.CM_MCHT = '%s' and t.CT_TMNL = '%s' and t.CF_INTERFACE=%d", pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.nInterface); Cmd.setCommandText(sSql); Cmd.Execute(); if(Cmd.FetchNext()) { /**< 流水号 */ nLen = Cmd.Field("CT_VOUCHNO").asString().GetLength(); if(nLen > 0) { memcpy(pData->VouchNo, Cmd.Field("CT_VOUCHNO").asString(), nLen); trace_log(DBG, "pData->VouchNo = %s", pData->VouchNo); }else{ memcpy(pData->VouchNo,"000001",6); trace_log(DBG, "pData->VouchNo = 000001"); } /**< 批次号 */ nLen = Cmd.Field("CT_BATCHNO").asString().GetLength(); if(nLen > 0) { memcpy(pData->BatchNo, Cmd.Field("CT_BATCHNO").asString(), nLen); trace_log(DBG, "pData->BatchNo = %s", pData->BatchNo); }else{ memcpy(pData->BatchNo, "000001", 6); trace_log(DBG, "pData->BatchNo = %s", "000001"); } }else{ trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql)); return -1; } #if SoftEnc sSql.Format("select TMK,PINK,MACK,TRACK from T_BANK_KEY where MERNO = '%s' and TERMNO = '%s'",pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo); Cmd.setCommandText(sSql); Cmd.Execute(); if(Cmd.FetchNext()) { nLen = Cmd.Field("TMK").asString().GetLength(); if(nLen > 0) memcpy(pData->bMainKey, Cmd.Field("TMK").asString(), nLen); nLen = Cmd.Field("PINK").asString().GetLength(); if(nLen > 0) memcpy(pData->bPinKey, Cmd.Field("PINK").asString(), nLen); nLen = Cmd.Field("MACK").asString().GetLength(); if(nLen > 0) memcpy(pData->bMacKey, Cmd.Field("MACK").asString(), nLen); nLen = Cmd.Field("TRACK").asString().GetLength(); if(nLen > 0) memcpy(pData->bTdkKey, Cmd.Field("TRACK").asString(), nLen); }else{ trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql)); return -1; } #endif return 0; }catch (SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql)); return -1; } } return 0; }
/** \brief * 获取冲正数据 * \param * \param * \return * */ int COperateDB::GetResetData(SAConnection *pSaconn, TRADEDATA *pData, CUPS8583 *sendObj) { SAString sSql,str; SACommand Cmd; Cmd.setConnection(pSaconn); try { POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType; map<POS_TRADE_TYPE, POS_TRADE_TYPE> ::iterator it =CTradeDoReset::m_unTradeOrgMap.find( posType); if(it==CTradeDoReset::m_unTradeOrgMap.end()) { trace_log(ERR,"No the Reset trade"); return -1; } sSql.Format("select FIELD2,FIELD3,FIELD4,FIELD11,FIELD22,FIELD35,FIELD36,FIELD38,FIELD41," "FIELD42,FIELD48,FIELD49 from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s'" " and FIELD42='%s' and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq, pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, it->second, pData->TransData.HeadData.OrigLBatchNo); Cmd.setCommandText(sSql); Cmd.Execute(); if(!Cmd.FetchNext()) { trace_log(ERR, " no found the original trans sql=[%s]!", _T(sSql)); memcpy(pData->TransData.HeadData.RspCode, "25",2); return RET_SYSEXP; } //2账号 sendObj->SetValueByStr(2, _T(Cmd.Field("FIELD2").asString())); //3处理码 sendObj->SetValueByStr(3, _T(Cmd.Field("FIELD3").asString())); //4金额 sendObj->SetValueByStr(4, _T(Cmd.Field("FIELD4").asString())); //22 输入方式 sendObj->SetValueByStr(22, _T(Cmd.Field("FIELD22").asString())); //35 二磁道 str = Cmd.Field("FIELD35").asString(); if(str.GetLength() > 0) { sendObj->SetValueByStr(35, _T(str)); } //36 三磁道 str = Cmd.Field("FIELD36").asString(); if(str.GetLength() > 0) { sendObj->SetValueByStr(36, _T(str)); } //38 预授权 str = Cmd.Field("FIELD38").asString(); if(str.GetLength() > 0) { sendObj->SetValueByStr(38, _T(str)); } //41终端号 sendObj->SetValueByStr(41, _T(Cmd.Field("FIELD41").asString())); //42商户号 sendObj->SetValueByStr(42, _T(Cmd.Field("FIELD42").asString())); //48 自定义域 str = Cmd.Field("FIELD48").asString(); if(str.GetLength() > 0) { sendObj->SetValueByStr(48, _T(str)); } //49 货币代码 sendObj->SetValueByStr(49, _T(Cmd.Field("FIELD49").asString())); //62原始交易信息(信息类型码,系统跟踪号,交易日期和时间) char cData[7]={0},cTran[5]={0}; BYTE bTmpData[FIELD_MAXLEN]={0}; if( posType==POS_UNPREAUTH||posType==POS_UNPREAUTHREVE) { strcpy(cTran,"0100");/**< 预授权和预授权撤销为‘0100’ ,别的四个交易类型为‘0200’*/ }else{ strcpy(cTran,"0200"); } memcpy(cData,Cmd.Field("FIELD11").asString(),Cmd.Field("FIELD11").asString().GetLength()); memset(bTmpData, 0, sizeof(bTmpData)); sprintf((char *)bTmpData, "%s%s%s",cTran, cData,pData->cOri_DateTime); sendObj->SetValueByStr(62, (char *)bTmpData); return 0; }catch (SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); return -1; } }
/**< 生成冲正数据 */ int COperateDB::BuildResetData(SAConnection *pSaconn, TRADEDATA *pData, CUPS8583 * sendObj) { if (pSaconn == NULL || sendObj == NULL) { trace_log(ERR, "Parameter error!"); return -1; } SAString sSql; SACommand Cmd; Cmd.setConnection(pSaconn); try { if (sendObj != NULL) { trace_log(DBG,"COperateDB::BuildResetData start"); char Field02[32]={0}; if(sendObj->FieldExist(2)) sendObj->GetValueByStr(2, Field02, sizeof(Field02)); char Field03[32]={0}; if(sendObj->FieldExist(3)) sendObj->GetValueByStr(3, Field03, sizeof(Field03)); char Field04[32]={0}; //金额不能为NULL 否则DB2会报错 if(sendObj->FieldExist(4)) sendObj->GetValueByStr(4, Field04, sizeof(Field04)); char Field11[32]={0}; if(sendObj->FieldExist(11)) sendObj->GetValueByStr(11, Field11, sizeof(Field11)); char Field14[32]={0}; if(sendObj->FieldExist(14)) sendObj->GetValueByStr(14, Field14, sizeof(Field14)); char Field22[32]={0}; if(sendObj->FieldExist(22)) sendObj->GetValueByStr(22, Field22, sizeof(Field22)); char Field32[32]={0}; if(sendObj->FieldExist(32)) sendObj->GetValueByStr(32, Field32, sizeof(Field32)); char Field33[32]={0}; if(sendObj->FieldExist(33)) sendObj->GetValueByStr(33, Field33, sizeof(Field33)); char Field35[128]={0}; if(sendObj->FieldExist(35)) sendObj->GetValueByStr(35, Field35, sizeof(Field35)); char Field36[256]={0}; if(sendObj->FieldExist(36)) sendObj->GetValueByStr(36, Field36, sizeof(Field36)); char Field38[32]={0}; if(sendObj->FieldExist(38)) sendObj->GetValueByStr(38, Field38, sizeof(Field38)); char Field41[16]={0}; if(sendObj->FieldExist(41)) sendObj->GetValueByStr(41, Field41, sizeof(Field41)); char Field42[32]={0}; if(sendObj->FieldExist(42)) sendObj->GetValueByStr(42, Field42, sizeof(Field42)); char Field48[512] ={0}; if(sendObj->FieldExist(48)) sendObj->GetValueByStr(48, Field48, sizeof(Field48)); char Field49[16]={0}; if(sendObj->FieldExist(49)) sendObj->GetValueByStr(49, Field49, sizeof(Field49)); char Field60[128]={0}; if(sendObj->FieldExist(60)) sendObj->GetValueByStr(60, Field60, sizeof(Field60)); //撤销时,保存的流水号和批次号是当前的 char Field62[128]={0}; if(pData->TransData.HeadData.RTradeType >= 0x71 && pData->TransData.HeadData.RTradeType <= 0x74) sprintf(Field62, "%s%s", pData->VouchNo, pData->BatchNo); else if(sendObj->FieldExist(62)) sendObj->GetValueByStr(62, Field62, sizeof(Field62)); //保存渠道冲正信息 sSql.Format("insert into T_CHANNEL_RESETLIST(CF_INTERFACE,FIELD2,FIELD3,FIELD4,FIELD11,FIELD13,FIELD14,FIELD22," "FIELD32,FIELD33,FIELD38,FIELD41,FIELD42,FIELD48,FIELD49,FIELD60,FIELD62,CRT_TYPE,CRT_BATCHNO) " "values('%d', '%s','%s','%ld','%s', to_char(sysdate,'mmdd'),'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%c','%s')", pData->TransData.HeadData.nInterface,Field02,Field03,atoi(Field04),Field11,Field14,Field22,Field32,Field33,Field38,Field41,Field42, Field48,Field49,Field60,Field62,pData->TransData.HeadData.RTradeType, pData->BatchNo); Cmd.setCommandText(sSql); trace_log(DBG, "SQL = [insert T_CHANNEL_RESETLIST:%s]", _T(sSql)); Cmd.Execute(); pSaconn->Commit(); trace_log(DBG,"COperateDB::BuildResetData end"); } }catch (SAException &e){ pSaconn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; }catch (...){ trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); return -1; } return 0; }
int OnSynData(QUEUE_LIST *pDataNode) { thd_log(LOG_DEBUG,(char *)"OnSynData..."); int MSGLength = pDataNode->Length; //报文(MSG) unsigned char *pMSG = pDataNode->Buffer; //应先判断pMSG长度 看主账号这些数据是否存在 pMSG++; MSGLength--; int iFlag = pMSG[0]; int UpdateNum = 0; const int MerNoLen = MERNOLENGTH; char MerNo[MERNOLENGTH+1] = {0}; char Mer_PosNo[1025] = {0}; char SID[11][51] = {{0}}; int DataLen = 0; int iCount = 0; if(iFlag == 1) { //在数据库中判断IsNew是否为1(1为新添加数据,需要SPOS同步),循环每次取10条记录 try { SAString sSql; SACommand Cmd; Cmd.setConnection(pDataNode->psaConn); sSql.Format("select count(*) as num from t_pos_key where isnew = 1 "); thd_log( LOG_DEBUG,"OnSynData,sSQL: %s", _T(sSql)); Cmd.setCommandText(sSql); Cmd.Execute(); if (Cmd.FetchNext()) { UpdateNum = Cmd.Field("num").asShort(); } else { thd_log(LOG_WARNING,(char *)"OnSynData, Port[%d] Peer[%d] : There's no data in t_pos_key!", pDataNode->SrvrPort, pDataNode->PeerSockId); return 0; } } catch(SAException &x) { thd_log( LOG_ERROR,(char *)"OnSynData, SQLAPI Exception %s", _T(x.ErrText())); setCmdError(pDataNode); return 0; } if(UpdateNum != 0) { try { SAString sSql; SACommand Cmd; Cmd.setConnection(pDataNode->psaConn); sSql.Format("select sid,merno,posno,adddate from t_pos_key where isnew = 1 and rownum <=10"); thd_log( LOG_DEBUG,"OnSynData, sSQL: %s", _T(sSql)); Cmd.setCommandText(sSql); Cmd.Execute(); while(Cmd.FetchNext()) { strcpy(SID[iCount],_T(Cmd.Field("sid").asString())); strcpy(MerNo,_T(Cmd.Field("merno").asString())); int tmpLen = strlen(MerNo); if(tmpLen < 20) { memset(&MerNo[tmpLen],' ',20-tmpLen); } memcpy(&Mer_PosNo[DataLen],MerNo,MerNoLen); DataLen += MerNoLen; memcpy(&Mer_PosNo[DataLen],_T(Cmd.Field("posno").asString()),POSNOLENGTH); DataLen += POSNOLENGTH; memcpy(&Mer_PosNo[DataLen],_T(Cmd.Field("adddate").asString()),8); //2011-09-08修改:同步时加上增加日期 DataLen += 8; //2011-09-08修改:同步时加上增加日期 iCount++; } } catch(SAException &x) { thd_log( LOG_ERROR,(char *)"OnSynData, SQLAPI Exception %s", _T(x.ErrText())); setCmdError(pDataNode); return 0; } int iOutLen = 0; // 输出缓存 char OutBuf[1024]; memset(OutBuf, 0, sizeof(OutBuf)); OutBuf[iOutLen] = pDataNode->Buffer[0]; iOutLen += 1; OutBuf[iOutLen] = CMD_OK; iOutLen += 1; OutBuf[iOutLen] = iCount; iOutLen += 1; memcpy(&OutBuf[iOutLen],Mer_PosNo,iCount*(MerNoLen+POSNOLENGTH)); iOutLen += iCount*(MerNoLen+POSNOLENGTH +8); //2011-09-08修改:同步时加上增加日期 memcpy(pDataNode->Buffer, OutBuf, iOutLen); pDataNode->Length = iOutLen ; thd_log(LOG_DEBUG,(char *)"OnSynData, Output Buffer Data:"); trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,iOutLen); //更新数据库的IsNew字段 try { SAString sSql; SACommand Cmd; Cmd.setConnection(pDataNode->psaConn); sSql.Format("update t_pos_key set isnew= 0 where sid = '%s' or sid = '%s' or sid = '%s' or sid = '%s' or \ sid = '%s' or sid = '%s' or sid = '%s' or sid = '%s' or sid = '%s'or sid = '%s'",\ SID[0] ,SID[1],SID[2],SID[3],SID[4],SID[5],SID[6],SID[7],SID[8],SID[9]); thd_log(LOG_DEBUG,(char *) "OnSynData, sSQL: %s", _T(sSql)); Cmd.setCommandText(sSql); Cmd.Execute(); } catch(SAException &x) { thd_log( LOG_ERROR,(char *)"OnSynData, SQLAPI Exception %s", _T(x.ErrText())); return false; } } else //所有数据同步完毕 返回个数0给spos { pDataNode->Buffer[1] = CMD_OK; pDataNode->Buffer[2] = 0x00; pDataNode->Length = 3; thd_log(LOG_DEBUG,(char *)"OnSynData, Output Buffer Data:"); trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,pDataNode->Length); } } else { setCmdError(pDataNode); } return 1; }
int OnGetRandom(QUEUE_LIST *pDataNode) { thd_log(LOG_DEBUG,(char *)"OnGetRandom...Received Data:"); trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,pDataNode->Length); int MSGLength = pDataNode->Length; unsigned char *pMSG = pDataNode->Buffer; // pMSG++; MSGLength--; int iOffset = 0; int DownKeyLen = 0; char DownKey[49] = {0}; char TermNo[17] = {0}; unsigned char TRD[9] = {0}; //加密机产生的随机数据,TTEK加密后送给SPOS服务器 // 输出缓存 char OutBuf[1025] = {0}; char EDownKey[17] = {0}; char chTRD[17] = {0}; unsigned char KeyRandom[8] = {0xD6, 0xA7, 0xB8, 0xB6, 0xCE, 0xDE, 0xD3, 0xC7}; //固定密钥 用来加密终端随机数 char TermNo1[9] = {0}; int iFlag = 0; iOffset += MERNOLENGTH; MSGLength -= MERNOLENGTH; memcpy(TermNo,&pMSG[iOffset],BANKNOLENGTH); // memcpy(TermNo,TermNo,8); //TermNo1 = trim(TermNo); memcpy(TermNo1,TermNo,8); iOffset += BANKNOLENGTH; MSGLength -= BANKNOLENGTH; iFlag = pMSG[iOffset]; //标志位:0:产生随机数;1:密钥下载密码 iOffset += 1; MSGLength -= 1; if(iFlag == 1) { DownKeyLen = pMSG[iOffset]; // 密钥下载密码长度 if(DownKeyLen%8 != 0) { setCmdError2(pDataNode); thd_log(LOG_WARNING,(char *)"OnGetRandom, Data Length is not 8 multiples !"); return 1; } // thd_log(LOG_DEBUG,(char *)"OnGetRandom, Data Length : %d",DownKeyLen); iOffset += 1; MSGLength -= 1; memcpy(DownKey,&pMSG[iOffset],DownKeyLen); //随机数/密钥下载密码 } else if(iFlag == 0) //需要产生随机数 { GetRandom((unsigned char *)DownKey,8); //随机数长度为8 ////测试数据,固定随机数 /* DownKey[0] = 0x88; DownKey[1] = 0x77; DownKey[2] = 0x66; DownKey[3] = 0x55; DownKey[4] = 0x44; DownKey[5] = 0x33; DownKey[6] = 0x22; DownKey[7] = 0x11;*/ ///////////// DownKeyLen = 8; memcpy(TRD,DownKey,8) ; DesEncrypt(1,TRD,TRD,8,KeyRandom); //将随机数用固定密钥加密存放到数据库 bcd2asc(chTRD,(unsigned char *)TRD,8); /*将产生的随机数根据终端号保存到数据库t_bank_key 的random字段*/ SAString sSql; SACommand Cmd; try { Cmd.setConnection(pDataNode->psaConn); sSql.Format("update t_bank_key set random = trim('%s') where termno = trim('%s') ", chTRD,TermNo); Cmd.setCommandText(sSql); Cmd.Execute(); } catch(SAException &x) { thd_log( LOG_ERROR,(char *)"SQLAPI Exception %s", _T(x.ErrText())); thd_log( LOG_ERROR,(char *)"sSQL: %s", _T(sSql)); return false; } } thd_log(LOG_DEBUG,(char *)"OnGetRandom...Random Data:"); trace_mem(LOG_DEBUG,(unsigned char *)DownKey,8); unsigned char TTEK[17] ={0}; if( !CountTTEK(TermNo1, TTEK) ) //用终端号计算TTEK { setCmdError2(pDataNode); return 1; } Des3Encrypt(1,(unsigned char *)EDownKey,(unsigned char *)DownKey,8,TTEK); //用产生的TTEK加密随机数或者下载密钥,返回给服务器 int iOutLen = 0; iOutLen = 2+MERNOLENGTH+POSNOLENGTH+1; setCmdToSeverSucceed(pDataNode,iOutLen,OutBuf); OutBuf[iOutLen] = DownKeyLen; iOutLen += 1; if(DownKeyLen > 1023) { setCmdError2(pDataNode); thd_log(LOG_WARNING,(char *)"OnGetRandom, Track Data Length from HSM is too long!"); return 1; } memcpy(&OutBuf[iOutLen],EDownKey,DownKeyLen); iOutLen += DownKeyLen; memset(pDataNode->Buffer,0,1024); memcpy(pDataNode->Buffer, OutBuf, iOutLen); pDataNode->Length = iOutLen ; thd_log(LOG_DEBUG,(char *)"OnGetRandom, Output Buffer Data:"); trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,iOutLen); return 1; }
int OnEncrypt0405(QUEUE_LIST *pDataNode) //PinBlock转换,将终端加密的PinBlock转换为成员行密钥加密的PinBlock并将转换后的PinBlock发给sever,再传给银行 { thd_log(LOG_DEBUG,(char *)"OnEncrypt0405...Received Data:"); trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,pDataNode->Length); int MSGLength = pDataNode->Length; //报文(MSG) unsigned char *pMSG = pDataNode->Buffer; //应先判断pMSG长度 看主账号这些数据是否存在 pMSG++; MSGLength--; int iOffset = 0; char MerNo[MERNOLENGTH+1] = {0}; char TermNo[BANKNOLENGTH+1] = {0}; char destype; char data[9]= {0}; //加密机返回的转换后data memcpy(MerNo,&pMSG[0],MERNOLENGTH); iOffset += MERNOLENGTH; //加字节商户号 MSGLength -=MERNOLENGTH; memcpy(TermNo, &pMSG[iOffset], BANKNOLENGTH); iOffset += BANKNOLENGTH; //加16字节银行终端号 MSGLength -= BANKNOLENGTH; //char flag; // flag = pMSG[iOffset]; //标志位‘0’:不对PINBLOCK作特殊处理 ,‘1’:对PINBLOCK作特殊处理 // iOffset += 1; // MSGLength -=1; destype = pMSG[iOffset]; //加密类型 iOffset += 1; MSGLength -=1; memcpy(data,&pMSG[iOffset],8); //转换前PinBlock iOffset += 8; MSGLength -=8; int macklen = 0; unsigned char mack[33] = {0}; try { SAString sSql; SACommand Cmd; Cmd.setConnection(pDataNode->psaConn); sSql.Format("select b.MACKLEN,b.MACK from t_bank_key b where b.termno = trim('%s') and b.merno =trim('%s') ", TermNo,MerNo); thd_log(LOG_DEBUG,(char *) "sSQL: %s", _T(sSql)); Cmd.setCommandText(sSql); Cmd.Execute(); if (Cmd.FetchNext()) { macklen = Cmd.Field("MACKLEN").asShort(); asc2bcd(mack,(char*)_T(Cmd.Field("MACK").asString())); //t_bank_key数据库中查找pink; thd_log(LOG_DEBUG,(char *) "MACK :"); trace_mem(LOG_DEBUG, mack, 32); } else { thd_log(LOG_WARNING,(char *)"Port[%d] Peer[%d] Terminal[%s]: There's no MacK in t_bank_key!", pDataNode->SrvrPort, pDataNode->PeerSockId, TermNo); return false; } } catch(SAException &x) { thd_log( LOG_ERROR,(char *)"OnEncrypt0405, SQLAPI Exception %s", _T(x.ErrText())); return false; } char OutBuf[1024]; // 输出缓存 memset(OutBuf, 0, sizeof(OutBuf)); if(!PospEncryptPin(g_Cfg.forbankwk, destype, macklen, mack, data, pDataNode)) { setCmdError1(pDataNode); return 1; } int iOutLen = 0; /* iOffset = 0; memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[0] ,1); //指令号CMD iOutLen++; OutBuf[iOutLen] = CMD_OK; //执行SQL成功 iOutLen++; ///////////////////////////// //2011-07-01:修改协议,返回数据加上商户号和终端号 memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[iOffset] ,MERNOLENGTH); iOutLen += MERNOLENGTH; iOffset += MERNOLENGTH; memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[iOffset] ,POSNOLENGTH); iOutLen += POSNOLENGTH; iOffset += POSNOLENGTH; memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[iOffset] ,BANKNOLENGTH); iOutLen += BANKNOLENGTH; iOffset += BANKNOLENGTH; /////////////////////////////////*/ iOutLen = 2+MERNOLENGTH+BANKNOLENGTH; setCmdToSeverSucceed(pDataNode,iOutLen,OutBuf); memcpy(&OutBuf[iOutLen],data,8); //加密机返回的转换后的PinBlock iOutLen += 8; memcpy(pDataNode->Buffer, OutBuf, iOutLen); pDataNode->Length = iOutLen ; thd_log(LOG_DEBUG,(char *)"OnEncrypt0405, Output Buffer Data:"); trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,iOutLen); return 1; }
//CMD_EXECSQL //远程客户端请求执行SQL //请求: [B0: 协议字] [B1:是否需要返回结果集] [B2~B5: 请求的起始记录号] [B6~B9: 最大返回的记录数] [B10~Bn: SQL语句] //响应: [B0: 协议字] [B1: 执行结果0|1] [B2: 是否还有后续数据0|1] [B3..Bn: CDS结果集] int OnExecSQL(QUEUE_LIST *pDataNode) { #ifdef _SUPPORT_CLITR //支持客户端事务连接 if (NULL != pDataNode->psaConn) { SAConnection *p = pDataNode->pCliTr->getCliTrConn(pDataNode->SrvrPort, pDataNode->PeerSockId); if (p) pDataNode->psaConn = p; } #endif //报文(MSG) unsigned char *p = pDataNode->Buffer; p++; int iStartRecNo, iMaxCount, iSqlLen; bool bNeedReturnData = (*p == 1); p++; P2DW(iStartRecNo, p); p += 4; P2DW(iMaxCount, p); p += 4; P2W(iSqlLen, p); p += 2; if (iSqlLen > 8 * ONE_PACKSIZE) { setCmdError(pDataNode); return 1; } unsigned char *pSQL = (unsigned char *) GetMem(iSqlLen + 1); memcpy(pSQL, p, iSqlLen); pSQL[iSqlLen] = 0; thd_log(LOG_DEBUG,"Execute SQL: %s", pSQL); SACommand saCmd; try{ saCmd.setConnection(pDataNode->psaConn); saCmd.setCommandText(_TSA(pSQL)); saCmd.Execute(); } catch(SAException &x) { thd_log( LOG_ERROR,(char *)"SQLAPI Exception %s", _T(x.ErrText())); setCmdError(pDataNode); return 1; } p = &pDataNode->Buffer[1]; int iOutLen = 1; *p++ = CMD_OK; //执行SQL成功 iOutLen++; *p++ = 0x0; iOutLen++; //不需要返回数据 if (!bNeedReturnData) { //m_pDataNode->psaConn->Commit(); int rowUpd = saCmd.RowsAffected(); //更新的记录数 W2P(p, rowUpd); iOutLen += 2; pDataNode->Length = iOutLen; FreeMem(pSQL); return 1; } bool bHasNext = false; p += 2; //返回数据 int iRet = CopyDataSet(&bHasNext, p, ALL_PACKSIZE, &saCmd, iStartRecNo, iMaxCount); p -= 2; W2P(p, iRet); //记录集大小 if (bHasNext) pDataNode->Buffer[2] = 0x1; //存在未返回记录 iOutLen += 2 + iRet; pDataNode->Length = iOutLen; thd_log(LOG_DEBUG,"cdsfmt2 len = %d",pDataNode->Length); trace_mem( LOG_DEBUG,pDataNode->Buffer, pDataNode->Length); FreeMem(pSQL); return 1; }
void Oracle_OCI_ATTR_CHARSET_FORM_OCI_ATTR_CHARSET_ID() { SAConnection con; SACommand cmd; cmd.setConnection(&con); try { con.Connect("cit", "dwadm", "dwadm", SA_Oracle_Client); bool bDropTable = !false; bool bCreateTable = !false; if(bDropTable) { cmd.setCommandText( "drop table test_charset"); cmd.Execute(); } if(bCreateTable) { cmd.setCommandText( "Create table test_charset (f1 nchar(254), f2 char(254))"); cmd.Execute(); } cmd.setCommandText("delete from test_charset"); cmd.Execute(); cmd.setCommandText("insert into test_charset values (:1, :2)"); cmd.Param(1).setOption("OCI_ATTR_CHARSET_FORM") = "SQLCS_NCHAR"; cmd.Param(1).setOption("OCI_ATTR_CHARSET_ID") = "171"; cmd.Param(2).setOption("OCI_ATTR_CHARSET_ID") = "CL8MSWIN1251"; cmd.Param(1).setAsString() = "string f1 - 1"; cmd.Param(2).setAsValueRead() = cmd.Param(1); cmd.Execute(); cmd.Param(1).setAsString() = "������ f1 - 2"; cmd.Param(2).setAsValueRead() = cmd.Param(1); cmd.Execute(); cmd.setCommandText("select * from test_charset"); cmd.Execute(); cmd.Field(1).setOption("OCI_ATTR_CHARSET_ID") = "171"; cmd.Field(2).setOption("OCI_ATTR_CHARSET_ID") = "CL8MSWIN1251"; while(cmd.FetchNext()) { cout << (const char*)cmd[1].asString() << "" << (const char*)cmd[2].asString() << endl; } } catch(SAException &x) { try { con.Rollback(); } catch(SAException &) { } printf("%s\n", (const char*)x.ErrText()); } }
//冲正 int CTradeDoReset::DoPack(SAConnection *saConn, void * pNode, unsigned char * pBuffer, unsigned & iBufLen) { if(saConn == NULL || pNode == NULL || pBuffer == NULL) { trace_log(ERR, "Paramter error!"); return RET_SYSEXP; } TRADEDATA * pData = (TRADEDATA *)pNode; CTLVTemplet tlvObj; if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData)) { trace_log(ERR, "UnPackTLVData fail!"); return RET_SYSEXP; } bool bFlag = true; //unsigned char cFieldData[FIELD_MAXLEN]={0}, bFieldData[FIELD_MAXLEN]={0}, //unsigned int iFieldDataLen = 0; POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType; if(m_unTradeOrgMap.empty()) initTredeTypeMap(); //冲正的时候不能隔批次 if(strcmp(pData->BatchNo, pData->TransData.HeadData.OrigLBatchNo)) { trace_log(ERR, "The original BatchNo is different with the current one"); return RET_SYSEXP; } SAString sSql; SACommand Cmd; Cmd.setConnection(saConn); try { //trace_log(DBG, "posType = %c, m_unTradeOrgMap[posType] = %c", posType, m_unTradeOrgMap[posType]); sSql.Format("select FIELD2,FIELD3,FIELD4,FIELD11,FIELD14,FIELD22,FIELD32,FIELD33,FIELD35,FIELD36,FIELD41," "FIELD42,FIELD48,FIELD49,FIELD60,FIELD62 from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s'" " and FIELD42='%s' and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq, pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, m_unTradeOrgMap[posType], pData->TransData.HeadData.OrigLBatchNo); Cmd.setCommandText(sSql); Cmd.Execute(); if(!Cmd.FetchNext()) { trace_log(ERR, "select original trade record fail[%s]!", _T(sSql)); strcpy(pData->TransData.HeadData.RspCode, "25"); return RET_SYSEXP; } //0消息类型 bFlag &= sndObj.SetValueByStr(0, "0420"); //2账号 bFlag &= sndObj.SetValueByStr(2, _T(Cmd.Field("FIELD2").asString())); //3处理码 bFlag &= sndObj.SetValueByStr(3, _T(Cmd.Field("FIELD3").asString())); //4金额 bFlag &= sndObj.SetValueByStr(4, _T(Cmd.Field("FIELD4").asString())); //11流水号:此处需要新流水号,而62域要原流水号 bFlag &= sndObj.SetValueByStr(11, pData->VouchNo); //14 卡有效期 SAString str = Cmd.Field("FIELD14").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(14, _T(str)); } if( posType >= 0x63 && posType <= 0x66) { //22 输入方式 bFlag &= sndObj.SetValueByStr(22, _T(Cmd.Field("FIELD22").asString())); //35 二磁道 str = Cmd.Field("FIELD35").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(35, _T(str)); } //36 三磁道 str = Cmd.Field("FIELD36").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(36, _T(str)); } //48 自定义域 str = Cmd.Field("FIELD48").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(48, _T(str)); } //49 货币代码 bFlag &= sndObj.SetValueByStr(49, _T(Cmd.Field("FIELD49").asString())); } //32 受理机构代码 bFlag &= sndObj.SetValueByStr(32, _T(Cmd.Field("FIELD32").asString())); //33 发送机构代码 bFlag &= sndObj.SetValueByStr(33, _T(Cmd.Field("FIELD33").asString())); //41 终端号 bFlag &= sndObj.SetValueByStr(41, _T(Cmd.Field("FIELD41").asString())); //42 商户号 bFlag &= sndObj.SetValueByStr(42, _T(Cmd.Field("FIELD42").asString())); //60 bFlag &= sndObj.SetValueByStr(60, _T(Cmd.Field("FIELD60").asString())); //62 bFlag &= sndObj.SetValueByStr(62, _T(Cmd.Field("FIELD62").asString())); } catch (SAException &e) { saConn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; } catch (...) { trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); return -1; } //64MAC bFlag &= sndObj.SetValueByHex(64, (unsigned char*)"00000000", 8); //组包 iBufLen = PACK_MAXLEN; bFlag &= sndObj.Pack(pBuffer, iBufLen); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //计算Mac bool bIsOrg = true; int nReturn = CalcMac(bIsOrg, iBufLen, pBuffer, pData); if(nReturn) { trace_log(ERR, "Calc Mac failed!"); return nReturn; } return RET_SUCCESS; }
int OnExecProc(QUEUE_LIST *pDataNode) { //报文(MSG) unsigned char *p = pDataNode->Buffer; p++; char ProcName[255]; memset(ProcName, 0, sizeof(ProcName)); int iProcNameLen, iInputParaNums, iOutputParaNums; P2W(iProcNameLen, p); p += 2; memcpy(ProcName, p, iProcNameLen); p += iProcNameLen; // 输入参数个数 P2W(iInputParaNums, p); p += 2; SACommand Cmd; Cmd.setConnection(pDataNode->psaConn); Cmd.setCommandText(ProcName); char ParaName[255], ParaVaule[255]; int iLen; for (int i = 0; i < iInputParaNums; i++) { BYTE ParaType = *p; p++; memset(ParaName, 0, sizeof(ParaName)); memset(ParaVaule, 0, sizeof(ParaVaule)); P2W(iLen, p); p += 2; memcpy(ParaName, p, iLen); p += iLen; P2W(iLen, p); p += 2; memcpy(ParaVaule, p, iLen); p += iLen; if (ParaType == 0x00) Cmd.Param(ParaName).setAsLong() = atoi(ParaVaule); else if (ParaType == 0x01) Cmd.Param(ParaName).setAsString() = ParaVaule; } Cmd.Execute(); // 输出缓存 BYTE OutBuf[1024]; memset(OutBuf, 0, sizeof(OutBuf)); int iOffset = 0; // 输出参数个数 memcpy(&OutBuf[iOffset], p, 2); P2W(iOutputParaNums, p); p += 2; iOffset += 2; for (int i = 0; i < iOutputParaNums; i++) { memset(ParaName, 0, sizeof(ParaName)); memset(ParaVaule, 0, sizeof(ParaVaule)); // 参数类型 BYTE ParaType = *p; memcpy(&OutBuf[iOffset], p, 1); p++; iOffset ++; // 参数名称 P2W(iLen, p); memcpy(&OutBuf[iOffset], p, 2); p += 2; iOffset += 2; memcpy(ParaName, p, iLen); memcpy(&OutBuf[iOffset], p, iLen); p += iLen; iOffset += iLen; // 参数值 if (ParaType == 0x00) sprintf(ParaVaule, "%ld", Cmd.Param(ParaName).asLong()); else if (ParaType == 0x01) strcpy(ParaVaule, Cmd.Param(ParaName).asString()); int iTempLen = strlen(ParaVaule); BYTE *pLen = &OutBuf[iOffset]; W2P(pLen, iTempLen); iOffset += 2; memcpy(&OutBuf[iOffset], ParaVaule, iTempLen); iOffset += iTempLen; } p = &pDataNode->Buffer[1]; int iOutLen = 1; *p++ = CMD_OK; //执行SQL成功 iOutLen++; memcpy(p, OutBuf, iOffset); iOutLen += iOffset; iOutLen += 2; pDataNode->Length = iOutLen; return 1; }
//冲正 int CTradeDoReset::DoPack(SAConnection *saConn, void * pNode, unsigned char * pBuffer, unsigned & iBufLen) { if(saConn == NULL || pNode == NULL || pBuffer == NULL) { trace_log(ERR, "Paramter error!"); return RET_SYSEXP; } TRADEDATA * pData = (TRADEDATA *)pNode; CTLVTemplet tlvObj; if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData)) { trace_log(ERR, "UnPackTLVData fail!"); return RET_SYSEXP; } bool bFlag = true, bIsICC = false; unsigned char cFieldData[FIELD_MAXLEN]={0};//bFieldData[FIELD_MAXLEN]={0}, unsigned int iFieldDataLen = 0; POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType; if(m_unTradeOrgMap.empty()) initTredeTypeMap(); SAString sSql; SACommand Cmd; Cmd.setConnection(saConn); try { sSql.Format("select * from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s' and FIELD42='%s'" " and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq, pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, m_unTradeOrgMap[posType], pData->TransData.HeadData.OrigLBatchNo); Cmd.setCommandText(sSql); Cmd.Execute(); if(!Cmd.FetchNext()) { trace_log(ERR, "select original trade record fail[%s]!", _T(sSql)); strcpy(pData->TransData.HeadData.RspCode, "25"); return RET_SYSEXP; } //0消息类型 bFlag &= sndObj.SetValueByStr(0, "0400"); //2账号 SAString str = Cmd.Field("FIELD2").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(2, _T(str)); } //3处理码 bFlag &= sndObj.SetValueByStr(3, _T(Cmd.Field("FIELD3").asString())); //4金额 bFlag &= sndObj.SetValueByStr(4, _T(Cmd.Field("FIELD4").asString())); //11流水号 bFlag &= sndObj.SetValueByStr(11, _T(Cmd.Field("FIELD11").asString())); //14 卡的有效期 str = Cmd.Field("FIELD14").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(14, _T(str)); } //22服务点输入方式 /*iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_POSENTMODE, pData->TransData.HeadData.SvrPointCode, 2); if(iFieldDataLen > 0) { bFlag &= sndObj.SetValueByHex(22, pData->TransData.HeadData.SvrPointCode, 2); if(memcmp(pData->TransData.HeadData.SvrPointCode, "05", 2) == 0 || memcmp(pData->TransData.HeadData.SvrPointCode, "07", 2) == 0 || memcmp(pData->TransData.HeadData.SvrPointCode, "98", 2) == 0 || memcmp(pData->TransData.HeadData.SvrPointCode, "95", 2) == 0) bIsICC = true; }*/ str = Cmd.Field("FIELD22").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(22, _T(str)); //char Field22[3] = {0}; //strcpy(Field22,_T(str)); if(memcmp(_T(str), "05", 2) == 0 ||memcmp(_T(str), "07", 2) == 0 || memcmp(_T(str), "98", 2) == 0 ||memcmp(_T(str), "95", 2) == 0) bIsICC = true; trace_log(DBG, "bIsICC=%d", bIsICC); } else { trace_log(ERR, "get FIELD22 from database failed!"); return RET_PACK; } //23IC卡序列号 if(pData->TransData.HeadData.RTradeType < POS_UNELEWALLETLOAD || pData->TransData.HeadData.RTradeType > POS_UNWALLETDEPOSIT) { str = Cmd.Field("FIELD23").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(23, _T(str)); } } //25服务点条件码 bFlag &= sndObj.SetValueByStr(25, _T(Cmd.Field("FIELD25").asString())); //38原授权码 str = Cmd.Field("FIELD38").asString(); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(38, _T(str)); } else if(posType == POS_UNPREAUTHREVE ||posType == POS_UNPREAUTHCPLREQ) { trace_log(ERR, "get FIELD38 from database failed!"); return RET_PACK; } //39 响应码 bFlag &= sndObj.SetValueByStr(39, _T(Cmd.Field("FIELD39").asString())); //41终端号 bFlag &= sndObj.SetValueByStr(41, _T(Cmd.Field("FIELD41").asString())); //42商户号 bFlag &= sndObj.SetValueByStr(42, _T(Cmd.Field("FIELD42").asString())); //48附加数据-私有 if(posType == POS_UNWALLETDEPOSIT || posType == POS_UNECTRANSLOAD) { bFlag &= sndObj.SetValueByStr(48, _T(Cmd.Field("FIELD48").asString())); } //49货币代码 bFlag &= sndObj.SetValueByStr(49, _T(Cmd.Field("FIELD49").asString())); //53安全控制信息 if(posType >= POS_UNREPEAL || posType <= POS_UNELEWALLETLOAD) { str = _T(Cmd.Field("").asString()); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(53, _T(Cmd.Field("FIELD53").asString())); } } //55IC卡数据 if(bIsICC && (posType < POS_UNELEWALLETLOAD || posType > POS_UNWALLETDEPOSIT)) { memset(cFieldData, 0, sizeof(cFieldData)); CTLVTemplet tlvDB, tlvF55; unsigned char cICData[1024]={0}; str = Cmd.Field("FIELD55").asString(); iFieldDataLen = str.GetLength(); if(iFieldDataLen > 0) { AscToBcd(cICData, (unsigned char *)_T(str), iFieldDataLen); iFieldDataLen /= 2; if(1 != tlvDB.UnPackTLVData(iFieldDataLen, cICData)) { trace_log(ERR,"UnPackTLVData error!"); strcpy(pData->TransData.HeadData.RspCode, ERR_PACKMESSAGE); return RET_PACK; } if(pData->TransData.HeadData.RTradeType == POS_UNCONSUME || pData->TransData.HeadData.RTradeType == POS_UNPREAUTH || pData->TransData.HeadData.RTradeType == POS_UNFILLECASH|| pData->TransData.HeadData.RTradeType == POS_UNELECASHLOAD|| pData->TransData.HeadData.RTradeType == POS_UNECTRANSLOAD) {//消费冲正或预授权冲正需上送55域 iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_TERMVERRET, cFieldData, sizeof(cFieldData)); if(iFieldDataLen > 0) { bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_TERMVERRET), iFieldDataLen, cFieldData); } iFieldDataLen = tlvDB.GetTLVItemByHex(TAG_INTDEVSERNO, cFieldData, sizeof(cFieldData)); if(iFieldDataLen > 0) { bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_INTDEVSERNO), iFieldDataLen, cFieldData); } iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_ISSAPPDATA, cFieldData, sizeof(cFieldData)); if(iFieldDataLen > 0) { bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_ISSAPPDATA), iFieldDataLen, cFieldData); } iFieldDataLen = tlvDB.GetTLVItemByHex(TAG_APPTRACOU, cFieldData, sizeof(cFieldData)); if(iFieldDataLen > 0) { bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_APPTRACOU), iFieldDataLen, cFieldData); } iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_ISSCRIRET, cFieldData, sizeof(cFieldData)); if(iFieldDataLen > 0) { bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_ISSCRIRET), iFieldDataLen, cFieldData); } iFieldDataLen = sizeof(cFieldData); bFlag &= tlvF55.PackTLVData(cFieldData, (unsigned &)iFieldDataLen); bFlag &= sndObj.SetValueByHex(55, cFieldData, iFieldDataLen); } } } //58 PBOC电子钱包/存折标准的交易信息 if(posType >= POS_UNELEWALLETLOAD && posType <= POS_UNWALLETDEPOSIT) { bFlag &= sndObj.SetValueByStr(58, _T(Cmd.Field("FIELD58").asString())); } //60 bFlag &= sndObj.SetValueByStr(60, _T(Cmd.Field("FIELD60").asString())); //61 原始信息域 if(posType == POS_UNPREAUTHCPLREQ || (posType >= POS_REPEAL && posType <= POS_FILLECASHREVE)) { bFlag &= sndObj.SetValueByStr(61, _T(Cmd.Field("FIELD61").asString())); } //62 if(posType == POS_UNWALLETDEPOSIT || posType == POS_UNECTRANSLOAD || posType == POS_UNCONSUME) { str = _T(Cmd.Field("FIELD62").asString()); if(str.GetLength() > 0) { bFlag &= sndObj.SetValueByStr(62, _T(str)); } else if(posType != POS_UNCONSUME) { trace_log(ERR, "get FIELD62 from database failed!"); return RET_PACK; } } } catch (SAException &e) { saConn->Rollback(); trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql)); return -1; } catch (...) { trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql)); return -1; } //64MAC bFlag &= sndObj.SetValueByHex(64, (unsigned char*)"00000000", 8); /*unsigned char cMacBuf[FIELD_MAXLEN] = {0}; if(1 != sndObj.GetMacData(cMacBuf, sizeof(cMacBuf))) { trace_log(ERR,"Get mac failed!"); return RET_GETMACERR; } bFlag &= sndObj.SetValueByHex(64, cMacBuf, 8);*/ //组包 iBufLen = PACK_MAXLEN; bFlag &= sndObj.Pack(pBuffer, iBufLen); if(!bFlag) { trace_log(ERR, "Pack right CUPS8583 fail!"); return RET_PACK; } //计算MAC BYTE bMab[PACK_MAXLEN] = {0}; BYTE bMac[9] = {0}; BYTE bTak[17] = {0}; int nMabPos = 2 + 5 + 6; int nMacLen = 8; Ccommon::Str2Hex((char *)pData->bMacKey, bTak, (sizeof(bTak) - 1)*2); memcpy(bMab, pBuffer + nMabPos, iBufLen - nMabPos - nMacLen); if(!m_checkMesValue.GenMacData(bMab, iBufLen - nMabPos - nMacLen, bTak, bMac)) { memcpy((pBuffer + iBufLen -nMacLen), bMac, nMacLen); } #if 0 unsigned char ucMab[1024]={0}; unsigned char ucTmp[9] = {0}; // 如果是非指定账户转账类圈存算MAC需要修改为转账类的计算MAC方法 if (pData->TransData.HeadData.RTradeType == POS_UNECTRANSLOAD) ucMab[0] = 1; int iMabLen = sndObj.GetMacData(ucMab, sizeof(ucMab)); if(iMabLen > 0) { if(!g_EncComm->CalculateMac(g_Cfg.SndBrchCode, g_Cfg.RcvBrchCode, ucMab, iMabLen, ucTmp, 2, 0)) { trace_log(ERR,"CalculateMac fail!"); return RET_SYSEXP; } BcdToAsc(pBuffer+iBufLen-8, ucTmp, 4); } else { trace_log(ERR,"GetMacData fail!"); return RET_SYSEXP; } #endif return RET_SUCCESS; }