소스 검색

Z991239-2823 #comment other: 运通卡相关修改

翟俊伟80258120 3 년 전
부모
커밋
f468997072

+ 62 - 52
DevAdapter/include/CardAssist.cpp

@@ -2249,7 +2249,7 @@ int CCardProcess::SplitOnlineReplyData(const char *pData,int size)
 	}
 	return 0;
 }
-int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCardX, const char *pAID, int &cardType)
+int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA>pAIDs, int& cardType)
 {
 	LOG_FUNCTION();
 	bool bIC = DetectIfICCard(eType,pCardX,cardType);
@@ -2258,7 +2258,8 @@ int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCard
 		Dbg("not ic card.");
 		return -1;
 	}
-	bool bGetICData = GetICDataFromCard(eType,pCardX,pAID);
+	bool bGetICData = false;
+	bGetICData = GetICDataFromCard(eType, pCardX, pAIDs);
 	if (!bGetICData)
 	{
 		Dbg("GetICDataFromCard failed.");
@@ -2268,64 +2269,73 @@ int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCard
 
 	return 0;
 }
-bool CCardProcess::GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,const char *pAID)
+bool CCardProcess::GetICDataFromCard(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA> pAIDs)
 {
 	LOG_FUNCTION();
-	//暂时只有一个,需要改成通用处理么。。。oiltmp
-	//aidflag ? oiltmp
 	AIDData aidData;
 	aidData.aid = new BYTE[32];//oiltmp
-	memset(aidData.aid,0,32);
-	int aidLen = StrBuf2HexBuf(pAID,&aidData.aid);
-	Dbg("str2hex len[%d]",aidLen);
-	aidData.len = aidLen;
-	char* aidTest = new char[128];
-	//char* aidTest2 = new char[128];
-	//memset(aidTest2,0,128);
-	//memcpy(aidTest2,aidData.aid,10);
-	int aidStrLen = HexBuf2StrBuf(aidData.aid,&aidTest,5);
-	Dbg("hex2str len[%d]",aidStrLen);
-	Dbg("aid[%s][%s]",pAID,aidTest);
-	vector<AIDData> vAIDs;
-	vAIDs.push_back(aidData);
-	//ErrorCodeEnum eErr = BuildSupportedAppList(vAIDs);
-
-	ErrorCodeEnum eErr = Error_Unexpect;
-	if (eType == CARD_MACHINE_ISSUER)
-	{
-		pCardI = dynamic_cast<CardIssuerClass*>(pCardX);
-	}
-	else if (eType == CARD_MACHINE_SWIPER || eType == CARD_MACHINE_SWIPER_RF)
-	{
-		pCardS = dynamic_cast<CardSwiperClass*>(pCardX);
-	}
-	else if (eType == CARD_MACHINE_RFIC)
-	{
-		pCardR = dynamic_cast<RFICClass*>(pCardX);
-	}
-	eErr = BuildSupportedAppList(eType,pCardX,vAIDs);
-	if (eErr != Error_Succeed)
+	memset(aidData.aid, 0, 32);
+	for (int index = 0; index < pAIDs.GetCount(); ++index)
 	{
-		DevErrorInfo devErr;
-		ZeroMemory(devErr.szErrMsg, sizeof(devErr.szErrMsg));
+		int aidLen = StrBuf2HexBuf(pAIDs[index].GetData(), &aidData.aid);
+
+		Dbg("str2hex len[%d]", aidLen);
+		aidData.len = aidLen;
+		char* aidTest = new char[128];
+		int aidStrLen = HexBuf2StrBuf(aidData.aid, &aidTest, 5);
+		Dbg("hex2str len[%d]", aidStrLen);
+		Dbg("aid[%s][%s]", pAIDs[index].GetData(), aidTest);
+		vector<AIDData> vAIDs;
+		vAIDs.push_back(aidData);
+
+		ErrorCodeEnum eErr = Error_Unexpect;
 		if (eType == CARD_MACHINE_ISSUER)
-			pCardI->GetLastErr(devErr);
-		else if (eType == CARD_MACHINE_SWIPER)
-			pCardS->GetLastErr(devErr);
+		{
+			pCardI = dynamic_cast<CardIssuerClass*>(pCardX);
+		}
+		else if (eType == CARD_MACHINE_SWIPER || eType == CARD_MACHINE_SWIPER_RF)
+		{
+			pCardS = dynamic_cast<CardSwiperClass*>(pCardX);
+		}
 		else if (eType == CARD_MACHINE_RFIC)
-			pCardR->GetLastErr(devErr);
-		Dbg("BuildSupportedAppList failed %d, %s.",eErr,devErr.szErrMsg);
-		return false;
-	}
-	//Dbg("[%s]",testIC);
-	eErr = AppSelected(eType,pCardX,vAIDs.at(0).aid,vAIDs.at(0).len);
-	if (eErr == Error_Succeed)
-		return true;
-	else
-	{
-		Dbg("AppSelected failed(%d).",eErr);
-		return false;
+		{
+			pCardR = dynamic_cast<RFICClass*>(pCardX);
+		}
+		eErr = BuildSupportedAppList(eType, pCardX, vAIDs);
+
+		Dbg("size = %d", vAIDs.size());
+		for (size_t i = 0; i < vAIDs.size(); ++i)
+		{
+			char* aidTest1 = new char[128];
+			int aidlen = HexBuf2StrBuf(vAIDs[i].aid, &aidTest1, vAIDs[i].len);
+			Dbg("aidTest = %s", aidTest1);
+			delete[] aidTest1;
+		}
+
+		if (eErr != Error_Succeed)
+		{
+			DevErrorInfo devErr;
+			ZeroMemory(devErr.szErrMsg, sizeof(devErr.szErrMsg));
+			if (eType == CARD_MACHINE_ISSUER)
+				pCardI->GetLastErr(devErr);
+			else if (eType == CARD_MACHINE_SWIPER)
+				pCardS->GetLastErr(devErr);
+			else if (eType == CARD_MACHINE_RFIC)
+				pCardR->GetLastErr(devErr);
+			Dbg("BuildSupportedAppList failed %d, %s.", eErr, devErr.szErrMsg);
+			continue;
+		}
+		//Dbg("[%s]",testIC);
+		eErr = AppSelected(eType, pCardX, vAIDs.at(0).aid, vAIDs.at(0).len);
+		if (eErr == Error_Succeed)
+			return true;
+		else
+		{
+			Dbg("AppSelected failed(%d).", eErr);
+			continue;
+		}
 	}
+	return false;
 }
 int CCardProcess::ConstructARQCData(const char *pATC, char *&pDataToARQC, char *&pSomeICData)
 {

+ 2 - 2
DevAdapter/include/CardAssist.h

@@ -52,7 +52,7 @@ public:
 	~CCardProcess();
 	void DataInit();
 	bool DetectIfICCard(CardReadType eType,DeviceBaseClass *pCardX,int &cardType);//cardType:0x41'A',type A; 0x42'B',type B; 0x4d'M',type M
-	bool GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,const char *pAID);
+	bool GetICDataFromCard(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA> pAIDs);
 	//int  SplitICData(vector<ICData>& vResult,LPBYTE* origData,int start,int dataLen,int level);
 	ErrorCodeEnum BuildSupportedAppList(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm);
 	ErrorCodeEnum BuildAppListByAIDs(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm);
