Browse Source

Z991239-6087 #comment feat: 实现CheckCardType接口

Signed-Off-By: commit-hook
刘文涛80174520 8 months ago
parent
commit
dac58418f8
1 changed files with 170 additions and 0 deletions
  1. 170 0
      Module/mod_CardIssuerStand/CardIssuerFSM.cpp

+ 170 - 0
Module/mod_CardIssuerStand/CardIssuerFSM.cpp

@@ -5977,6 +5977,176 @@ int CCardIssuerFSM::ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, C
 
 int CCardIssuerFSM::CheckCardType(CSimpleStringA cardNo, bool bReadMag, int& ICtype)
 {
+	LOG_FUNCTION();
+	long l_beginTime, l_endTime;
+	ErrorCodeEnum eErr;
+	//oilyang@20230331
+	//1、发卡且读磁成功,不再继续检测IC,一律ICType=1,以便读取IC
+	//2、其他情况(发卡未读到磁条或前端插卡),先查询户口系统进行卡片介质判定:
+	//	2a:户口系统返回非纯磁条介质类型,ICType以户口为准(ICType影响后续IC读取,即:都会读IC)
+	//	2b:其他情况(户口系统访问错(未走户口系统查或访问微服务失败或未返回介质类型或返回纯磁条卡),一律探测是否芯片卡
+	if (m_issueStatus && bReadMag)//发卡默认给芯片卡,且读到磁道(考虑卡片放错)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, issueStatus is true and read mag OK");
+		ICtype = 1;
+	}
+	else {
+		int cardTypeFromHost = 0;
+		bool bMismatch = false;
+		//开关控制是否主机查询cardtype
+		if (m_eacQueryFlag == 1) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin query host to check cardType");
+			cardTypeFromHost = JudgeCardType(cardNo, bMismatch);//0:失败 1:复合 2:磁条 3:ic
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, cardTypeFromHost=%d", cardTypeFromHost);
+		}
+		if (cardTypeFromHost > 0 && cardTypeFromHost != 2)//户口系统返回非纯磁条介质类型
+		{
+			ICtype = cardTypeFromHost;
+			//卡号不同则直接返回报错
+			if (m_bUseCardnoMismatch && bMismatch)
+			{
+				return 1;//账户和户口系统的最新账户不匹配
+			}
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin detect cardType");
+			//主动探测
+			int activeCardType;
+			int icRetryTimes = 0;
+			bool bIC(false);
+			while (1)
+			{//for poor mag only card,we always retry...
+				bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
+				if (!bIC)
+					icRetryTimes++;
+				else
+					break;
+				Sleep(500);
+				if (icRetryTimes >= m_ICRetryTimes)
+					break;
+			}
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard>, bIC:%d", bIC);
+
+			//ic探测成功,0.无磁条IC 1.复合 2.磁条 3.纯IC 
+			if (bIC) {
+				if (bReadMag) {
+					ICtype = 1;
+				}
+				else {
+					ICtype = 3;
+					LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, "<CheckCardType>, maybe IC only.");
+				}
+				//释放资源
+				l_beginTime = GetTickCountRVC();
+				eErr = m_hDevHelper->DeactivateICCard();
+				l_endTime = GetTickCountRVC();
+
+				if (eErr != Error_Succeed) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::DeactivateICCard err");
+					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("CheckCardType::DeactivateICCard");
+				}
+
+				l_beginTime = GetTickCountRVC();
+				eErr = m_hDevHelper->ReleaseIC();
+				l_endTime = GetTickCountRVC();
+
+				if (eErr != Error_Succeed) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::ReleaseIC err");
+					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("CheckCardType::ReleaseIC");
+				}
+			}
+			else {
+				//判断是否支持非接
+				if (!IfUseRf()) {
+					m_bUseRFTillNext = false;//无非接
+					if (bReadMag) {
+						ICtype = 2;
+					}
+					else {
+						ICtype = 0;
+						//既没有读到磁条,又不是IC,很大概率是插反了
+						LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
+					}
+				}
+				else {
+					m_bUseRFTillNext = true;//使用非接
+
+					l_beginTime = GetTickCountRVC();
+					eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
+					l_endTime = GetTickCountRVC();
+
+					if (eErr != Error_Succeed)
+					{
+						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::MoveCard err");
+						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)("CheckCardType::MoveCard, (CI_MOVECARD_RF_POSITION)");
+					}
+
+					icRetryTimes = 0;
+					bool bICRF(false);
+					while (1)
+					{//for poor mag only card,we always retry...
+						bICRF = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType);
+						if (!bICRF)
+							icRetryTimes++;
+						else
+							break;
+						Sleep(500);
+						if (icRetryTimes >= m_ICRetryTimes)
+							break;
+					}
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard_RF>, bIC:%d", bICRF);
+					if (!(bICRF && activeCardType == 'A')) {
+						bICRF = false;
+					}
+
+					if (bICRF) {
+						if (bReadMag) {
+							ICtype = 1;
+						}
+						else {
+							ICtype = 3;
+							LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, "<CheckCardType>, maybe IC only.");
+						}
+						//释放资源
+						l_beginTime = GetTickCountRVC();
+						eErr = m_hDevHelper->DeactContactlessICCard();
+						l_endTime = GetTickCountRVC();
+
+						if (eErr != Error_Succeed) {
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::DeactContactlessICCard err");
+							SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard, "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");
+						}
+					}
+					else {
+						if (bReadMag) {
+							ICtype = 2;
+						}
+						else {
+							ICtype = 0;
+							//既没有读到磁条,又不是IC,很大概率是插反了
+							LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
+						}
+					}
+				}
+
+			}
+		}
+	}
+
+	CSimpleStringA cardType = CSimpleStringA::Format("cardType:%d", ICtype);
+	LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardType, cardType.GetData());
 	return 0;
 }