|
@@ -0,0 +1,2222 @@
|
|
|
+//#include "stdafx.h"
|
|
|
+#include <stdio.h>
|
|
|
+#include <string.h>
|
|
|
+#include <time.h>
|
|
|
+
|
|
|
+//#include "tools.hpp"
|
|
|
+//#include "pr50-v0.h"
|
|
|
+#include "CARD-v4.HPP"
|
|
|
+
|
|
|
+//extern TPR50 pr50;
|
|
|
+
|
|
|
+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<len && i<20; i++)
|
|
|
+ {
|
|
|
+ string[i] = plus( str1[i], str2[i]);
|
|
|
+ }
|
|
|
+ return string;
|
|
|
+}
|
|
|
+
|
|
|
+char *CARD::minusString( char *str1, char *str2, int len)
|
|
|
+{
|
|
|
+ static char string[20];
|
|
|
+ for( int i=0; i<len && i<20; i++)
|
|
|
+ {
|
|
|
+ string[i] = minus( str1[i], str2[i]);
|
|
|
+ }
|
|
|
+ return string;
|
|
|
+}
|
|
|
+
|
|
|
+char *CARD::codeUserCard( char *data)
|
|
|
+{
|
|
|
+// data include:
|
|
|
+// cardNo, 6
|
|
|
+// userID, 5
|
|
|
+// password, 6
|
|
|
+// SVCD, 6
|
|
|
+ static char dest[50];
|
|
|
+ memcpy( dest, data, 8+5);
|
|
|
+ if( data[12]>='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<len; i++)
|
|
|
+ {
|
|
|
+ if( string[i] > 0X39 || string[i] < 0x30) return -1;
|
|
|
+ }
|
|
|
+ int value = 0;
|
|
|
+ int tempValue = 0;
|
|
|
+ for(int i=0; i<len; i++)
|
|
|
+ {
|
|
|
+ tempValue = (string[i] - 0x30)*(i%2+1);
|
|
|
+ value += tempValue/10 + tempValue%10;
|
|
|
+ }
|
|
|
+ value = 10 - value%10;
|
|
|
+ if( value >= 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);
|
|
|
+}
|