@@ -69,7 +69,7 @@ public:
 	void SplitBusinessData(const char *pData,int size);
 	int SplitOnlineReplyData(const char *pData,int size);
 	void GetBaseInfoNotInRecord(CardReadType eType,DeviceBaseClass *pCardX);
-	int DetectAndReadICData(CardReadType eType,DeviceBaseClass *pCardX,const char *pAID,int &cardType);
+	int DetectAndReadICData(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA>pAIDs, int& cardType);
 	int ConstructARQCData(const char *pATC,char *&pDataToARQC,char *&pSomeICData);
 	int FindTagValue(TagVectorType eType,ICData& data,bool bLevel,int start=0,int end=0);
 	int ToFindTagValue(vector<ICData>& vData,ICData& data,bool bLevel,int start,int end);

+ 1 - 1
Module/CMakeLists.txt

@@ -148,7 +148,7 @@ if(MSVC)
     BASIC_SETUP CMAKE_TARGETS)
     set(MODULE_CONAN_DEP_LIBS ${CONAN_BIN_DIRS_MISC})
 else()
-    conan_cmake_run(REQUIRES Misc/2020.1211.1@LR04.02_ModuleDep/UOS
+    conan_cmake_run(REQUIRES Misc/2020.1104.01@LR04.02_ModuleDep/UOS
     BASIC_SETUP CMAKE_TARGETS)
     set(MODULE_CONAN_DEP_LIBS ${CONAN_BIN_DIRS_MISC} ${CONAN_LIB_DIRS_MISC} )
 endif(MSVC)

+ 19 - 14
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -799,14 +799,12 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
             int retDetectAndRead = -1;
             if (!ctx->Req.aid.IsNullOrEmpty()) {
                 Dbg("aid:[%s]", (const char*)ctx->Req.aid);
-                retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, ctx->Req.aid, activeCardType);
+				CAutoArray<CSimpleStringA> aidReq;
+				aidReq.Init(1);
+				aidReq[0] = ctx->Req.aid;
+                retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, aidReq, activeCardType);
             } else {
-                retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType);
-                if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
-                {
-                    Dbg("Can't read pboc record, to try emv...");
-                    retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A0000000108888", activeCardType);
-                }
+				retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
             }
 
             if (retDetectAndRead < 0) {
@@ -828,6 +826,7 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
                 ZeroMemory(pICTrack2, 128);
                 HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
                 pICTrack2[37] = '\0';
+				Dbg("pICTrack2 = %s", pICTrack2);
 
                 char* ddd = new char[128];
                 memset(ddd, 0, 128);
@@ -836,6 +835,7 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
                 t2ICTrack2 = pICTrack2;
                 t2ICAccount = (char*)ddd;//oiltest
                 Dbg("contactless card countcount:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+				Dbg("account = %s", t2ICAccount.c_str());
                 ctx->Ans.ICData = ctx->Ans.t2Account = t2ICAccount.c_str();
                 ctx->Ans.ICType = 4;
                 ctx->Ans.status = 0;
@@ -895,6 +895,13 @@ int CContactlessCardFSM::SplitTrack2(CSimpleStringA pTrack2, Track2Data& decodeD
         decodeData.t2Region = pTrack2.SubString(23, 4);
         decodeData.t2ExpireDate = pTrack2.SubString(27, 4);
         break;
+	case 25://AE Card
+		decodeData.t2Account = CSimpleString(pTrack2, 15);
+		decodeData.t2CardSerial = pTrack2.SubString(15, 1);
+		decodeData.t2CVC = pTrack2.SubString(16, 5);
+		decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
+		decodeData.t2Region = "";
+		break;
     case 38:
         break;
     default:
@@ -919,18 +926,16 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
     ICData aidFromBus(false, 0x4f, 0x00);
     if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1) {
         Dbg("the front BusinessData han't provide aid data.");
-        retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType);
-        if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
-        {
-            Dbg("Can't read pboc record,to try emv...");
-            retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A0000000108888", activeCardType);
-        }
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
     } else {
         char* pAIDTmp = new char[64];
         memset(pAIDTmp, 0, 64);
         HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
         Dbg("the aid is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
-        retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, pAIDTmp, activeCardType);
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, preAIDs, activeCardType);
         if (pAIDTmp != NULL)
             delete[]pAIDTmp;
     }

