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"; } }
/**< 生成渠道流水 */ 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::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; }
/** \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::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; }
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 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 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; }
//冲正 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; }