|
@@ -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)
|