+ 5 - 0
Module/mod_ContactlessCard/ContactlessFSM.h

@@ -220,6 +220,10 @@ public:
         //,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
         , m_bCDA(false), m_pDataToARQC(NULL), m_bSM(false), m_bOnlineOnly(false)
     {
+		m_aidList.Init(3);
+		m_aidList[0] = "A000000333";
+		m_aidList[1] = "A0000000108888";
+		m_aidList[2] = "A000000790";
     }
     ~CContactlessCardFSM() {}
     virtual ErrorCodeEnum OnInit();
@@ -296,6 +300,7 @@ private:
     CCardProcess* m_pCardProcess;
     char* m_pDataToARQC;
     long xxTest;
+	CAutoArray<CSimpleStringA> m_aidList;
 
     char m_AuthCode[2];
     bool m_bOnlineOnly, m_bCDA;

+ 54 - 22
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -3060,6 +3060,7 @@ int CCardIssuerFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
 	if (pTrack2.GetLength() == 0)
 		return -1;
 	int dataLen = strlen(pTrack2);
+	Dbg("pTrack2 = %s", pTrack2.GetData());
 	Dbg("pT2.len:%d",dataLen);
 	switch(dataLen)
 	{
@@ -3077,6 +3078,13 @@ int CCardIssuerFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
 		decodeData.t2Region = pTrack2.SubString(23,4);
 		decodeData.t2ExpireDate = pTrack2.SubString(27,4);
 		break;
+	case 25://AE Card
+		decodeData.t2Account = CSimpleString(pTrack2, 15);
+		decodeData.t2CardSerial = pTrack2.SubString(15, 1);
+		decodeData.t2CVC = pTrack2.SubString(16, 5);
+		decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
+		decodeData.t2Region = "";
+		break;
 	case 38:
 		break;
 	default:
@@ -3185,12 +3193,15 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 	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[3].data));
+	memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data));
 	{
 		magTracks.eRange = CI_TRACK_RANGE_2_3;
 		do {
 			eErr = m_pCardIssuer->MagRead(magTracks);
 			Dbg("MAGread(%d)...",eErr);
+			Dbg("track1 = %s", (const char*)magTracks.track[0].data);
+			Dbg("track2 = %s", (const char*)magTracks.track[1].data);
+			Dbg("track3 = %s", (const char*)magTracks.track[2].data);
 			ctx->Ans.t2Account = ctx->Ans.ICData = "";
 			//DevErrorInfo devErrInfo;
 			//m_pCardIssuer->GetLastErr(devErrInfo);
@@ -3251,8 +3262,11 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 				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)
-						break;
+					// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况
+					if (magTracks.track[1].data[i] == 0x3d 
+						|| magTracks.track[1].data[i] == 0x3e 
+						|| magTracks.track[1].data[i] == 0x44)
+					break;
 				}
 				Dbg("pos:%d,%d",pos,magTracks.track[1].dwSize);
 				if (pos <= 0 || pos == magTracks.track[1].dwSize)
