|
@@ -1822,17 +1822,14 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
|
|
|
spConfig->WriteConfigValueInt("1", "CardPercent", m_CardPercentEx[0]);
|
|
|
spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCS);
|
|
|
|
|
|
- int tmpCardnoMismatch = 0, tmpStopUseRF = 0, tmpUseNewAnswer = 0;
|
|
|
+ int tmpStopUseRF = 0, tmpUseNewAnswer = 0;
|
|
|
int tmpSelfcheckSleepTime = 0;
|
|
|
|
|
|
- spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "EacQueryFlag", m_eacQueryFlag);
|
|
|
- spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseCardnoMismatch", tmpCardnoMismatch);
|
|
|
spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "StopUseRF", tmpStopUseRF);
|
|
|
spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "SwallowCardUrl", m_csSwallowCardUrl);
|
|
|
spConfigCS->ReadConfigValue(GetEntityBase()->GetEntityName(), "SyncMaterialUrl", m_csSyncMaterialUrl);
|
|
|
spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseNewAnsError", tmpUseNewAnswer);
|
|
|
spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SelfcheckSleepTime", tmpSelfcheckSleepTime);
|
|
|
- spConfigCS->ReadConfigValue("Common", "EacQueryHost", m_EacQueryHost);
|
|
|
|
|
|
DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("StopUseRF:%d", tmpStopUseRF);
|
|
|
|
|
@@ -1844,11 +1841,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
|
|
|
|
|
|
DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("tmpSelfcheckSleepTime:%d", tmpSelfcheckSleepTime);
|
|
|
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("EacQueryFlag:%d,EacQueryHost:%s,UseCardnoMismatch:%d"
|
|
|
- , m_eacQueryFlag, m_EacQueryHost.GetData(), tmpCardnoMismatch);
|
|
|
|
|
|
- if (tmpCardnoMismatch == 1)
|
|
|
- m_bUseCardnoMismatch = true;
|
|
|
if (tmpStopUseRF == 1)
|
|
|
m_bStopUseRF = true;
|
|
|
if (tmpUseNewAnswer == 1)
|
|
@@ -2698,253 +2691,7 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerStoreService_Read
|
|
|
ctx->Answer(Error_Succeed);
|
|
|
return 0;
|
|
|
}
|
|
|
-int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerStoreService_Read_Req, CardIssuerStoreService_Read_Ans>::Pointer ctx)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- ErrorCodeEnum eErr, eMagReadErr;
|
|
|
-
|
|
|
- long l_beginTime, l_endTime;
|
|
|
- l_beginTime = RVCGetTickCount();
|
|
|
- eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
|
|
|
- l_endTime = RVCGetTickCount();
|
|
|
-
|
|
|
- if (eErr != Error_Succeed)
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ReadCard_RF::MoveCard(CI_MOVECARD_RF_POSITION) fail");
|
|
|
- SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::MoveCard");
|
|
|
- }
|
|
|
|
|
|
- ctx->Ans.ICType = 0;
|
|
|
-
|
|
|
- int activeCardType;
|
|
|
- bool bIC(false), bICSuc(false), bReadCardInfo(false);
|
|
|
- CSimpleString errMsg("");
|
|
|
- errMsg = CSimpleString::Format("ReadCard, inParam: reserved1 for lightPos:%d, m_issueStatus:%d, m_currentHopper:%d",
|
|
|
- ctx->Req.reserved1, m_issueStatus, m_currentHopper);
|
|
|
-
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(errMsg.GetData());
|
|
|
- DWORD dwStart = RVCGetTickCount();
|
|
|
- MagTracks magTracks;
|
|
|
- int readTries = 0;
|
|
|
- memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data));
|
|
|
- memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data));
|
|
|
- memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data));
|
|
|
- magTracks.eRange = CI_TRACK_RANGE_2_3;
|
|
|
- do {
|
|
|
- //oiltmp tricks...copy mag data
|
|
|
- //need to remove ,just for simple or lazy...
|
|
|
-
|
|
|
- eMagReadErr = Error_Succeed;
|
|
|
- magTracks.eRange = m_magTracks.eRange;
|
|
|
- for (int i = 0; i < 3; ++i)
|
|
|
- {
|
|
|
- magTracks.track[i].eStatus = m_magTracks.track[i].eStatus;
|
|
|
- magTracks.track[i].eSource = m_magTracks.track[i].eSource;
|
|
|
- magTracks.track[i].dwSize = m_magTracks.track[i].dwSize;
|
|
|
- memcpy(magTracks.track[i].data, m_magTracks.track[i].data, sizeof(m_magTracks.track[i].data));
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- ctx->Ans.t2Account = ctx->Ans.ICData = "";
|
|
|
- readTries++;
|
|
|
- if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data))
|
|
|
- {
|
|
|
- errMsg = CSimpleString::Format("MagRead, trackSize maybe wrong:t2Size:%d(%d), t3Size:%d(%d)",
|
|
|
- magTracks.track[1].dwSize, sizeof(magTracks.track[1].data),
|
|
|
- magTracks.track[2].dwSize, sizeof(magTracks.track[2].data));
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_TrackSize_Wrong, errMsg.GetData());
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
|
|
|
- {
|
|
|
- LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_STORE_OP, "CardIssuer op.");
|
|
|
- if (magTracks.track[1].dwSize > 40)
|
|
|
- {
|
|
|
- errMsg = CSimpleString::Format("MagRead, track2Size maybe wrong:t2Size:%d", magTracks.track[1].dwSize);
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_Track2Size_Wrong, errMsg.GetData());
|
|
|
- ctx->Ans.status = 1;
|
|
|
- break;
|
|
|
- }
|
|
|
- ctx->Ans.track2 = (char*)magTracks.track[1].data;
|
|
|
- bool bT3OK = false;
|
|
|
- if (magTracks.track[2].eStatus == CI_DATA_OK)
|
|
|
- {
|
|
|
- bT3OK = true;
|
|
|
- ctx->Ans.track3 = (char*)magTracks.track[2].data;
|
|
|
- }
|
|
|
- Track2Data track2Data;
|
|
|
- track2Data.status = 0;
|
|
|
- track2Data.t2Account = "";
|
|
|
- char* tmpMag2 = new char[256];
|
|
|
- ZeroMemory(tmpMag2, 256);
|
|
|
- DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2, true, bT3OK);
|
|
|
-
|
|
|
- int pos = 0;
|
|
|
- for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos)
|
|
|
- {
|
|
|
- if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e || magTracks.track[1].data[i] == 0x44)// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况
|
|
|
- break;
|
|
|
- }
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<ReadCard::MagRead>, split pos:%d", pos);
|
|
|
- if (pos <= 0 || pos == magTracks.track[1].dwSize)
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<ReadCard::MagRead>, split track is err, pos:%d", pos);
|
|
|
- ctx->Ans.status = 1;
|
|
|
- if (tmpMag2 != NULL)
|
|
|
- {
|
|
|
- delete[]tmpMag2;
|
|
|
- tmpMag2 = NULL;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- char* ddd = new char[40];
|
|
|
- memset(ddd, 0, 40);
|
|
|
- memcpy(ddd, magTracks.track[1].data, pos);
|
|
|
-
|
|
|
- if (SplitTrack2(tmpMag2, track2Data) == 0)
|
|
|
- {
|
|
|
- ctx->Ans.status = track2Data.status;
|
|
|
- ctx->Ans.t2Account = track2Data.t2Account;
|
|
|
- ctx->Ans.t2Region = track2Data.t2Region;
|
|
|
- ctx->Ans.t2CardSerial = track2Data.t2CardSerial;
|
|
|
- ctx->Ans.t2CVC = track2Data.t2CVC;
|
|
|
- ctx->Ans.t2ExpireDate = track2Data.t2ExpireDate;
|
|
|
- bReadCardInfo = true;
|
|
|
- if (m_issueStatus)
|
|
|
- {
|
|
|
- //设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
|
|
|
- if (m_mixedEx[m_currentHopper - 1] != 0) {
|
|
|
- m_mixedEx[m_currentHopper - 1] = 0;
|
|
|
- SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
|
|
|
- }
|
|
|
- else {
|
|
|
- SetDevState(DEVICE_STATUS_NORMAL);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))
|
|
|
- {
|
|
|
-
|
|
|
- ctx->Ans.status = 0;
|
|
|
- ctx->Ans.t2Account = (char*)ddd;
|
|
|
- ctx->Ans.t2Region = "";
|
|
|
- ctx->Ans.t2CardSerial = "";
|
|
|
- ctx->Ans.t2CVC = "";
|
|
|
- ctx->Ans.t2ExpireDate = "";
|
|
|
- bReadCardInfo = true;
|
|
|
- delete[]ddd;
|
|
|
-
|
|
|
- }
|
|
|
- if (tmpMag2 != NULL)
|
|
|
- {
|
|
|
- delete[]tmpMag2;
|
|
|
- tmpMag2 = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- CSimpleStringA cardInfo(true);
|
|
|
-
|
|
|
- //cardInfo = CSimpleStringA::Format("cardBin:%s****%s , len:%d", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4), ctx->Ans.t2Account.GetLength());
|
|
|
- cardInfo = CSimpleStringA::Format("cardBin:%s , len:%d", SP::Module::Util::DataMask(SP::Module::Util::DataMask_CardAccount, ctx->Ans.t2Account).GetData(), ctx->Ans.t2Account.GetLength());
|
|
|
- LogWarn(Severity_Low, Error_Unexpect, CardIssuerStore_UserErrorCode_CardBin, cardInfo.GetData());
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
- } while (readTries < READ_TRY_NUM);
|
|
|
- m_currCardNo = ctx->Ans.t2Account;
|
|
|
- if (m_issueStatus && (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK))//发卡默认给芯片卡,且读到磁道(考虑卡片放错)
|
|
|
- {
|
|
|
- ctx->Ans.ICType = 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- int cardTypeFromHost = 0;
|
|
|
- bool bMismatch = false;
|
|
|
- if (m_eacQueryFlag == 1)
|
|
|
- cardTypeFromHost = JudgeCardType(m_currCardNo, bMismatch);
|
|
|
- if (cardTypeFromHost > 0)//户口系统有返回卡片类型
|
|
|
- {
|
|
|
- ctx->Ans.ICType = cardTypeFromHost;
|
|
|
- if (m_bUseCardnoMismatch && bMismatch)
|
|
|
- return 2;
|
|
|
- }
|
|
|
- else//未访问户口系统或户口系统访问失败(包括插反卡)
|
|
|
- {
|
|
|
-
|
|
|
- l_beginTime = RVCGetTickCount();
|
|
|
- int retDetect = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_STORE_RF, m_hDevHelper, activeCardType);
|
|
|
- l_endTime = RVCGetTickCount();
|
|
|
-
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<ReadCard::DetectIfICCard>, retDetect:%d", retDetect);
|
|
|
-
|
|
|
- if (retDetect == 0) {
|
|
|
- bIC = true;
|
|
|
- }
|
|
|
- else {
|
|
|
- bIC = false;
|
|
|
- CSimpleStringA csDevApi("");
|
|
|
- DWORD dwDevApi = 0;
|
|
|
- GetDevApiCodeAndName(retDetect, dwDevApi, csDevApi);
|
|
|
- SetErrorAndLog(Error_Unexpect, dwDevApi, csDevApi, __FUNCTION__, false, l_endTime - l_beginTime);
|
|
|
- }
|
|
|
-
|
|
|
- if (!(bIC && activeCardType == 'A'))
|
|
|
- bIC = false;
|
|
|
- if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
|
|
|
- {
|
|
|
- if (bIC)
|
|
|
- ctx->Ans.ICType = 1;
|
|
|
- else
|
|
|
- {
|
|
|
- ctx->Ans.ICType = 2;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (bIC)
|
|
|
- {
|
|
|
- bReadCardInfo = true;
|
|
|
- ctx->Ans.ICType = 3;
|
|
|
- //LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_MaybeIC_Only, "<ReadCard>, maybe ic only.");
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("<ReadCard>, maybe ic only.");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- if (bIC)
|
|
|
- {
|
|
|
- l_beginTime = RVCGetTickCount();
|
|
|
- eErr = m_hDevHelper->DeactContactlessICCard();
|
|
|
- l_endTime = RVCGetTickCount();
|
|
|
-
|
|
|
- if (eErr != Error_Succeed) {
|
|
|
- SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::DeactContactlessICCard");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- DWORD dwEnd = RVCGetTickCount();
|
|
|
- DWORD dwCollapse = dwEnd - dwStart;
|
|
|
-
|
|
|
- if (!bReadCardInfo)
|
|
|
- {
|
|
|
- ctx->Ans.status = 1;
|
|
|
- return 0;
|
|
|
-
|
|
|
- }
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040222003")("ReadCard suc. cardType:%d. m_issueStatus:%d", ctx->Ans.ICType, m_issueStatus);
|
|
|
- return 0;
|
|
|
-}
|
|
|
int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerStoreService_PreOnline_Req, CardIssuerStoreService_PreOnline_Ans>::Pointer ctx)
|
|
|
{
|
|
|
if (m_bUseRFTillNext)
|
|
@@ -6427,64 +6174,7 @@ int CCardIssuerFSM::PrintCardIm(SpReqAnsContext<CardIssuerStoreService_PrintCard
|
|
|
ctx->Answer(Error_Succeed);
|
|
|
return 0;
|
|
|
}
|
|
|
-int CCardIssuerFSM::JudgeCardType(CSimpleStringA cardno, bool& bMismatch)
|
|
|
-{
|
|
|
- if (cardno.GetLength() < 8)
|
|
|
- return 0;
|
|
|
- int cardType = 0;
|
|
|
- IHttpFunc* client;
|
|
|
- client = create_http(HttpsLogCallBack);
|
|
|
- CQueryCardTypeReq qCardTypeReq;
|
|
|
- CQueryCardTypeRet qCardTypeRet;
|
|
|
- //qCardTypeReq.m_printDbg = true;//oiltest
|
|
|
- qCardTypeReq.m_timeOut = 3;//3 second
|
|
|
-
|
|
|
- qCardTypeReq.m_url = m_EacQueryHost.GetData();
|
|
|
- //qCardTypeReq.m_url = "http://55.13.170.50:8080/defa-gateway/dee1/EacQuery/queryByEac";
|
|
|
- qCardTypeReq.HEAD.xHdrLen = 203;
|
|
|
- qCardTypeReq.HEAD.xIsuCnl = "X86";
|
|
|
- qCardTypeReq.HEAD.xRtnCod = "SUC0000";
|
|
|
- qCardTypeReq.BODY.x1.xCltNbr = "";
|
|
|
- qCardTypeReq.BODY.x1.xEacNbr = cardno.GetData();
|
|
|
- qCardTypeReq.BODY.x1.xIacNbr = "";
|
|
|
- long beg = RVCGetTickCount();
|
|
|
- PROCESS_LINK_CONTEXT("LR0402203CardType")
|
|
|
- bool ret = client->Post(qCardTypeReq, qCardTypeRet, &nextLink);
|
|
|
- long end = RVCGetTickCount();
|
|
|
- if (ret)
|
|
|
- {
|
|
|
- bool bParse = qCardTypeRet.Parse(qCardTypeRet.m_resultData.c_str());
|
|
|
- if (bParse)
|
|
|
- {
|
|
|
- if (qCardTypeRet.BODY.z1.zPsbMdm.compare("C") == 0)
|
|
|
- cardType = 2;
|
|
|
- else if (qCardTypeRet.BODY.z1.zPsbMdm.compare("I") == 0)
|
|
|
- cardType = 3;
|
|
|
- else if (qCardTypeRet.BODY.z1.zPsbMdm.compare("M") == 0)
|
|
|
- cardType = 1;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Query card type from host is:%s,zPsbSeq:%s"
|
|
|
- , qCardTypeRet.BODY.z1.zPsbMdm.c_str(), qCardTypeRet.BODY.z1.zPsbSeq.c_str());
|
|
|
- int eacLen = qCardTypeRet.BODY.z1.zEacNbr.length();
|
|
|
- if (eacLen > 7 && cardno.Compare(qCardTypeRet.BODY.z1.zEacNbr.c_str()) != 0)
|
|
|
- {
|
|
|
- bMismatch = true;
|
|
|
- LogWarn(Severity_Low, Error_Unexpect, CardIssuerStore_UserErrorCode_Account_EAC_Mismatch,
|
|
|
- CSimpleStringA::Format("cardno:%s****%s EAC:%s****%s", cardno.SubString(0,6).GetData(), cardno.SubString(cardno.GetLength()-4, 4).GetData()
|
|
|
- , qCardTypeRet.BODY.z1.zEacNbr.substr(0, 6).c_str(), qCardTypeRet.BODY.z1.zEacNbr.substr(eacLen - 4, 4).c_str()));
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Query card type return false:%s",qCardTypeRet.HEAD.xRtnCod.c_str());//也没必要知道什么错 oilyang@20220829 在功能可用之前,还是有必要的
|
|
|
- }
|
|
|
- else {
|
|
|
- }
|
|
|
- client->Destory();
|
|
|
- //oiltest for stupid http component!!!
|
|
|
- //if (cardno.IsStartWith("622580") || cardno.IsStartWith("622588") || cardno.IsStartWith("622609")
|
|
|
- // || cardno.IsStartWith("410062"))
|
|
|
- // return 3;
|
|
|
- return cardType;
|
|
|
-}
|
|
|
+
|
|
|
|
|
|
|
|
|
void CCardIssuerFSM::HttpsLogCallBack(const char* logtxt) {
|