//#include "stdafx.h" #include #include #include //#include "tools.hpp" //#include "pr50-v0.h" #include "CARD-v4.HPP" //extern TPR50 pr50; int TPR50::BPType = 1; TPR50 pr50; CARD* g_pCard = NULL; //extern TOOLS tools; char *CARD::SIGNCARD_ISOcode( SIGN_CARD_DATA *dat) //hz, 97.01.30 { static char trackData[300]; SIGN_CARD_TRACK2 defTrack2 = { //';', {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}, '\'', {'0','0','0','0'}, {'5','3','0'}, {'0','0','0','0','0','0','0','0','0','0','0'}, //'?', 0 }; static SIGN_CARD_TRACK3 defTrack3 = { //'!', {'0','1'}, {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}, '\'', {'1','5','6'}, {'1','5','6'}, '0', {'5','0','0','0'}, {'5','0','0','0'}, {'0','0','0','0'}, {'0','1'}, '3', {'0','0','0','0','0','0'}, {'5','3','0'}, {'0','0'}, {'0','0'}, {'0','0','0','0'}, {'1','0','0','0','0','0','0','0','0','0'}, {'0','0','0','0','0','0','0','0','0','0','0','0'}, '\'', {'0','0','0','0','0','0','0','0','0','0','0','0'}, '\'', '0', {'0','0','0','0','0','0'}, '0', //'?'' 0 }; SIGN_CARD_TRACK2 *tk2 = &defTrack2; memcpy(tk2->pan, dat->pan, 18); memcpy(tk2->exprDate, dat->exprDate, 4); memcpy(tk2->cvc, dat->cvc1, 3); SIGN_CARD_TRACK3 *tk3 = &defTrack3; memcpy(tk3->pan, dat->pan, 18); memcpy(tk3->exprDate, dat->exprDate, 4); memcpy(tk3->cvc, dat->cvc1, 3); if( pr50.BPType == 1) sprintf( trackData, "%sA%s", tk2, tk3); else sprintf( trackData, "%s", tk3); return trackData; } char* CARD::SIGNCARD_ISOdecode( char *trackData) //hz, 97.01.30 { static char data[100]; char *pointer = trackData; if( pr50.BPType == 1) { while( *pointer != 0 && *pointer != 'A') pointer++; if(*pointer == 0) { *(char*)data=0; return data; } pointer++; } if( memcmp( pointer, "01", 2) == 0) { SIGN_CARD_TRACK3 *tk3 = ( SIGN_CARD_TRACK3*)pointer; memcpy( ((SIGN_CARD_DATA*)data)->pan, tk3->pan, 18); memcpy( ((SIGN_CARD_DATA*)data)->exprDate, tk3->exprDate, 4); memcpy( ((SIGN_CARD_DATA*)data)->cvc1, tk3->cvc, 3); } else *(char*)data = 0; return data; } char CARD::plus(char ch1, char ch2) { return ( (ch1-'0') + (ch2-'0')) % 10 +'0'; } char CARD::minus(char ch1, char ch2) { int ch = (ch1-'0') - (ch2-'0'); if( ch < 0 ) ch += 10; return (char)(ch+'0'); } char *CARD::plusString( char *str1, char *str2, int len) { static char string[20]; for( int i=0; i='0'&&data[12]<='9') { dest[8] = '0'; } else if( data[12]>='A'&&data[12]<='Z') { char tmp[5]; sprintf(tmp,"%02d",data[12]-'A'+10); dest[8] = tmp[0]; dest[12]= tmp[1]; } memcpy( dest+8+5, plusString( data+8+5, data+8+5+6, 6), 6); dest[ 8+5+6] = 0; return dest; } char *CARD::codeUserCardTrack( char *data) { static char dest[50]; if( pr50.BPType == 1) sprintf( dest, "A%s", codeUserCard( data)); else sprintf( dest, "%s", codeUserCard( data)); return dest; } char *CARD::decodeUserCard( char *data, char *SVCD) { static char dest[50]; memcpy( dest, data, 8+5); if ( data[8]!='0') { char tmp[5]; int tmpnum; tmp[0]=data[8]; tmp[1]=data[12]; tmp[2]=0; sscanf(tmp,"%d",&tmpnum); dest[12]='A'+tmpnum-10; } dest[8] = 'S'; memcpy( dest+8+5, minusString( data+8+5, SVCD, 6), 6); memcpy( dest+8+5+6, SVCD, 6); dest[ 8+5+6+6] = 0; return dest; } char *CARD::decodeUserCardTrack( char *data, char *SVCD) { static char dest[1]; char *pointer = data; if( pr50.BPType == 1) { while( *pointer != 0 && *pointer != 'A') pointer++; if(*pointer == 0) { dest[0] = 0; return dest; } pointer++; } return decodeUserCard( pointer, SVCD); } char CARD::getCheckNum(char *string, int len) { if (len<=0) { len=strlen(string); } if (len<=0) return -1; for( int i=0; i 0X39 || string[i] < 0x30) return -1; } int value = 0; int tempValue = 0; for(int i=0; i= 10) value = 0; return value+'0'; } BOOL CARD::ISOcode( char *data) { //////////////////////////////// // data struct // 1. Passbook // 0..3 Region Code // 4..13 Account No // 14..21 Passbook // 22..27 SVCD // total:28 // // 2. Card // 0..3 Region Code // 4..11 Customer No // 12..13 99 // 14..21 passbook // 22..27 SVCD // total:28 #define SEPARATOR '\'' char *constStr1_0 = "1561560200020005213013"; char *constStr1_1 = "514000000001"; char *constStr2 = "0000000"; if( memcmp( data, "0755", 4) == 0) { SZ_TRACK2 track2; SZ_TRACK3 track3; memcpy( track3.formatCode, "01", 2); memcpy( &track3.masterAccount[0], "690755", 6); memcpy( &track3.masterAccount[6], &data[4], 8); track3.masterAccount[6+8] = 0; track3.masterAccount[6+8] = getCheckNum( track3.masterAccount); track3.separator1 = SEPARATOR; memcpy( track3.constant1_0, constStr1_0, 22); memcpy( track3.constant1_1, constStr1_1, 12); track3.separator2 = SEPARATOR; memcpy( track3.slave1, data+4, 10); memcpy( track3.slave2, data+14, 8); memcpy( track3.controlPara, data+22, 6); track3.slave1[10] = 0; track3.slave2[8] = 0; track3.slave1[10] = getCheckNum( track3.slave1); track3.slave2[8] = getCheckNum( track3.slave2); track3.separator3 = SEPARATOR; track3.separator4 = SEPARATOR; memcpy( track3.constant2, constStr2, 7); track3.cardType = '1'; memset( track3.area, '0', 8); memcpy( track3.area, data, 4); //track3.area[4] = data[ 22+6]; //track2 flag if( pr50.BPType == 1) { track3.area[4] = '1'; //track2 flag } else { track3.area[4] = '0'; //track2 flag } track3.stringEnd = 0; // copy track3 data to track2 memcpy( track2.masterAccount, track3.masterAccount, 15); track2.separator1 = track3.separator1; // = '\''; memcpy( track2.constant, "1560000514", 10); track2.cardType = track3.cardType; memcpy( track2.area, track3.area, 8); memcpy( track2.area+4, track3.controlPara+3, 3); //hz, 97.01.30 track2.stringEnd = 0; if( pr50.BPType == 1) sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3); else sprintf( trackData, "%s", (char*)&track3); } else { TRACK2 track2; TRACK3 track3; memcpy( track3.formatCode, "01", 2); memcpy( &track3.masterAccount[0], "690755", 6); memcpy( &track3.masterAccount[6], &data[1], 3+8); //memcpy( &track3.masterAccount[6], &data[1], 3+8); track3.masterAccount[6+3+8] = 0; track3.masterAccount[6+3+8] = getCheckNum( track3.masterAccount); track3.separator1 = SEPARATOR; //for( int i=0; i<40; i++) track3.constant1[i] = constStr1[i]; memcpy( track3.constant1_0, constStr1_0, 22); //memcpy( track3.controlPara, "000000", 6); memcpy( track3.constant1_1, constStr1_1, 12); track3.separator2 = SEPARATOR; memcpy( track3.slave1, data+4, 10); memcpy( track3.slave2, data+14, 8); memcpy( track3.controlPara, data+22, 6); track3.slave1[10] = 0; track3.slave2[8] = 0; track3.slave1[10] = getCheckNum( track3.slave1); track3.slave2[8] = getCheckNum( track3.slave2); track3.separator3 = SEPARATOR; track3.separator4 = SEPARATOR; memcpy( track3.constant2, constStr2, 7); track3.cardType = '1'; memset( track3.area, '0', 8); memcpy( track3.area, data, 4); //track3.area[4] = data[ 22+6]; //track2 flag if( pr50.BPType == 1) { track3.area[4] = '1'; //track2 flag } else { track3.area[4] = '0'; //track2 flag } track3.stringEnd = 0; // copy track3 data to track2 memcpy( track2.masterAccount, track3.masterAccount, 15+3); track2.separator1 = track3.separator1; // = '\''; memcpy( track2.constant, "1560000514", 10); track2.cardType = track3.cardType; memcpy( track2.area, track3.area, 7); memcpy( track2.area+4, track3.controlPara+3, 3); //hz, 97.01.30 track2.stringEnd = 0; if( pr50.BPType == 1) sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3); else sprintf( trackData, "%s", (char*)&track3); } return true; } char* CARD::ISOdecode2( char *data) { static char mstAccount[30]; mstAccount[0] = 0; char *pointer = trackData; if( pr50.BPType != 1) { *data=0; return mstAccount; } /* if( ( //hz, Maybe have another no, so I delete it. // memcmp( pointer, "01690755", 8) != 0 || ( memcmp( pointer, "690755755", 11) == 0 && pointer[15] != '\'' ) ) && *tools.GetComboFromScreen( (UIW_WINDOW *)UI_WINDOW_OBJECT::windowManager->First(), "PSCD") == 'A') { *data = 0; if( strlen( pointer) > 15) { if( pointer[15] == '\'') { memcpy( mstAccount, pointer, 15); mstAccount[ 15] = 0; } else { memcpy( mstAccount, pointer, 18); mstAccount[ 18] = 0; } } return mstAccount; } else */ { if( pointer[15] == '\'') { memcpy( data, pointer, 15); data[ 15] = 0; } else { memcpy( data, pointer, 18); data[ 18] = 0; } } return mstAccount; } char* CARD::ISOdecode3( char *data) { static char mstAccount[30]; mstAccount[0] = 0; char *pointer = trackData; if( pr50.BPType == 1) { while( *pointer != 0 && *pointer != 'A') pointer++; if(*pointer == 0) { *data=0; return mstAccount; } pointer++; } /* if( ( //hz, Maybe have another no, so I delete it. // memcmp( pointer, "01690755", 8) != 0 || ( memcmp( pointer, "01690755755", 11) == 0 && pointer[15+2] != '\'' ) ) && *tools.GetComboFromScreen( (UIW_WINDOW *)UI_WINDOW_OBJECT::windowManager->First(), "PSCD") == 'A') { *data = 0; if( strlen( pointer) > 15+2) { if( pointer[15+2] == '\'') { memcpy( mstAccount, pointer, 15+2); mstAccount[ 15+2] = 0; } else { memcpy( mstAccount, pointer, 18+2); mstAccount[ 18+2] = 0; } } return mstAccount; } else */ { if( pointer[15+2] == '\'') { memcpy( data, pointer+2, 15); data[ 15] = 0; } else { memcpy( data, pointer+2, 18); data[ 18] = 0; } } return mstAccount; } BOOL CARD::ISOdecode( char *data) { //////////////////////////////// // data struct // 1. Passbook // 0..3 Region Code // 4..13 Account No // 14..21 Passbook // 22..27 SVCD // total:28 // // 2. Card // 0..3 Region Code // 4..11 Customer No // 12..13 99 // 14..21 passbook // 22..27 SVCD // total:28 char *pointer = trackData; data[0]=0; //skip track 2 if( pr50.BPType == 1) { while( *pointer != 0 && *pointer != 'A') pointer++; if(*pointer == 0) { return false; } pointer++; } if ( memcmp( pointer, "01690755755", 11) == 0 && pointer[15+2] != '\'' ) { return false; } // separator1 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { return false; } pointer++; //SVCD memcpy(data+22,pointer+22, 6); // separator2 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { return false; } pointer++; // get account no from slave1 memcpy( data+4, pointer, 10); // separator3 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { return false; } pointer++; // get passbook/cardno from slave2 memcpy( data+14, pointer, 8); // separator4 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { return false; } pointer++; //region code memcpy( data, pointer+8, 4); data[28] = 0; return true; } char* CARD::CREDIT_ISOdecode( char *data) { //////////////////////////////// // data struct // 1. Passbook // 0..3 Region Code // 4..11 Customer No // 4..13 Account No // 14..21 Passbook // total:22 // // 2. Card // 0..3 Region Code // 4..11 Customer No // 11..13 const '99' // 14..21 CardNo // total:22 /* FILE *file = fopen( "debug1", "wt"); fprintf( file, (char*)&trackData); fclose(file); */ //printf( "%s\n", (char*)&trackData); static char mstAccount[30]; mstAccount[0] = 0; char *pointer = trackData; //TRACK3 *track3; if( pr50.BPType == 1) { while( *pointer != 0 && *pointer != 'A') pointer++; if(*pointer == 0) { *data=0; return mstAccount; } pointer++; } //track3=(TRACK3 *)pointer; /* FILE *fp = fopen( "debug", "wt"); fprintf( fp, "%s\n", pointer); fclose( fp); */ //printf( "%s\n", pointer); for( int i=0; i<2 && *pointer!=0 && *pointer!='\''; i++) pointer++; // separator1 while( *pointer!=0 && *pointer != '\'') { *data = *pointer; data++; pointer++; } *data++ = '\''; if(*pointer == 0) { *data=0; return mstAccount; } pointer++; memcpy( data, pointer+35, 4);//valid date data += 4; memcpy( data, "000", 3);//servic code data += 3; /* // separator2 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { *data=0; return mstAccount; } pointer++; */ // separator3 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { *data=0; return mstAccount; } pointer++; // separator4 while( *pointer!=0 && *pointer != '\'') pointer++; if(*pointer == 0) { *data=0; return mstAccount; } pointer++; //hz, 96.05.28 memcpy(data, track3->area, 4); memcpy( data, pointer+1, 6); *(data+6) = 0; return mstAccount; } void CARD::INTERNET_ISOcode( char *PAN, char *CVV) { // parameter struct // PAN 10 // CVV 6 if( strlen( PAN) != 10) { //AfxMessageBox( "Error: length of PAN error!\n"); return; } if( strlen( CVV) != 6) { //AfxMessageBox( "Error: length of CVV error!\n"); return; } #define SEPARATOR '\'' INTERNET_TRACK2 track2; INTERNET_TRACK3 track3; memcpy( track2.PAN, "690000", 6); memcpy( track2.PAN+6, PAN, 10); track2.separator1[0] = SEPARATOR; memcpy( track2.expirationDate, "9912", 4); memcpy( track2.serviceCode, "120", 3); memcpy( track2.CVV, CVV+3, 3); track2.stringEnd = 0; memcpy( track3.formatCode, "01", 2); memcpy( track3.PAN, "690000", 6); memcpy( track3.PAN+6, PAN, 10); track3.separator1[0] = SEPARATOR; memcpy( track3.countryCode, "156", 3); memcpy( track3.currency, "156", 3); memcpy( track3.currencyExponent, "0", 1); memcpy( track3.amountAuthorized, "5000", 4); memcpy( track3.amountRemaining, "5000", 4); memcpy( track3.cycleBegin, "0000", 4); memcpy( track3.cycleLength, "01", 2); memcpy( track3.retryCount, "0", 1); memcpy( track3.PINPARM, CVV, 6); memcpy( track3.interchangeControl, "1", 1); memcpy( track3.serviceRestriction, "20", 2); memcpy( track3.SRofSAN1, "00", 2); memcpy( track3.SRofSAN2, "00", 2); memcpy( track3.expiryDate, "9912", 4); memcpy( track3.sequenceNo, "1", 1); track3.securityNo[0] = SEPARATOR; memcpy( track3.SAN1, "000000000000", 12); track3.separator2[0] = SEPARATOR; memcpy( track3.SAN2, "000000000000", 12); track3.separator3[0] = SEPARATOR; memcpy( track3.relayMarker, "0", 1); memcpy( track3.CCD, "000000", 6); track3.transactionDate[0] = SEPARATOR; track3.AVV[0] = SEPARATOR; memcpy( track3.INNIC, CVV, 3); memcpy( track3.CVV, CVV+3, 3); track3.stringEnd = 0; if( pr50.BPType == 1) sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3); else sprintf( trackData, "%s", (char*)&track3); } char* CARD::INTERNET_ISOdecode( char* PAN, char* CVV) { static char staticPAN[30]; staticPAN[0] = 0; char *pointer = trackData; //printf( "%s\n", trackData); if( pr50.BPType == 1) { while( *pointer != 0 && *pointer != 'A') pointer++; if(*pointer == 0) { *PAN = 0; *CVV = 0; return staticPAN; } pointer++; } INTERNET_TRACK3 *track3 = (INTERNET_TRACK3 *)pointer; memcpy( PAN, track3->PAN+6, 10); PAN[10] = 0; memcpy( CVV, track3->PINPARM, 6); CVV[10] = 0; memcpy( staticPAN, track3->PAN+6, 10); staticPAN[10] = 0; //printf( "%s\n", staticPAN); return staticPAN; } BOOL CARD::Track23( char *strTrack2, char *strTrack3, BOOL bWrite, char* MARGType ) { char *pDivide; if (bWrite) { if( pr50.BPType == 1) sprintf( this->trackData, "%sA%s", strTrack2, strTrack3); else sprintf( this->trackData, "%s", strTrack3); //二当三! } else { if( pr50.BPType == 1) { if( strcmp(MARGType,"23")==0 || strcmp(MARGType,"3")==0 ) { pDivide=strstr(this->trackData,"A"); if (pDivide==NULL) { strTrack2[0]=0; strTrack3[0]=0; return FALSE; } memcpy(strTrack2, this->trackData,pDivide-this->trackData); strTrack2[pDivide-this->trackData]=0; strcpy(strTrack3,pDivide+1); } else if( strcmp(MARGType,"2")==0 ) { strcpy(strTrack2,this->trackData); strTrack3[0]=0; } else { strTrack2[0]=0; strTrack3[0]=0; return FALSE; } } else { strTrack2[0]=0; strcpy(strTrack3,this->trackData); } } return TRUE; } int CARD::ISONewCardType(char * CardBin) { if (CardBin[0]=='6') { return 1; } else { return 0; } } BOOL CARD::ISONewcode( char *data) { NEW_TRACK0 *pdata; char CardBin[10]; int CardType; pdata=(NEW_TRACK0 *)data; memcpy(CardBin,pdata->masterAccount,6); CardBin[6]=0; CardType=ISONewCardType( CardBin); if( CardType==0 ) { return ISONewcode0(data); } else { return ISONewcode1(data); } } BOOL CARD::ISONewcode0( char *data) //9字头卡 { NEW_TRACK0 *pdata; NEW_TRACK2 strTrack2; NEW_TRACK3 strTrack3; char defNewTrack2[]= "9555500000000000\'49121200000000000000"; char defNewTrack3[]= "999555500000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000000"; pdata=(NEW_TRACK0 *)data; strcpy((char*)&strTrack2,defNewTrack2); strcpy((char*)&strTrack3,defNewTrack3); memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack2.appendData,pdata->SVCD,sizeof(pdata->SVCD)); strTrack2.appendData[6]=pdata->cardSerial; strTrack2.appendData[7]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate)); memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD)); strTrack3.cardSerial=pdata->cardSerial; memcpy(strTrack3.SAN1,(pdata->masterAccount)+6,sizeof(strTrack3.SAN1)); memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD)); memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate)); strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ISONewcode1( char *data) // 6字头卡 /* BZSL 八转十六项目 * 函数名:BOOL CARD::ISONewcode1( char *data) * 功能: 对6开头的16位卡按照:2磁道为两地通2磁道格式, * 3磁道为普通16位卡3磁道格式进行写磁的操作 */ { NEW_TRACK0 *pdata; NEW1_TRACK2 strTrack2; NEW_TRACK3 strTrack3; int randValue = 0; char strTmp[128]; char defNew1Track2[38]= "0000000000000000" "\'" "4912" "120" "12345" "00888000"; char defNewTrack3[]= "999555500000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000000"; pdata=(NEW_TRACK0 *)data; strcpy((char*)&strTrack2,defNew1Track2); strcpy((char*)&strTrack3,defNewTrack3); memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%05d",(unsigned int)randValue); memcpy(strTrack2.localCheckMessage,strTmp,5); strTrack2.appendData[1]=pdata->cardSerial; //此处做了修改 /* randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%02d",(unsigned int)randValue); memcpy(strTrack2.appendData,strTmp,2); */ memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate)); memcpy(strTrack2.appendData+2,pdata->SVCD,6); //此处做了修改 /* memcpy(strTrack2.appendData+2,pdata->SVCD,3); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack2.appendData+5,strTmp,3); */ //3磁道采用老的95555卡的3磁道格式 memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack3.SVCD,strTrack2.appendData+2,6); strTrack3.cardSerial=pdata->cardSerial; memcpy(strTrack3.SAN1,(pdata->masterAccount)+6,sizeof(strTrack3.SAN1)); memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD)); memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate)); strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); /* //增加IC借记卡,zhanglei,2011.12.15 1.621486(银联IC金葵花)(服务代码 220) 2.621485(银联IC金卡)(服务代码 220) 3.621483(银联IC普卡) (服务代码 220) */ /* //改用配置文件的方式,zhanglei,20141011 if ((strncmp((char*)&strTrack2, "621486", 6) == 0) || (strncmp((char*)&strTrack2, "621485", 6) == 0) || (strncmp((char*)&strTrack2, "621483", 6) == 0)) memcpy(strTrack2.serviceCode, "220", 3); */ string binCod; binCod.assign((char*)&strTrack2, 6); string svcCod = this->GetSvcCod(binCod); if (svcCod != "") memcpy(strTrack2.serviceCode, svcCod.c_str(), 3); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ICcode( char *data) // IC磁条卡,逻辑基本copy ISONewcode1,修改处有注释 { IC_TRACK0 *pdata; IC_TRACK2 strTrack2; IC_TRACK3 strTrack3; int randValue = 0; char strTmp[128]; char defNew1Track2[]= "0000000000000000000" "\'" "4912" "620" //服务代码620 zhanglei "123" "0888000"; char defNewTrack3[]= "999555500000000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000"; pdata=(IC_TRACK0 *)data; strcpy((char*)&strTrack2,defNew1Track2); strcpy((char*)&strTrack3,defNewTrack3); memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack2.localCheckMessage,strTmp,3); strTrack2.appendData[0]=pdata->cardSerial; //此处做了修改 zhanglei /* randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%02d",(unsigned int)randValue); memcpy(strTrack2.appendData,strTmp,2); */ memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate)); memcpy(strTrack2.appendData+1,pdata->SVCD,6); //此处做了修改 zhanglei /* memcpy(strTrack2.appendData+2,pdata->SVCD,3); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack2.appendData+5,strTmp,3); */ //3磁道采用老的95555卡的3磁道格式 memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack3.SVCD,strTrack2.appendData+1,6); //取二磁道SVCD, zhanglei strTrack3.cardSerial=pdata->cardSerial; memcpy(strTrack3.SAN1,(pdata->masterAccount)+9,sizeof(strTrack3.SAN1)); memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD)); memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate)); strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ISOHKcode( char *data) { return ISOHKcode_help(data, FALSE); } BOOL CARD::ISOHKcode_help( char *data, BOOL isIC) /* 香港一卡通专用 * Lint */ { HK_TRACK0 *pdata; // NEW1_TRACK2 与 HK_TRACK2 相同 HK_TRACK2 strTrack2; HK_TRACK3 strTrack3; char defNew1Track2[38]= "0000000000000000" "\'" "4912" "120" "12345" "00888000"; char defNew1Track2_IC[38]= "0000000000000000" "\'" "4912" "220" "12345" "00888000"; char defHKTrack2[38]= "4026580000000000" "\'" "0000" "101" "12345" "00888000"; char defHKTrack3[105]= "92" "40" "2658" "600000000000" "\'\'" "000" "0" "00" "00" "0000" "0000" "00" "4" "000000" "0" "10" "00" "00" "0000" "00" //"000000000000" //"000000000000" "000000000000000123000000" "0000" "0000" "0000" "0000" "000" "1"; int randValue = 0; char strTmp[128]; pdata=(HK_TRACK0 *)data; if (pdata->masterAccount[0]=='4') //402658 { strcpy((char*)&strTrack2,defHKTrack2); } else //621299 { if (isIC == TRUE) strcpy((char*)&strTrack2,defNew1Track2_IC); else strcpy((char*)&strTrack2,defNew1Track2); } strcpy((char*)&strTrack3,defHKTrack3); memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%05d",(unsigned int)randValue); memcpy(strTrack2.localCheckMessage,strTmp,5); strTrack2.appendData[1]=pdata->cardSerial; //此处做了修改 /* randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%02d",(unsigned int)randValue); memcpy(strTrack2.appendData,strTmp,2); */ memcpy(strTrack2.appendData+2,pdata->SVCD,6); //此处做了修改 /* memcpy(strTrack2.appendData+2,pdata->SVCD,3); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack2.appendData+5,strTmp,3); */ memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate)); // memcpy(strTrack3.masterAccount,pdata->masterAccount+6,10); // 此处做了修改 memcpy(strTrack3.cardType,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack3.masterAccount+10,"00",2); memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate)); strTrack3.language = pdata->language; *(strTrack3.cardSerial+1)=pdata->cardSerial; /************************ > 子帐号 帐号类型 子帐号限制码 货币代码 》主账号 : 621299860******* 1 0 1(HKD) > 港币子帐户: 860XXXXXXX01 1 0 1(HKD) > 人民币子帐户: 860XXXXXXX03 1 0 3(RMB) > 其中 XXXXXXX 为PAN号的最后7位。 ************************/ if (isIC == TRUE) { memcpy(strTrack3.appendData, "860", 3); memcpy(strTrack3.appendData+3, pdata->masterAccount+9, 7); memcpy(strTrack3.appendData+10, "01", 2); memcpy(strTrack3.appendData+12, "860", 3); memcpy(strTrack3.appendData+15, pdata->masterAccount+9, 7); memcpy(strTrack3.appendData+22, "03", 2); strTrack3.firstSubsidiaryAccountLimit = '0'; strTrack3.firstSubsidiaryAccountType = '1'; memcpy(strTrack3.secondSubsidiaryAccountMessage, "10", 2); memcpy(strTrack3.currencyCode, "113", 3); strTrack3.exchangeCode = '9'; } else { /****************************************** * 取当前日期的函数需要在DOS进行重新编写 ******************************************/ #ifdef linux memset(strTmp,0,128); tzset(); time_t now = time(NULL); strftime(strTmp,128,"%m/%d/%y",localtime(&now)); #else _tzset(); _strdate(strTmp); #endif memcpy(strTrack3.appendData,"20",2); memcpy(strTrack3.appendData+2,strTmp,2); memcpy(strTrack3.appendData+4,strTmp+3,2); memcpy(strTrack3.appendData+6,strTmp+6,2); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%07d",(unsigned int)randValue); memcpy(strTrack3.appendData+8,strTmp,7); //此处做了修改 memcpy(strTrack3.appendData+15,pdata->SVCD,6); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack3.appendData+21,strTmp,3); /* memcpy(strTrack3.appendData+15,pdata->SVCD,3); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%06d",(unsigned int)randValue); memcpy(strTrack3.appendData+18,strTmp,6); */ } strTrack3.PIN = pdata->PIN; memcpy(strTrack3.PINOffset,pdata->PINOffset,sizeof(strTrack3.PINOffset)); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ISONewdecode( char *data,char* MARGType) { NEW_TRACK0 *pdata; NEW_TRACK2 strTrack2; // maxof(NEW_TRACK2, NEW1_TRACK2) NEW_TRACK3 strTrack3; /* char CardBin[10]; int CardType; */ data[0]=0; if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) ) return FALSE; if ( strlen((char*)&strTrack3)!=sizeof(NEW_TRACK3)-1) return FALSE; pdata=(NEW_TRACK0 *)data; memset((char*)pdata,'0',sizeof(NEW_TRACK0)); pdata->stringEnd=0; memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount)); pdata->cardSerial=strTrack3.cardSerial; memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); //此处做了修改 /* memcpy(CardBin,pdata->masterAccount,6); CardBin[6]=0; CardType=ISONewCardType(CardBin); if (CardType==1) //需要后面补零 { memcpy(pdata->SVCD,strTrack3.SVCD,3); memcpy(pdata->SVCD+3,"000",3); } else memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); //八转十六BZSL 以上工作为将6开头的卡号的SVCD码后3位强制置0,其他卡号不变 */ memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD)); memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate)); return TRUE; } BOOL CARD::CMBdecodeMag2( char* Mag2Data, char * data) { NEW_TRACK0 *pdata; NEW1_TRACK2 *Track2; data[0]=0; if ( strlen(Mag2Data)!=37) return FALSE; //so ugly if (memcmp(Mag2Data,"370576",6) == 0 || memcmp(Mag2Data,"374820",6) == 0 || memcmp(Mag2Data,"374821",6) == 0) { AE_TRACK2_DATA *pTrack2Data; AE_T2_DATA *pT2Data; pTrack2Data = (AE_TRACK2_DATA*)Mag2Data; pT2Data = (AE_T2_DATA*)data; memset((char*)pT2Data,'0',sizeof(AE_T2_DATA)); pT2Data->stringEnd=0; memcpy(pT2Data->masterAccount,pTrack2Data->account,sizeof(pT2Data->masterAccount)); pT2Data->cardSerial = pTrack2Data->reserved[0]; memcpy(pT2Data->cardSeCode,pTrack2Data->cardSeCode,sizeof(pT2Data->cardSeCode)); memcpy(pT2Data->expireDate,pTrack2Data->expireDate,sizeof(pT2Data->expireDate)); return TRUE; } pdata=(NEW_TRACK0 *)data; Track2 = (NEW1_TRACK2 *)Mag2Data; memset((char*)pdata,'0',sizeof(NEW_TRACK0)); pdata->stringEnd=0; memcpy(pdata->masterAccount, Track2->masterAccount,sizeof(pdata->masterAccount)); pdata->cardSerial=Track2->appendData[1]; memcpy(pdata->expireDate, Track2->expireDate, sizeof(pdata->expireDate)); memcpy(pdata->SVCD,Track2->appendData+2,sizeof(pdata->SVCD)); return TRUE; } BOOL CARD::ICdecode( char *data,char* MARGType) { IC_TRACK0 *pdata; IC_TRACK2 strTrack2; // maxof(NEW_TRACK2, NEW1_TRACK2) IC_TRACK3 strTrack3; /* char CardBin[10]; int CardType; */ data[0]=0; if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) ) return FALSE; if ( strlen((char*)&strTrack3)!=sizeof(NEW_TRACK3)-1) return FALSE; pdata=(IC_TRACK0 *)data; memset((char*)pdata,'0',sizeof(NEW_TRACK0)); pdata->stringEnd=0; memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount)); pdata->cardSerial=strTrack3.cardSerial; memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); //此处做了修改 /* memcpy(CardBin,pdata->masterAccount,6); CardBin[6]=0; CardType=ISONewCardType(CardBin); if (CardType==1) //需要后面补零 { memcpy(pdata->SVCD,strTrack3.SVCD,3); memcpy(pdata->SVCD+3,"000",3); } else memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); //八转十六BZSL 以上工作为将6开头的卡号的SVCD码后3位强制置0,其他卡号不变 */ memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD)); memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate)); return TRUE; } BOOL CARD::ISOHKdecode( char *data,char* MARGType) { BOOL isIC; return ISOHKdecode_help(data, MARGType, &isIC); } BOOL CARD::ISOHKdecode_help( char *data,char* MARGType, BOOL* isIC) { HK_TRACK0 *pdata; HK_TRACK2 strTrack2; HK_TRACK3 strTrack3; data[0]=0; if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) ) return FALSE; if ((strTrack2.serviceCode[0] == '2') && (strTrack2.serviceCode[1] == '2') && (strTrack2.serviceCode[2] == '0')) *isIC = TRUE; else *isIC = FALSE; pdata=(HK_TRACK0 *)data; memset((char*)pdata,'0',sizeof(HK_TRACK0)); pdata->stringEnd=0; memcpy(pdata->masterAccount,strTrack2.masterAccount,sizeof(pdata->masterAccount)); pdata->cardSerial=strTrack3.cardSerial[1]; memcpy(pdata->SVCD,strTrack2.appendData+2,6); //此处做了修改 // memcpy(pdata->SVCD,strTrack2.appendData+2,3); if (pdata->masterAccount[0]=='4') { memcpy(pdata->oldRGCD,"0000",sizeof(pdata->oldRGCD)); } else { memcpy(pdata->oldRGCD,"0852",sizeof(pdata->oldRGCD)); } // memcpy(pdata->oldRGCD,"0755",sizeof(pdata->oldRGCD)); //此处做了修改 memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate)); pdata->language = strTrack3.language ; pdata->PIN = strTrack3.PIN; memcpy(pdata->PINOffset,strTrack3.PINOffset,sizeof(strTrack3.PINOffset)); return TRUE; } /* void main() { char *data = "12345678S7890098765656565"; char *dest = codeUserCard( data); printf( "%s\n", dest); char *dest1 = decodeUserCard( dest, "656565"); printf( "%s\n", dest1); if( strcmp( data, dest1) == 0) printf( "ok\n"); } */ char* CARD::trimstr(char* strSrc) { int i,len; len=strlen(strSrc); if (len<=0) { return strSrc; } //trim right for(i=len-1;i>=0;i--) { if (strSrc[i]!=' ') { break; } } strSrc[i+1]=0; //trim left i=0; while(strSrc[i]==' ') { i++; } if (i>0) { memmove(strSrc,strSrc+i,len+1-i); } return strSrc; } BOOL CARD::ISOINTERcode( char *data) /* 国际借记卡专用 * Lint */ { INTER_TRACK0 *pdata; INTER_TRACK2 strTrack2; INTER_TRACK3 strTrack3; char defINTERTrack2[38]= "4026580000000000" "\'" "0000" "101" "12345" "00888000"; char defINTERTrack3[105]= "99" "41" "0062" "6000000000" "\'" "156" "156" "0" "5000" "5000" "0000" "01" "5" "000000" "2" "1" "4" "00" "00" "0000" "0" "\'" "0000000000" "\'" "000000000" "\'" "0" "000000" "0000000000000000"; int randValue = 0; char strTmp[128]; pdata=(INTER_TRACK0 *)data; strcpy((char*)&strTrack2,defINTERTrack2); strcpy((char*)&strTrack3,defINTERTrack3); memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%05d",(unsigned int)randValue); memcpy(strTrack2.localCheckMessage,strTmp,5); strTrack2.appendData[1]=pdata->cardSerial; //此处做了修改 /* randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%02d",(unsigned int)randValue); memcpy(strTrack2.appendData,strTmp,2); */ memcpy(strTrack2.appendData+2,pdata->SVCD,6); //此处做了修改 /* memcpy(strTrack2.appendData+2,pdata->SVCD,3); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack2.appendData+5,strTmp,3); */ memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate)); string binCod; binCod.assign((char*)&strTrack2, 6); string svcCod = this->GetSvcCod(binCod); if (svcCod != "") memcpy(strTrack2.serviceCode, svcCod.c_str(), 3); memcpy(strTrack3.formatCode,"99",2); memcpy(strTrack3.cardType,pdata->masterAccount,2); memcpy(strTrack3.bankSign,pdata->masterAccount+2,4); memcpy(strTrack3.masterAccount,pdata->masterAccount+6,10); memcpy(strTrack3.grantControlCode,pdata->SVCD,6); //此处做了修改 /* memcpy(strTrack3.grantControlCode,pdata->SVCD,3); randValue = 0; do { srand( (unsigned)time( NULL ) ); randValue = rand(); }while(randValue == 0); sprintf(strTmp,"%03d",(unsigned int)randValue); memcpy(strTrack3.grantControlCode+3,strTmp,3); */ memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate)); strTrack3.cardSerial = pdata->cardSerial; memcpy(strTrack3.firstSubsidiaryAccount,pdata->masterAccount+6,10); memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD)); strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ISOINTERcodetrack1( char *data, char *name, char *parmTrack1) /* 国际借记卡一磁道专用 * CaiJun */ { INTER_TRACK0 *pdata; char *pTrack1; char namefmt[30]; int len; pdata=(INTER_TRACK0 *)data; pTrack1=parmTrack1; memcpy(pTrack1,"B",1); pTrack1+=1; memcpy(pTrack1,pdata->masterAccount,sizeof(pdata->masterAccount)); pTrack1+=sizeof(pdata->masterAccount); memcpy(pTrack1,"^",1); pTrack1+=1; strcpy(namefmt,name); trimstr(namefmt); strcat(namefmt,"/"); len=strlen(namefmt); memcpy(pTrack1,namefmt,len); pTrack1+=len; memcpy(pTrack1,"^",1); pTrack1+=1; memcpy(pTrack1,pdata->expireDate,sizeof(pdata->expireDate)); pTrack1+=sizeof(pdata->expireDate); memcpy(pTrack1,"1011234500",10); pTrack1+=10; memcpy(pTrack1,pdata->SVCD,3); pTrack1+=3; memcpy(pTrack1,"000000",6); pTrack1+=6; *pTrack1=0; return TRUE; } BOOL CARD::ISOINTERdecode( char *data,char* MARGType) { INTER_TRACK0 *pdata; INTER_TRACK2 strTrack2; INTER_TRACK3 strTrack3; data[0]=0; if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) ) return FALSE; pdata=(INTER_TRACK0 *)data; memset((char*)pdata,'0',sizeof(INTER_TRACK0)); pdata->stringEnd=0; memcpy(pdata->masterAccount,strTrack2.masterAccount,sizeof(pdata->masterAccount)); pdata->cardSerial=strTrack3.cardSerial; memcpy(pdata->SVCD,strTrack2.appendData+2,6); //此处做了修改 // memcpy(pdata->SVCD,strTrack2.appendData+2,3); memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate)); memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD)); return TRUE; } BOOL CARD::ISONWPKcode( char *data) //新系统存折 { NWPK_TRACK0 *pdata; NWPK_TRACK2 strTrack2; NWPK_TRACK3 strTrack3; char defNWPKTrack2[]= "000000000000000\'00000000000000000"; char defNWPKTrack3[]= "60000000000000000\'156156500015100699\'00000000000\'0000000\'0000008130379181303791"; pdata=(NWPK_TRACK0 *)data; strcpy((char*)&strTrack2,defNWPKTrack2); strcpy((char*)&strTrack3,defNWPKTrack3); memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack2.PSBNBR,pdata->PSBNBR,sizeof(pdata->PSBNBR)); memcpy(strTrack2.SVCD,pdata->SVCD,sizeof(pdata->SVCD)); strTrack2.AccountChk=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount)); memcpy(strTrack3.PSBNBR,pdata->PSBNBR,sizeof(pdata->PSBNBR)); memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD)); strTrack3.AccountChk=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount)); strTrack3.PSBCHK=getCheckNum(pdata->PSBNBR,sizeof(pdata->PSBNBR)); strTrack3.CVCCHK=getCheckNum(pdata->SVCD,sizeof(pdata->SVCD)); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ISONWPKdecode( char *data,char* MARGType) //新系统存折 { NWPK_TRACK0 *pdata; NWPK_TRACK2 strTrack2; NWPK_TRACK3 strTrack3; data[0]=0; if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) ) return FALSE; if ( strlen((char*)&strTrack3)!=sizeof(NWPK_TRACK3)-1) return FALSE; pdata=(NWPK_TRACK0 *)data; memset((char*)pdata,'0',sizeof(NWPK_TRACK0)); pdata->stringEnd=0; memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount)); memcpy(pdata->PSBNBR,strTrack3.PSBNBR,sizeof(pdata->PSBNBR)); memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); return TRUE; } BOOL CARD::ISONWUScode( char *data) //新系统用户卡 { NWUS_TRACK0 *pdata; NWUS_TRACK2 strTrack2; NWUS_TRACK3 strTrack3; char defNWUSTrack2[]= "000000\'00000000"; char defNWUSTrack3[]= "70000000\'5000060106990\'0000000\'0000008130379181303791"; pdata=(NWUS_TRACK0 *)data; strcpy((char*)&strTrack2,defNWUSTrack2); strcpy((char*)&strTrack3,defNWUSTrack3); memcpy(strTrack2.USRNBR,pdata->USRNBR,sizeof(pdata->USRNBR)); strTrack2.cardSerial=pdata->cardSerial; memcpy(strTrack2.SVCD,pdata->SVCD,sizeof(pdata->SVCD)); strTrack2.USRCHK=getCheckNum(pdata->USRNBR,sizeof(pdata->USRNBR)); memcpy(strTrack3.USRNBR,pdata->USRNBR,sizeof(pdata->USRNBR)); strTrack3.cardSerial=pdata->cardSerial; memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD)); strTrack3.USRCHK=getCheckNum(pdata->USRNBR,sizeof(pdata->USRNBR)); strTrack3.CVCCHK=getCheckNum(pdata->SVCD,sizeof(pdata->SVCD)); return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE); } BOOL CARD::ISONWUSdecode( char *data,char* MARGType) //新系统用户卡 { NWUS_TRACK0 *pdata; NWUS_TRACK2 strTrack2; NWUS_TRACK3 strTrack3; data[0]=0; if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) ) return FALSE; if ( strlen((char*)&strTrack3)!=sizeof(NWUS_TRACK3)-1) return FALSE; pdata=(NWUS_TRACK0 *)data; memset((char*)pdata,'0',sizeof(NWUS_TRACK0)); pdata->stringEnd=0; memcpy(pdata->USRNBR,strTrack3.USRNBR,sizeof(pdata->USRNBR)); pdata->cardSerial=strTrack3.cardSerial; memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); return TRUE; } BOOL CARD::CMBcode( char * type, char * data, char* MagData) { BOOL Ret; //////////////////////////////// // data struct // 1. ODPK 存折 // 0..3 Region Code (RGCD) // 4..13 Account No (ACNO) // 14..21 Passbook (PSBK) // 22..27 SVCD (SVCD) // total:28 // // 2. ODCD 旧一卡通 // 0..3 Region Code (RGCD) // 4..11 Customer No (CUNO) // 12..13 99 (99) // 14..21 passbook (PSBK) // 22..27 SVCD (SVCD) // total:28 // // 3.NWCD 新一卡通 // 0..15 卡号 (EACNBR) // 16..16 卡序号 (PSBSEQ) // 17..22 SVCD (CVCCOD) // 23..26 Region Code (REGCOD) // 27..30 有效期 (EXPDAT) // total 31 // // 4.HKCD 香港一卡通 // 0..15 卡号 (EACNBR) // 16..16 卡序号 (PSBSEQ) // 17..22 SVCD (CVCCOD) // 23..26 Region Code (REGCOD) // 27..30 有效期 (EXPDAT) // 31..31 语言标志 (语言标志) // 32..32 校验位 (校验位) // 33..37 PIN偏移量 (PIN偏移量) // total 38 // // 5.NWPK 新系统存折 // 0..14 存折号 (EACNBR) // 15..24 凭证号 (PSBNBR) // 25..30 SVCD (CVCCOD) // total 31 // // 6.NWUS 新系统用户卡 // 0..5 用户号 (USRNBR) // 6..6 卡序号 (PSBSEQ) // 7..12 SVCD (CVCCOD) // total 13 // 7.INTE 国际借记卡 // 0..15 卡号 (EACNBR) // 16..16 卡序号 (PSBSEQ) // 17..22 SVCD (CVCCOD) // 23..26 Region Code (REGCOD) // 27..30 有效期 (EXPDAT) // total 31 // 8.ICCD IC磁条卡 zhanglei 20100919 // 0..18 卡号 (EACNBR) // 16..16 卡序号 (PSBSEQ) // 17..22 SVCD (CVCCOD) // 23..26 Region Code (REGCOD) // 27..30 有效期 (EXPDAT) // total 34 // 9.HKIC HK IC磁条卡 zhanglei 20110721 // 同HKCD,服务代码为220 Ret=false; MagData[0]=0; if (strcmp(type,"ODCD")==0) { Ret=ISOcode(data); } else if (strcmp(type,"ODPK")==0) { ISOcode(data); Ret=true; } else if (strcmp(type,"NWCD")==0) { Ret=ISONewcode(data); } else if (strcmp(type,"HKCD")==0) { Ret=ISOHKcode(data); } else if (strcmp(type,"HKIC")==0) { Ret=ISOHKcode_help(data, TRUE); } else if (strcmp(type,"INTE")==0) { Ret=ISOINTERcode(data); } else if (strcmp(type,"NWPK")==0) { Ret=ISONWPKcode(data); } else if (strcmp(type,"NWUS")==0) { Ret=ISONWUScode(data); } else if (strcmp(type,"ICCD")==0) { Ret=ICcode(data); } if (Ret) { strcpy(MagData,trackData); } return Ret; } BOOL CARD::CMBdecode( char* MagData, char * type, char * data) { // CRED 招行信用卡 // 0..15 卡号 (EACNBR) // 16..47 二磁道 (TK2DTA) // total 48 BOOL Ret; char strTrack2[250], strTrack3[250]; int lenTrack2, lenTrack3; Ret=false; data[0]=0; type[0]=0; strcpy(trackData,MagData); Track23(strTrack2,strTrack3,false); lenTrack2=strlen((char*)&strTrack2); lenTrack3=strlen((char*)&strTrack3); //4-VISA,5-MASTER,6-银联,3-JCB if ( ( lenTrack2==sizeof(IC_TRACK2)-1 ) && ( lenTrack3==sizeof(IC_TRACK3)-1 ) && ( strncmp((char*)&strTrack3,"99620520",8)==0 ) ) { Ret=ICdecode(data); if (Ret) { strcpy(type,"ICCD"); } } else if ( ( lenTrack2==sizeof(NEW1_TRACK2)-1 ) && ( lenTrack3==sizeof(NEW_TRACK3)-1 ) && ( strncmp((char*)&strTrack3,"996",3)==0 ) ) { Ret=ISONewdecode(data); if (Ret) { strcpy(type,"NWCD"); } } else if ( ( lenTrack2==sizeof(NEW_TRACK2)-1 ) && ( lenTrack3==sizeof(NEW_TRACK3)-1 ) && ( strncmp((char*)&strTrack3,"999555",6)==0 ) ) { Ret=ISONewdecode(data); if (Ret) { strcpy(type,"NWCD"); } } else if( ( lenTrack2==sizeof(HK_TRACK2)-1) && ( lenTrack3==sizeof(HK_TRACK3)-1) && ( strncmp((char*)&strTrack3,"92",2)==0 ) ) { BOOL isIC; Ret=ISOHKdecode_help(data, "23", &isIC); if (Ret) { if (isIC == TRUE) strcpy(type, "HKIC"); else strcpy(type,"HKCD"); } } else if( ( lenTrack2==sizeof(INTER_TRACK2)-1) && ( lenTrack3==sizeof(INTER_TRACK3)-1) && ( ( strncmp((char*)&strTrack3,"994",3)==0 ) ||( strncmp((char*)&strTrack3,"995",3)==0 ) ) ) { Ret=ISOINTERdecode(data); if (Ret) { strcpy(type,"INTE"); } } else if ( lenTrack2==sizeof(NEW_CREDIT_TRACK2)-1 && ( lenTrack3<16 || lenTrack3 == 104 ) ) { memcpy(data,strTrack2,16); data[16]=0; strcat(data,strTrack2); strcpy(type,"CRED"); Ret=true; } else if ( ( lenTrack2==37 ) && ( lenTrack3 == 104) && ( strncmp((char*)&strTrack3,"993",3)==0 ) ) { // New JCB Credit Card memcpy(data,strTrack2,16); data[16]=0; strcat(data,strTrack2); strcpy(type,"CRED"); // AE Card if (( data[15]=='\'') || (data[15]=='\=' )) { data[15]=' '; } Ret=true; } else if ( ( lenTrack2==37 ) && ( lenTrack3<16 ) && ( strncmp((char*)&strTrack2,"3",1)==0 ) ) { // New JCB Credit Card memcpy(data,strTrack2,16); data[16]=0; strcat(data,strTrack2); strcpy(type,"CRED"); // AE Card if (( data[15]=='\'') || (data[15]=='\=' )) { data[15]=' '; } Ret=true; } else if( ( lenTrack2==sizeof(NWPK_TRACK2)-1) && ( lenTrack3==sizeof(NWPK_TRACK3)-1) && ( strncmp((char*)&strTrack3,"60",2)==0 ) ) { Ret=ISONWPKdecode(data); if (Ret) { strcpy(type,"NWPK"); } } else if( ( lenTrack2==sizeof(NWUS_TRACK2)-1) && ( lenTrack3==sizeof(NWUS_TRACK3)-1) && ( strncmp((char*)&strTrack3,"70",2)==0 ) ) { Ret=ISONWUSdecode(data); if (Ret) { strcpy(type,"NWUS"); } } else if( ( (lenTrack2==35)&&(lenTrack3==97) )|| (lenTrack2==37)&&(lenTrack3==100) ) { Ret=ISOdecode( data); if (Ret) { if ((data[12]=='9') && (data[13]=='9')) { strcpy(type,"ODCD"); } else { strcpy(type,"ODPK"); } } } return Ret; } BOOL CARD::CMBcodeEx( char * type, char * data, char* MagData) { BOOL Ret; char MagDataBuf[TRACK_DATA_LEN]; char *ptmp; char *pDivide; char MagDataBuf1[TRACK_DATA_LEN]; char name[50]; MagData[0]=0; Ret=CMBcode(type,data,MagDataBuf); if (!Ret) return Ret; pDivide=strstr(MagDataBuf,"A"); if (pDivide!=NULL) { memmove(pDivide+2,pDivide,strlen(pDivide)+1); memcpy(pDivide,"?_;",3); } ptmp=MagDataBuf; while( *ptmp!=0) { if(*ptmp=='\'') *ptmp='='; ptmp++; } // strcpy(MagData,MagDataBuf); //改为内部处理 if (strcmp(type,"INTE")==0) //国际卡 { strcpy(name,data+sizeof(INTER_TRACK0)-1); Ret=ISOINTERcodetrack1(data,name,MagDataBuf1); if (!Ret) return Ret; sprintf(MagData,"%%%s?;%s!",MagDataBuf1,MagDataBuf); } else { sprintf(MagData,";%s?",MagDataBuf); } return Ret; } BOOL CARD::CMBdecodeEx( char* MagData, char * type, char * data) { BOOL Ret; char MagDataBuf[TRACK_DATA_LEN]; char *ptmp; char *pDivide; strcpy(MagDataBuf,MagData); pDivide=strstr(MagDataBuf,"?_;"); if (pDivide!=NULL) { memmove(pDivide,pDivide+2,strlen(pDivide+2)+1); memcpy(pDivide,"A",1); } ptmp=MagDataBuf; while( *ptmp!=0) { if(*ptmp=='=') *ptmp='\''; ptmp++; } Ret=CMBdecode(MagDataBuf,type,data); return Ret; } BOOL CARD::Othdecode( char* MagData, char * type, char * data) { BOOL Ret; char strTrack2[250], strTrack3[250]; char *pmag; int cnt; Ret=false; data[0]=0; type[0]=0; strcpy(trackData,MagData); Track23(strTrack2,strTrack3,false); pmag=strTrack2; cnt=0; while ( *pmag!=0 ) { if ( (*pmag=='\'') || (*pmag=='=') ) break; pmag++; cnt++; } if (cnt>0) { memcpy(data, strTrack2,cnt); data[cnt]=0; strcpy(type,"OTHR"); Ret=true; } return Ret; } void CARD::LoadFromFile() { m_BinSvcCod.clear(); #ifdef linux return; #else char szPath[MAX_PATH]; GetModuleFileName(NULL,szPath,MAX_PATH); string strPath = string(szPath); string fullpath = strPath.substr(0,strPath.find_last_of("\\"))+"\\BinSvcCode.dat"; ifstream fin(fullpath.c_str()); if(!fin.is_open()) return; while(!fin.eof()) { string line; getline(fin, line,'\n'); int pos = line.find("="); if (pos == string::npos) { continue; } m_BinSvcCod[line.substr(0,pos)] = line.substr(pos+1); } fin.close(); #endif } string CARD::GetSvcCod(string key) { if (m_BinSvcCod.find(key) != m_BinSvcCod.end()) { return m_BinSvcCod[key]; } return ""; } //oilyang@20201022 add CMB_CARD_TRACK_API bool CMBdecodeMag2(char* Mag2Data, char * data) { //g_pCard delete or not? if (g_pCard == NULL) g_pCard = new CARD(); //oiltest new exception if (g_pCard == NULL) return false; return g_pCard->CMBdecodeMag2(Mag2Data,data); } CMB_CARD_TRACK_API bool CMBdecodeEx(char* MagData, char * type, char * data) { if (g_pCard == NULL) g_pCard = new CARD(); //oiltest new exception if (g_pCard == NULL) return false; return g_pCard->CMBdecodeEx(MagData,type,data); }