@@ -3307,6 +3321,7 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 					tmpMag2 = NULL;
 				}
 				Dbg("%s,%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4));
+				Dbg("account = %s", ctx->Ans.t2Account.GetData());
 				break;
 			}
 			else
@@ -3574,19 +3589,17 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 	{
 		Dbg("the front BusinessData han't provide aid data.");
 
-		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333", activeCardType);
-		if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
-		{
-			Dbg("Can't read pboc record,to try emv...");
-			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888", activeCardType);
-		}
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, m_aidList, activeCardType);
 	}
 	else {
 		char* pAIDTmp = new char[64];
 		memset(pAIDTmp, 0, 64);
 		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
 		Dbg("the aid is[%s],len:%d .", pAIDTmp,strlen(pAIDTmp));
-		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, pAIDTmp, activeCardType);
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, preAIDs, activeCardType);
 		if (pAIDTmp != NULL)
 			delete[]pAIDTmp;
 	}
@@ -3688,6 +3701,7 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 		ZeroMemory(pICTrack2,128);
 		HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
 		pICTrack2[37] = '\0';
+		Dbg("zjw pICTrack2 = %s", pICTrack2);
 		Dbg("ic.track2,pos:%d",pos);
 		Dbg("pos:%d",pos);
 
@@ -3709,9 +3723,11 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 		track2Data.status = 0;
 		track2Data.t2Account = "";
 		cmdDecodeMag2(pICTrack2,icTrack2Data);
+		Dbg("zjw icTrack2Data = %s", icTrack2Data);
 		if (SplitTrack2(icTrack2Data,track2Data) == 0)
 		{
 			t2ICAccount = track2Data.t2Account;
+			Dbg("zjw t2ICAccount = %s", t2ICAccount.c_str());
 			//t2ICCardSerial = track2Data.t2CardSerial;
 			t2ICCVC = track2Data.t2CVC;
 			t2ICTrack2 = pICTrack2;
@@ -4805,11 +4821,7 @@ bool CCardIssuerFSM::JustReadCardNo()
 	{
 		//oilyang@20201014 add emv support
 		bool bGetICData = false;
-		bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
-		if (!bGetICData)
-		{
-			bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
-		}
+		bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, m_aidList);
 		ICData track2(false, 0x57, 0x00);
 		string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 		if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
@@ -4847,7 +4859,10 @@ bool CCardIssuerFSM::JustReadCardNo()
 				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)
+					//运通卡考虑 = 和 D 
+					if (magTracks.track[1].data[i] == 0x3d ||
+						magTracks.track[1].data[i] == 0x3e ||
+						magTracks.track[1].data[i] == 0x44) 
 						break;
 				}
 				Dbg("pos:%d", pos);
@@ -6256,6 +6271,12 @@ int CCardIssuerFSM::IssueCardFromStore(SpReqAnsContext<CardIssuerService_IssueEx
 		ctx->Ans.reserved1.Init(3);
 		ctx->Ans.reserved2.Init(2);
 		eErr = m_pCardIssuer->ReadAccount(card);
+		Dbg("card.account = %s", card.account);
+		Dbg("card.dwsize = %d", card.dwSize);
+		Dbg("card.dwTrack2Size = %d", card.dwTrack2Size);
+		Dbg("card.track2 = %s", card.track2);
+		Dbg("card.dwTrack3Size = %d", card.dwTrack3Size);
+		Dbg("card.track3 = %s", card.track3);
 		if (eErr == Error_Succeed && ctx->Req.reserved2[0].GetLength() == card.dwSize && strncmp(card.account, ctx->Req.reserved2[0], card.dwSize) == 0)
 		{
 			Dbg("ReadAccount ok.");
@@ -6407,6 +6428,12 @@ int CCardIssuerFSM::AddCardToStoreStepFirst(SpReqAnsContext<CardIssuerService_Is
 		CardNo card;
 		ctx->Ans.reserved2[0] = "";
 		eErr = m_pCardIssuer->ReadAccount(card);
+		Dbg("card.account = %s", card.account);
+		Dbg("card.dwsize = %d", card.dwSize);
+		Dbg("card.dwTrack2Size = %d", card.dwTrack2Size);
+		Dbg("card.track2 = %s", card.track2);
+		Dbg("card.dwTrack3Size = %d", card.dwTrack3Size);
+		Dbg("card.track3 = %s", card.track3);
 		bool bDataOK = true;//oilyang@20171213 是否读卡失败,是否解析出卡序号,否则吞卡 @宋锐
 		if (eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 64)
 		{
@@ -6612,6 +6639,12 @@ bool CCardIssuerFSM::OperateCardStore(CSmartPointer<IConfigInfo> &spConfigRun, i
 		CardNo card;
 		ZeroMemory(card.account, sizeof(card.account));
 		eErr = m_pCardIssuer->ReadAccount(card);
+		Dbg("card.account = %s", card.account);
+		Dbg("card.dwsize = %d", card.dwSize);
+		Dbg("card.dwTrack2Size = %d", card.dwTrack2Size);
+		Dbg("card.track2 = %s", card.track2);
+		Dbg("card.dwTrack3Size = %d", card.dwTrack3Size);
+		Dbg("card.track3 = %s", card.track3);
 		bool bDataOK = true;
 		//读卡成功并解析出卡序号,才算成功,卡序号也要返回
 		if(eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 64)
@@ -7037,7 +7070,7 @@ void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const
 		Dbg("track2 isn't ok.");
 		return;
 	}
-	if (dwT2size <= 0 || strlen(track2) < 16)
+	if (dwT2size <= 0 || strlen(track2) < 15)//运通卡号为15位
 	{
 		Dbg("t2.size %d,strlen(t2):%d",dwT2size,strlen(track2));
 		return;
@@ -7054,6 +7087,9 @@ void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const
 		memcpy(tmpMag2_3 + dwT2size + 1, track3, dwT3size);
 		cmdDecodeEx(tmpMag2_3, cardType, magData);
 	}
+	Dbg("tmpMage2_3 = %s", tmpMag2_3);
+	Dbg("magData = %s", magData);
+	Dbg("cardType = %s", cardType);
 	if (!bT3OK || strlen(cardType) < 4)
 	{
 		Dbg("no(%d) or wrong track 3(size:%d,strlen(%d)),%s",bT3OK,dwT3size,strlen(track3),cardType);
@@ -7336,11 +7372,7 @@ void CCardIssuerFSM::oiltestSCI(bool bSCI)
 			m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
 			//oilyang@20201014 add emv support
 			int retGetICData = -1;
-			retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
-			if (retGetICData < -1)//-1:DetectIfICCard failed; -2:select app failed
-			{
-				retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
-			}
+			retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, m_aidList);
 			ICData track2(false, 0x57, 0x00);
 			string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 			if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)

+ 5 - 0
Module/mod_cardissuer/CardIssuerFSM.h

@@ -761,6 +761,10 @@ public:
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
 			cmdDecodeMag2 = NULL;
 			cmdDecodeEx = NULL;
+			m_aidList.Init(3);
+			m_aidList[0] = "A000000333";
+			m_aidList[1] = "A0000000108888";
+			m_aidList[2] = "A000000790";
 		}
 
 	~CCardIssuerFSM(){}
@@ -1046,6 +1050,7 @@ private:
 	CardIssuerClass* m_pCardIssuer;
 	DevStateEnum m_eDevState;
 	CCardProcess *m_pCardProcess;
+	CAutoArray<CSimpleStringA> m_aidList;
 	pfEncryptDukptHSM EncypteDukptHSM;
 	pfGetEncrypedData GetEncrypedData;
 	char *m_pDataToARQC;

+ 69 - 6
Module/mod_cardswiper/CardSwiperFSM.cpp

@@ -1694,6 +1694,13 @@ int CCardSwiperFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
 		decodeData.t2Region = pTrack2.SubString(23,4);
 		decodeData.t2ExpireDate = pTrack2.SubString(27,4);
 		break;
+	case 25://AE Card
+		decodeData.t2Account = CSimpleString(pTrack2, 15);
+		decodeData.t2CardSerial = pTrack2.SubString(15, 1);
+		decodeData.t2CVC = pTrack2.SubString(16, 5);
+		decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
+		decodeData.t2Region = "";
+		break;
 	case 38:
 		break;
 	default:
@@ -1758,6 +1765,7 @@ int CCardSwiperFSM::ReadCard(SpReqAnsContext<CardSwiperService_Read_Req,CardSwip
 	DWORD dwStart = GetTickCount();
 	//HRESULT hr = -1;
 	MagTracks magTracks;
+	memset(&magTracks, 0, sizeof(MagTracks));
 //	int readTries = 0;
 	bool bReadCardInfo = false;
 	Dbg("mag card");
@@ -1864,8 +1872,10 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 				}
 				for (int i = 0; i < 20; ++i)
 				{
+					//运通卡分隔符还要考虑为D的情况
 					if (magTracks.track[1].data[i] < 0x30
-						|| (magTracks.track[1].data[i] > 0x39 && (magTracks.track[1].data[i] != 0x3d && magTracks.track[1].data[i] != 0x3e)))
+						|| (magTracks.track[1].data[i] > 0x39 && 
+							(magTracks.track[1].data[i] != 0x3d && magTracks.track[1].data[i] != 0x3e && magTracks.track[1].data[i] != 0x44)))
 					{
 						//oilyang 20160523
 						//not '0'-'9' or '=' or '>'
@@ -1917,7 +1927,10 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 					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)
+						//运通卡考虑分隔符为D的情况
+						if (magTracks.track[1].data[i] == 0x3d
+							|| magTracks.track[1].data[i] == 0x3e
+							|| magTracks.track[1].data[i] == 0x44)
 							break;
 					}
 					Dbg("pos:%d,%d",pos,magTracks.track[1].dwSize);
@@ -1958,6 +1971,7 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 						
 					}
 					Dbg("%s,%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(pos - 4, 4));
+					Dbg("account = %s", ctx->Ans.t2Account.GetData());
 					break;
 				}
 				else
@@ -1981,7 +1995,19 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 					Dbg("contact ic %d",eErr);
 					eErr = m_pCardSwiper->ActiveICCard();
 					Dbg("active ic %d",eErr);
-					m_pCardProcess->GetICDataFromCard(m_eReadType,m_pCardSwiper,"A000000333");
+					bool bGetICData = false;
+					if (ctx->Req.aid.IsNullOrEmpty())
+					{
+						Dbg("the front han't provide aid data.");
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, m_aidList);
+					}
+					else {
+						Dbg("the aid is[%s],len:%d .", (const char*)ctx->Req.aid, ctx->Req.aid.GetLength());
+						CAutoArray<CSimpleStringA> preAIDs;
+						preAIDs.Init(1);
+						preAIDs[0] = ctx->Req.aid;
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, preAIDs);
+					}
 					ICData track2(false,0x57,0x00);
 					eErr = Error_Unexpect;
 					string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType;
@@ -2044,7 +2070,19 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 					}
 					ctx->Ans.reserved3 = chType;
 					Dbg("active type %d",chType);
-					m_pCardProcess->GetICDataFromCard(m_eReadType,m_pCardSwiper,"A000000333");
+					bool bGetICData = false;
+					if (ctx->Req.aid.IsNullOrEmpty())
+					{
+						Dbg("the front han't provide aid data.");
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, m_aidList);
+					}
+					else {
+						Dbg("the aid is[%s],len:%d .", (const char*)ctx->Req.aid, ctx->Req.aid.GetLength());
+						CAutoArray<CSimpleStringA> preAIDs;
+						preAIDs.Init(1);
+						preAIDs[0] = ctx->Req.aid;
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, preAIDs);
+					}
 					ICData track2(false,0x57,0x00);
 					eErr = Error_Unexpect;
 					string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType;
@@ -2066,6 +2104,7 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 						ZeroMemory(pICTrack2,128);
 						HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
 						pICTrack2[37] = '\0';
+						Dbg("pICTrack2 = %s", pICTrack2);
 
 						{
 							char *ddd = new char[128];
@@ -2075,6 +2114,7 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 							t2ICTrack2 = pICTrack2;
 							t2ICAccount = (char*)ddd;//oiltest
 							Dbg("count : %s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+							Dbg("account = %s", t2ICAccount.c_str());
 							ctx->Ans.ICData = ctx->Ans.t2Account = t2ICAccount.c_str();
 							delete []ddd;
 						}
@@ -2253,9 +2293,32 @@ int CCardSwiperFSM::PreOnline(SpReqAnsContext<CardSwiperService_PreOnline_Req,Ca
 		m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101"));
 	}
 	int activeCardType;
-	if (!m_pCardProcess->DetectAndReadICData(m_eReadType, m_pCardSwiper, "A000000333", activeCardType))//oiltest 20140915
+	int retDetectAndRead = -1;
+	ICData aidFromBus(false, 0x4f, 0x00);
+	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
+	{
+		Dbg("the front BusinessData han't provide aid data.");
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(m_eReadType, m_pCardSwiper, m_aidList, activeCardType);
+	}
+	else {
+		char* pAIDTmp = new char[64];
+		memset(pAIDTmp, 0, 64);
+		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
+		Dbg("the aid is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(m_eReadType, m_pCardSwiper, preAIDs, activeCardType);
+		if (pAIDTmp != NULL)
+			delete[]pAIDTmp;
+	}
+
+	if (retDetectAndRead < 0)
 	{
-		ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDSWIPER_ICCommand));
+		if (retDetectAndRead == -1)
+			ctx->Answer(Error_Unexpect, AlarmDECToBusiness("PreOnline(-1):", Error_Unexpect, MEC_DEVAPI_CARDSWIPER_ActiveICCard));
+		else if (retDetectAndRead == -2)
+			ctx->Answer(Error_Unexpect, AlarmDECToBusiness("PreOnline(-2):", Error_Unexpect, MEC_DEVAPI_CARDSWIPER_ICCommand));
 		return 0;
 	}
 	//if (m_cardType == CI_CARDTYPE_IC)

+ 5 - 0
Module/mod_cardswiper/CardSwiperFSM.h

@@ -364,6 +364,10 @@ public:
 	, m_bInMainPage(false), m_batteryLeft(999), m_bFWBOpenSucEver(false)
 	{
 		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x202);
+		m_aidList.Init(3);
+		m_aidList[0] = "A000000333";
+		m_aidList[1] = "A0000000108888";
+		m_aidList[2] = "A000000790";
 	}
 	~CCardSwiperFSM(){}
 	virtual ErrorCodeEnum OnInit();
@@ -651,6 +655,7 @@ private:
 		, m_bDoingBindFWB, m_bDevOpenEx, m_bBTScan, m_bInMainPage,m_bFWBOpenSucEver;
 	
 	ErrorCodeEnum m_testResult;
+	CAutoArray<CSimpleStringA> m_aidList;
 
 	SelfChekerClient*m_pSelfcheckClient;
 	bool m_bCancelQueryConn;