Card-v4.cpp 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223
  1. //#include "stdafx.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5. //#include "tools.hpp"
  6. //#include "pr50-v0.h"
  7. #include "CARD-v4.HPP"
  8. //extern TPR50 pr50;
  9. int TPR50::BPType = 1;
  10. TPR50 pr50;
  11. CARD* g_pCard = NULL;
  12. //extern TOOLS tools;
  13. char *CARD::SIGNCARD_ISOcode( SIGN_CARD_DATA *dat) //hz, 97.01.30
  14. {
  15. //TODO: 成员变量中有这个变量,很奇怪在这里 [Gifur@202572]
  16. static char trackData[300];
  17. SIGN_CARD_TRACK2 defTrack2 =
  18. {
  19. //';',
  20. {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'},
  21. '\'',
  22. {'0','0','0','0'},
  23. {'5','3','0'},
  24. {'0','0','0','0','0','0','0','0','0','0','0'},
  25. //'?',
  26. 0
  27. };
  28. static SIGN_CARD_TRACK3 defTrack3 =
  29. {
  30. //'!',
  31. {'0','1'},
  32. {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'},
  33. '\'',
  34. {'1','5','6'},
  35. {'1','5','6'},
  36. '0',
  37. {'5','0','0','0'},
  38. {'5','0','0','0'},
  39. {'0','0','0','0'},
  40. {'0','1'},
  41. '3',
  42. {'0','0','0','0','0','0'},
  43. {'5','3','0'},
  44. {'0','0'},
  45. {'0','0'},
  46. {'0','0','0','0'},
  47. {'1','0','0','0','0','0','0','0','0','0'},
  48. {'0','0','0','0','0','0','0','0','0','0','0','0'},
  49. '\'',
  50. {'0','0','0','0','0','0','0','0','0','0','0','0'},
  51. '\'',
  52. '0',
  53. {'0','0','0','0','0','0'},
  54. '0',
  55. //'?''
  56. 0
  57. };
  58. SIGN_CARD_TRACK2 *tk2 = &defTrack2;
  59. memcpy(tk2->pan, dat->pan, 18);
  60. memcpy(tk2->exprDate, dat->exprDate, 4);
  61. memcpy(tk2->cvc, dat->cvc1, 3);
  62. SIGN_CARD_TRACK3 *tk3 = &defTrack3;
  63. memcpy(tk3->pan, dat->pan, 18);
  64. memcpy(tk3->exprDate, dat->exprDate, 4);
  65. memcpy(tk3->cvc, dat->cvc1, 3);
  66. if( pr50.BPType == 1)
  67. sprintf( trackData, "%sA%s", tk2, tk3);
  68. else
  69. sprintf( trackData, "%s", tk3);
  70. return trackData;
  71. }
  72. char* CARD::SIGNCARD_ISOdecode( char *trackData) //hz, 97.01.30
  73. {
  74. static char data[100];
  75. char *pointer = trackData;
  76. if( pr50.BPType == 1)
  77. {
  78. while( *pointer != 0 && *pointer != 'A') pointer++;
  79. if(*pointer == 0)
  80. {
  81. *(char*)data=0;
  82. return data;
  83. }
  84. pointer++;
  85. }
  86. if( memcmp( pointer, "01", 2) == 0)
  87. {
  88. SIGN_CARD_TRACK3 *tk3 = ( SIGN_CARD_TRACK3*)pointer;
  89. memcpy( ((SIGN_CARD_DATA*)data)->pan, tk3->pan, 18);
  90. memcpy( ((SIGN_CARD_DATA*)data)->exprDate, tk3->exprDate, 4);
  91. memcpy( ((SIGN_CARD_DATA*)data)->cvc1, tk3->cvc, 3);
  92. }
  93. else *(char*)data = 0;
  94. return data;
  95. }
  96. char CARD::plus(char ch1, char ch2)
  97. {
  98. return ( (ch1-'0') + (ch2-'0')) % 10 +'0';
  99. }
  100. char CARD::minus(char ch1, char ch2)
  101. {
  102. int ch = (ch1-'0') - (ch2-'0');
  103. if( ch < 0 ) ch += 10;
  104. return (char)(ch+'0');
  105. }
  106. char *CARD::plusString( char *str1, char *str2, int len)
  107. {
  108. static char string[20];
  109. for( int i=0; i<len && i<20; i++)
  110. {
  111. string[i] = plus( str1[i], str2[i]);
  112. }
  113. return string;
  114. }
  115. char *CARD::minusString( char *str1, char *str2, int len)
  116. {
  117. static char string[20];
  118. for( int i=0; i<len && i<20; i++)
  119. {
  120. string[i] = minus( str1[i], str2[i]);
  121. }
  122. return string;
  123. }
  124. char *CARD::codeUserCard( char *data)
  125. {
  126. // data include:
  127. // cardNo, 6
  128. // userID, 5
  129. // password, 6
  130. // SVCD, 6
  131. static char dest[50];
  132. memcpy( dest, data, 8+5);
  133. if( data[12]>='0'&&data[12]<='9')
  134. {
  135. dest[8] = '0';
  136. }
  137. else if( data[12]>='A'&&data[12]<='Z')
  138. {
  139. char tmp[5];
  140. sprintf(tmp,"%02d",data[12]-'A'+10);
  141. dest[8] = tmp[0];
  142. dest[12]= tmp[1];
  143. }
  144. memcpy( dest+8+5, plusString( data+8+5, data+8+5+6, 6), 6);
  145. dest[ 8+5+6] = 0;
  146. return dest;
  147. }
  148. char *CARD::codeUserCardTrack( char *data)
  149. {
  150. static char dest[50];
  151. if( pr50.BPType == 1) sprintf( dest, "A%s", codeUserCard( data));
  152. else sprintf( dest, "%s", codeUserCard( data));
  153. return dest;
  154. }
  155. char *CARD::decodeUserCard( char *data, char *SVCD)
  156. {
  157. static char dest[50];
  158. memcpy( dest, data, 8+5);
  159. if ( data[8]!='0')
  160. {
  161. char tmp[5];
  162. int tmpnum;
  163. tmp[0]=data[8];
  164. tmp[1]=data[12];
  165. tmp[2]=0;
  166. sscanf(tmp,"%d",&tmpnum);
  167. dest[12]='A'+tmpnum-10;
  168. }
  169. dest[8] = 'S';
  170. memcpy( dest+8+5, minusString( data+8+5, SVCD, 6), 6);
  171. memcpy( dest+8+5+6, SVCD, 6);
  172. dest[ 8+5+6+6] = 0;
  173. return dest;
  174. }
  175. char *CARD::decodeUserCardTrack( char *data, char *SVCD)
  176. {
  177. static char dest[1];
  178. char *pointer = data;
  179. if( pr50.BPType == 1)
  180. {
  181. while( *pointer != 0 && *pointer != 'A') pointer++;
  182. if(*pointer == 0)
  183. {
  184. dest[0] = 0;
  185. return dest;
  186. }
  187. pointer++;
  188. }
  189. return decodeUserCard( pointer, SVCD);
  190. }
  191. char CARD::getCheckNum(char *string, int len)
  192. {
  193. if (len<=0)
  194. { len=strlen(string);
  195. }
  196. if (len<=0) return -1;
  197. for( int i=0; i<len; i++)
  198. {
  199. if( string[i] > 0X39 || string[i] < 0x30) return -1;
  200. }
  201. int value = 0;
  202. int tempValue = 0;
  203. for(int i=0; i<len; i++)
  204. {
  205. tempValue = (string[i] - 0x30)*(i%2+1);
  206. value += tempValue/10 + tempValue%10;
  207. }
  208. value = 10 - value%10;
  209. if( value >= 10) value = 0;
  210. return value+'0';
  211. }
  212. BOOL CARD::ISOcode( char *data)
  213. {
  214. ////////////////////////////////
  215. // data struct
  216. // 1. Passbook
  217. // 0..3 Region Code
  218. // 4..13 Account No
  219. // 14..21 Passbook
  220. // 22..27 SVCD
  221. // total:28
  222. //
  223. // 2. Card
  224. // 0..3 Region Code
  225. // 4..11 Customer No
  226. // 12..13 99
  227. // 14..21 passbook
  228. // 22..27 SVCD
  229. // total:28
  230. #define SEPARATOR '\''
  231. char *constStr1_0 = "1561560200020005213013";
  232. char *constStr1_1 = "514000000001";
  233. char *constStr2 = "0000000";
  234. if( memcmp( data, "0755", 4) == 0)
  235. {
  236. SZ_TRACK2 track2;
  237. SZ_TRACK3 track3;
  238. memcpy( track3.formatCode, "01", 2);
  239. memcpy( &track3.masterAccount[0], "690755", 6);
  240. memcpy( &track3.masterAccount[6], &data[4], 8);
  241. track3.masterAccount[6+8] = 0;
  242. track3.masterAccount[6+8] = getCheckNum( track3.masterAccount);
  243. track3.separator1 = SEPARATOR;
  244. memcpy( track3.constant1_0, constStr1_0, 22);
  245. memcpy( track3.constant1_1, constStr1_1, 12);
  246. track3.separator2 = SEPARATOR;
  247. memcpy( track3.slave1, data+4, 10);
  248. memcpy( track3.slave2, data+14, 8);
  249. memcpy( track3.controlPara, data+22, 6);
  250. track3.slave1[10] = 0;
  251. track3.slave2[8] = 0;
  252. track3.slave1[10] = getCheckNum( track3.slave1);
  253. track3.slave2[8] = getCheckNum( track3.slave2);
  254. track3.separator3 = SEPARATOR;
  255. track3.separator4 = SEPARATOR;
  256. memcpy( track3.constant2, constStr2, 7);
  257. track3.cardType = '1';
  258. memset( track3.area, '0', 8);
  259. memcpy( track3.area, data, 4);
  260. //track3.area[4] = data[ 22+6]; //track2 flag
  261. if( pr50.BPType == 1)
  262. {
  263. track3.area[4] = '1'; //track2 flag
  264. }
  265. else
  266. {
  267. track3.area[4] = '0'; //track2 flag
  268. }
  269. track3.stringEnd = 0;
  270. // copy track3 data to track2
  271. memcpy( track2.masterAccount, track3.masterAccount, 15);
  272. track2.separator1 = track3.separator1; // = '\'';
  273. memcpy( track2.constant, "1560000514", 10);
  274. track2.cardType = track3.cardType;
  275. memcpy( track2.area, track3.area, 8);
  276. memcpy( track2.area+4, track3.controlPara+3, 3); //hz, 97.01.30
  277. track2.stringEnd = 0;
  278. if( pr50.BPType == 1)
  279. sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3);
  280. else
  281. sprintf( trackData, "%s", (char*)&track3);
  282. }
  283. else
  284. {
  285. TRACK2 track2;
  286. TRACK3 track3;
  287. memcpy( track3.formatCode, "01", 2);
  288. memcpy( &track3.masterAccount[0], "690755", 6);
  289. memcpy( &track3.masterAccount[6], &data[1], 3+8);
  290. //memcpy( &track3.masterAccount[6], &data[1], 3+8);
  291. track3.masterAccount[6+3+8] = 0;
  292. track3.masterAccount[6+3+8] = getCheckNum( track3.masterAccount);
  293. track3.separator1 = SEPARATOR;
  294. //for( int i=0; i<40; i++) track3.constant1[i] = constStr1[i];
  295. memcpy( track3.constant1_0, constStr1_0, 22);
  296. //memcpy( track3.controlPara, "000000", 6);
  297. memcpy( track3.constant1_1, constStr1_1, 12);
  298. track3.separator2 = SEPARATOR;
  299. memcpy( track3.slave1, data+4, 10);
  300. memcpy( track3.slave2, data+14, 8);
  301. memcpy( track3.controlPara, data+22, 6);
  302. track3.slave1[10] = 0;
  303. track3.slave2[8] = 0;
  304. track3.slave1[10] = getCheckNum( track3.slave1);
  305. track3.slave2[8] = getCheckNum( track3.slave2);
  306. track3.separator3 = SEPARATOR;
  307. track3.separator4 = SEPARATOR;
  308. memcpy( track3.constant2, constStr2, 7);
  309. track3.cardType = '1';
  310. memset( track3.area, '0', 8);
  311. memcpy( track3.area, data, 4);
  312. //track3.area[4] = data[ 22+6]; //track2 flag
  313. if( pr50.BPType == 1)
  314. {
  315. track3.area[4] = '1'; //track2 flag
  316. }
  317. else
  318. {
  319. track3.area[4] = '0'; //track2 flag
  320. }
  321. track3.stringEnd = 0;
  322. // copy track3 data to track2
  323. memcpy( track2.masterAccount, track3.masterAccount, 15+3);
  324. track2.separator1 = track3.separator1; // = '\'';
  325. memcpy( track2.constant, "1560000514", 10);
  326. track2.cardType = track3.cardType;
  327. memcpy( track2.area, track3.area, 7);
  328. memcpy( track2.area+4, track3.controlPara+3, 3); //hz, 97.01.30
  329. track2.stringEnd = 0;
  330. if( pr50.BPType == 1)
  331. sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3);
  332. else
  333. sprintf( trackData, "%s", (char*)&track3);
  334. }
  335. return true;
  336. }
  337. char* CARD::ISOdecode2( char *data)
  338. {
  339. static char mstAccount[30];
  340. mstAccount[0] = 0;
  341. char *pointer = trackData;
  342. if( pr50.BPType != 1)
  343. {
  344. *data=0;
  345. return mstAccount;
  346. }
  347. /*
  348. if( ( //hz, Maybe have another no, so I delete it.
  349. // memcmp( pointer, "01690755", 8) != 0 ||
  350. ( memcmp( pointer, "690755755", 11) == 0
  351. && pointer[15] != '\''
  352. )
  353. ) && *tools.GetComboFromScreen( (UIW_WINDOW *)UI_WINDOW_OBJECT::windowManager->First(), "PSCD") == 'A')
  354. {
  355. *data = 0;
  356. if( strlen( pointer) > 15)
  357. {
  358. if( pointer[15] == '\'')
  359. {
  360. memcpy( mstAccount, pointer, 15);
  361. mstAccount[ 15] = 0;
  362. }
  363. else
  364. {
  365. memcpy( mstAccount, pointer, 18);
  366. mstAccount[ 18] = 0;
  367. }
  368. }
  369. return mstAccount;
  370. }
  371. else
  372. */
  373. {
  374. if( pointer[15] == '\'')
  375. {
  376. memcpy( data, pointer, 15);
  377. data[ 15] = 0;
  378. }
  379. else
  380. {
  381. memcpy( data, pointer, 18);
  382. data[ 18] = 0;
  383. }
  384. }
  385. return mstAccount;
  386. }
  387. char* CARD::ISOdecode3( char *data)
  388. {
  389. static char mstAccount[30];
  390. mstAccount[0] = 0;
  391. char *pointer = trackData;
  392. if( pr50.BPType == 1)
  393. {
  394. while( *pointer != 0 && *pointer != 'A') pointer++;
  395. if(*pointer == 0)
  396. {
  397. *data=0;
  398. return mstAccount;
  399. }
  400. pointer++;
  401. }
  402. /*
  403. if( ( //hz, Maybe have another no, so I delete it.
  404. // memcmp( pointer, "01690755", 8) != 0 ||
  405. ( memcmp( pointer, "01690755755", 11) == 0
  406. && pointer[15+2] != '\''
  407. )
  408. ) && *tools.GetComboFromScreen( (UIW_WINDOW *)UI_WINDOW_OBJECT::windowManager->First(), "PSCD") == 'A')
  409. {
  410. *data = 0;
  411. if( strlen( pointer) > 15+2)
  412. {
  413. if( pointer[15+2] == '\'')
  414. {
  415. memcpy( mstAccount, pointer, 15+2);
  416. mstAccount[ 15+2] = 0;
  417. }
  418. else
  419. {
  420. memcpy( mstAccount, pointer, 18+2);
  421. mstAccount[ 18+2] = 0;
  422. }
  423. }
  424. return mstAccount;
  425. }
  426. else
  427. */
  428. {
  429. if( pointer[15+2] == '\'')
  430. {
  431. memcpy( data, pointer+2, 15);
  432. data[ 15] = 0;
  433. }
  434. else
  435. {
  436. memcpy( data, pointer+2, 18);
  437. data[ 18] = 0;
  438. }
  439. }
  440. return mstAccount;
  441. }
  442. BOOL CARD::ISOdecode( char *data)
  443. {
  444. ////////////////////////////////
  445. // data struct
  446. // 1. Passbook
  447. // 0..3 Region Code
  448. // 4..13 Account No
  449. // 14..21 Passbook
  450. // 22..27 SVCD
  451. // total:28
  452. //
  453. // 2. Card
  454. // 0..3 Region Code
  455. // 4..11 Customer No
  456. // 12..13 99
  457. // 14..21 passbook
  458. // 22..27 SVCD
  459. // total:28
  460. char *pointer = trackData;
  461. data[0]=0;
  462. //skip track 2
  463. if( pr50.BPType == 1)
  464. {
  465. while( *pointer != 0 && *pointer != 'A') pointer++;
  466. if(*pointer == 0)
  467. {
  468. return false;
  469. }
  470. pointer++;
  471. }
  472. if ( memcmp( pointer, "01690755755", 11) == 0
  473. && pointer[15+2] != '\''
  474. )
  475. {
  476. return false;
  477. }
  478. // separator1
  479. while( *pointer!=0 && *pointer != '\'') pointer++;
  480. if(*pointer == 0)
  481. {
  482. return false;
  483. }
  484. pointer++;
  485. //SVCD
  486. memcpy(data+22,pointer+22, 6);
  487. // separator2
  488. while( *pointer!=0 && *pointer != '\'') pointer++;
  489. if(*pointer == 0)
  490. {
  491. return false;
  492. }
  493. pointer++;
  494. // get account no from slave1
  495. memcpy( data+4, pointer, 10);
  496. // separator3
  497. while( *pointer!=0 && *pointer != '\'') pointer++;
  498. if(*pointer == 0)
  499. {
  500. return false;
  501. }
  502. pointer++;
  503. // get passbook/cardno from slave2
  504. memcpy( data+14, pointer, 8);
  505. // separator4
  506. while( *pointer!=0 && *pointer != '\'') pointer++;
  507. if(*pointer == 0)
  508. {
  509. return false;
  510. }
  511. pointer++;
  512. //region code
  513. memcpy( data, pointer+8, 4);
  514. data[28] = 0;
  515. return true;
  516. }
  517. char* CARD::CREDIT_ISOdecode( char *data)
  518. {
  519. ////////////////////////////////
  520. // data struct
  521. // 1. Passbook
  522. // 0..3 Region Code
  523. // 4..11 Customer No
  524. // 4..13 Account No
  525. // 14..21 Passbook
  526. // total:22
  527. //
  528. // 2. Card
  529. // 0..3 Region Code
  530. // 4..11 Customer No
  531. // 11..13 const '99'
  532. // 14..21 CardNo
  533. // total:22
  534. /*
  535. FILE *file = fopen( "debug1", "wt");
  536. fprintf( file, (char*)&trackData);
  537. fclose(file);
  538. */
  539. //printf( "%s\n", (char*)&trackData);
  540. static char mstAccount[30];
  541. mstAccount[0] = 0;
  542. char *pointer = trackData;
  543. //TRACK3 *track3;
  544. if( pr50.BPType == 1)
  545. {
  546. while( *pointer != 0 && *pointer != 'A') pointer++;
  547. if(*pointer == 0)
  548. {
  549. *data=0;
  550. return mstAccount;
  551. }
  552. pointer++;
  553. }
  554. //track3=(TRACK3 *)pointer;
  555. /*
  556. FILE *fp = fopen( "debug", "wt");
  557. fprintf( fp, "%s\n", pointer);
  558. fclose( fp);
  559. */
  560. //printf( "%s\n", pointer);
  561. for( int i=0; i<2 && *pointer!=0 && *pointer!='\''; i++)
  562. pointer++;
  563. // separator1
  564. while( *pointer!=0 && *pointer != '\'')
  565. {
  566. *data = *pointer;
  567. data++;
  568. pointer++;
  569. }
  570. *data++ = '\'';
  571. if(*pointer == 0)
  572. {
  573. *data=0;
  574. return mstAccount;
  575. }
  576. pointer++;
  577. memcpy( data, pointer+35, 4);//valid date
  578. data += 4;
  579. memcpy( data, "000", 3);//servic code
  580. data += 3;
  581. /*
  582. // separator2
  583. while( *pointer!=0 && *pointer != '\'') pointer++;
  584. if(*pointer == 0)
  585. {
  586. *data=0;
  587. return mstAccount;
  588. }
  589. pointer++;
  590. */
  591. // separator3
  592. while( *pointer!=0 && *pointer != '\'') pointer++;
  593. if(*pointer == 0)
  594. {
  595. *data=0;
  596. return mstAccount;
  597. }
  598. pointer++;
  599. // separator4
  600. while( *pointer!=0 && *pointer != '\'') pointer++;
  601. if(*pointer == 0)
  602. {
  603. *data=0;
  604. return mstAccount;
  605. }
  606. pointer++;
  607. //hz, 96.05.28 memcpy(data, track3->area, 4);
  608. memcpy( data, pointer+1, 6);
  609. *(data+6) = 0;
  610. return mstAccount;
  611. }
  612. void CARD::INTERNET_ISOcode( char *PAN, char *CVV)
  613. {
  614. // parameter struct
  615. // PAN 10
  616. // CVV 6
  617. if( strlen( PAN) != 10)
  618. {
  619. //AfxMessageBox( "Error: length of PAN error!\n");
  620. return;
  621. }
  622. if( strlen( CVV) != 6)
  623. {
  624. //AfxMessageBox( "Error: length of CVV error!\n");
  625. return;
  626. }
  627. #define SEPARATOR '\''
  628. INTERNET_TRACK2 track2;
  629. INTERNET_TRACK3 track3;
  630. memcpy( track2.PAN, "690000", 6);
  631. memcpy( track2.PAN+6, PAN, 10);
  632. track2.separator1[0] = SEPARATOR;
  633. memcpy( track2.expirationDate, "9912", 4);
  634. memcpy( track2.serviceCode, "120", 3);
  635. memcpy( track2.CVV, CVV+3, 3);
  636. track2.stringEnd = 0;
  637. memcpy( track3.formatCode, "01", 2);
  638. memcpy( track3.PAN, "690000", 6);
  639. memcpy( track3.PAN+6, PAN, 10);
  640. track3.separator1[0] = SEPARATOR;
  641. memcpy( track3.countryCode, "156", 3);
  642. memcpy( track3.currency, "156", 3);
  643. memcpy( track3.currencyExponent, "0", 1);
  644. memcpy( track3.amountAuthorized, "5000", 4);
  645. memcpy( track3.amountRemaining, "5000", 4);
  646. memcpy( track3.cycleBegin, "0000", 4);
  647. memcpy( track3.cycleLength, "01", 2);
  648. memcpy( track3.retryCount, "0", 1);
  649. memcpy( track3.PINPARM, CVV, 6);
  650. memcpy( track3.interchangeControl, "1", 1);
  651. memcpy( track3.serviceRestriction, "20", 2);
  652. memcpy( track3.SRofSAN1, "00", 2);
  653. memcpy( track3.SRofSAN2, "00", 2);
  654. memcpy( track3.expiryDate, "9912", 4);
  655. memcpy( track3.sequenceNo, "1", 1);
  656. track3.securityNo[0] = SEPARATOR;
  657. memcpy( track3.SAN1, "000000000000", 12);
  658. track3.separator2[0] = SEPARATOR;
  659. memcpy( track3.SAN2, "000000000000", 12);
  660. track3.separator3[0] = SEPARATOR;
  661. memcpy( track3.relayMarker, "0", 1);
  662. memcpy( track3.CCD, "000000", 6);
  663. track3.transactionDate[0] = SEPARATOR;
  664. track3.AVV[0] = SEPARATOR;
  665. memcpy( track3.INNIC, CVV, 3);
  666. memcpy( track3.CVV, CVV+3, 3);
  667. track3.stringEnd = 0;
  668. if( pr50.BPType == 1)
  669. sprintf( trackData, "%sA%s", (char*)&track2, (char*)&track3);
  670. else
  671. sprintf( trackData, "%s", (char*)&track3);
  672. }
  673. char* CARD::INTERNET_ISOdecode( char* PAN, char* CVV)
  674. {
  675. static char staticPAN[30];
  676. staticPAN[0] = 0;
  677. char *pointer = trackData;
  678. //printf( "%s\n", trackData);
  679. if( pr50.BPType == 1)
  680. {
  681. while( *pointer != 0 && *pointer != 'A') pointer++;
  682. if(*pointer == 0)
  683. {
  684. *PAN = 0;
  685. *CVV = 0;
  686. return staticPAN;
  687. }
  688. pointer++;
  689. }
  690. INTERNET_TRACK3 *track3 = (INTERNET_TRACK3 *)pointer;
  691. memcpy( PAN, track3->PAN+6, 10);
  692. PAN[10] = 0;
  693. memcpy( CVV, track3->PINPARM, 6);
  694. CVV[10] = 0;
  695. memcpy( staticPAN, track3->PAN+6, 10);
  696. staticPAN[10] = 0;
  697. //printf( "%s\n", staticPAN);
  698. return staticPAN;
  699. }
  700. BOOL CARD::Track23( char *strTrack2, char *strTrack3, BOOL bWrite, char* MARGType )
  701. {
  702. char *pDivide;
  703. if (bWrite)
  704. {
  705. if( pr50.BPType == 1)
  706. sprintf( this->trackData, "%sA%s", strTrack2, strTrack3);
  707. else
  708. sprintf( this->trackData, "%s", strTrack3); //二当三!
  709. }
  710. else
  711. {
  712. if( pr50.BPType == 1)
  713. {
  714. if( strcmp(MARGType,"23")==0 || strcmp(MARGType,"3")==0 )
  715. {
  716. pDivide=strstr(this->trackData,"A");
  717. if (pDivide==NULL)
  718. {
  719. strTrack2[0]=0;
  720. strTrack3[0]=0;
  721. return FALSE;
  722. }
  723. memcpy(strTrack2, this->trackData,pDivide-this->trackData);
  724. strTrack2[pDivide-this->trackData]=0;
  725. strcpy(strTrack3,pDivide+1);
  726. }
  727. else if( strcmp(MARGType,"2")==0 )
  728. {
  729. strcpy(strTrack2,this->trackData);
  730. strTrack3[0]=0;
  731. }
  732. else
  733. {
  734. strTrack2[0]=0;
  735. strTrack3[0]=0;
  736. return FALSE;
  737. }
  738. }
  739. else
  740. {
  741. strTrack2[0]=0;
  742. strcpy(strTrack3,this->trackData);
  743. }
  744. }
  745. return TRUE;
  746. }
  747. int CARD::ISONewCardType(char * CardBin)
  748. {
  749. if (CardBin[0]=='6')
  750. {
  751. return 1;
  752. }
  753. else
  754. {
  755. return 0;
  756. }
  757. }
  758. BOOL CARD::ISONewcode( char *data)
  759. {
  760. NEW_TRACK0 *pdata;
  761. char CardBin[10];
  762. int CardType;
  763. pdata=(NEW_TRACK0 *)data;
  764. memcpy(CardBin,pdata->masterAccount,6);
  765. CardBin[6]=0;
  766. CardType=ISONewCardType( CardBin);
  767. if( CardType==0 )
  768. {
  769. return ISONewcode0(data);
  770. }
  771. else
  772. {
  773. return ISONewcode1(data);
  774. }
  775. }
  776. BOOL CARD::ISONewcode0( char *data) //9字头卡
  777. {
  778. NEW_TRACK0 *pdata;
  779. NEW_TRACK2 strTrack2;
  780. NEW_TRACK3 strTrack3;
  781. char defNewTrack2[]= "9555500000000000\'49121200000000000000";
  782. char defNewTrack3[]= "999555500000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000000";
  783. pdata=(NEW_TRACK0 *)data;
  784. strcpy((char*)&strTrack2,defNewTrack2);
  785. strcpy((char*)&strTrack3,defNewTrack3);
  786. memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  787. memcpy(strTrack2.appendData,pdata->SVCD,sizeof(pdata->SVCD));
  788. strTrack2.appendData[6]=pdata->cardSerial;
  789. strTrack2.appendData[7]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  790. memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
  791. memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  792. memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
  793. strTrack3.cardSerial=pdata->cardSerial;
  794. memcpy(strTrack3.SAN1,(pdata->masterAccount)+6,sizeof(strTrack3.SAN1));
  795. memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
  796. memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
  797. strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  798. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  799. }
  800. BOOL CARD::ISONewcode1( char *data) // 6字头卡
  801. /* BZSL 八转十六项目
  802. * 函数名:BOOL CARD::ISONewcode1( char *data)
  803. * 功能: 对6开头的16位卡按照:2磁道为两地通2磁道格式,
  804. * 3磁道为普通16位卡3磁道格式进行写磁的操作
  805. */
  806. {
  807. NEW_TRACK0 *pdata;
  808. NEW1_TRACK2 strTrack2;
  809. NEW_TRACK3 strTrack3;
  810. int randValue = 0;
  811. char strTmp[128];
  812. char defNew1Track2[38]= "0000000000000000"
  813. "\'"
  814. "4912"
  815. "120"
  816. "12345"
  817. "00888000";
  818. char defNewTrack3[]= "999555500000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000000";
  819. pdata=(NEW_TRACK0 *)data;
  820. strcpy((char*)&strTrack2,defNew1Track2);
  821. strcpy((char*)&strTrack3,defNewTrack3);
  822. memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  823. do
  824. {
  825. srand( (unsigned)time( NULL ) );
  826. randValue = rand();
  827. }while(randValue == 0);
  828. sprintf(strTmp,"%05d",(unsigned int)randValue);
  829. memcpy(strTrack2.localCheckMessage,strTmp,5);
  830. strTrack2.appendData[1]=pdata->cardSerial; //此处做了修改
  831. /*
  832. randValue = 0;
  833. do
  834. {
  835. srand( (unsigned)time( NULL ) );
  836. randValue = rand();
  837. }while(randValue == 0);
  838. sprintf(strTmp,"%02d",(unsigned int)randValue);
  839. memcpy(strTrack2.appendData,strTmp,2);
  840. */
  841. memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
  842. memcpy(strTrack2.appendData+2,pdata->SVCD,6); //此处做了修改
  843. /*
  844. memcpy(strTrack2.appendData+2,pdata->SVCD,3);
  845. randValue = 0;
  846. do
  847. {
  848. srand( (unsigned)time( NULL ) );
  849. randValue = rand();
  850. }while(randValue == 0);
  851. sprintf(strTmp,"%03d",(unsigned int)randValue);
  852. memcpy(strTrack2.appendData+5,strTmp,3);
  853. */
  854. //3磁道采用老的95555卡的3磁道格式
  855. memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  856. memcpy(strTrack3.SVCD,strTrack2.appendData+2,6);
  857. strTrack3.cardSerial=pdata->cardSerial;
  858. memcpy(strTrack3.SAN1,(pdata->masterAccount)+6,sizeof(strTrack3.SAN1));
  859. memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
  860. memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
  861. strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  862. /* //增加IC借记卡,zhanglei,2011.12.15
  863. 1.621486(银联IC金葵花)(服务代码 220)
  864. 2.621485(银联IC金卡)(服务代码 220)
  865. 3.621483(银联IC普卡) (服务代码 220)
  866. */
  867. /* //改用配置文件的方式,zhanglei,20141011
  868. if ((strncmp((char*)&strTrack2, "621486", 6) == 0) || (strncmp((char*)&strTrack2, "621485", 6) == 0) ||
  869. (strncmp((char*)&strTrack2, "621483", 6) == 0))
  870. memcpy(strTrack2.serviceCode, "220", 3);
  871. */
  872. string binCod;
  873. binCod.assign((char*)&strTrack2, 6);
  874. string svcCod = this->GetSvcCod(binCod);
  875. if (svcCod != "")
  876. memcpy(strTrack2.serviceCode, svcCod.c_str(), 3);
  877. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  878. }
  879. BOOL CARD::ICcode( char *data) // IC磁条卡,逻辑基本copy ISONewcode1,修改处有注释
  880. {
  881. IC_TRACK0 *pdata;
  882. IC_TRACK2 strTrack2;
  883. IC_TRACK3 strTrack3;
  884. int randValue = 0;
  885. char strTmp[128];
  886. char defNew1Track2[]= "0000000000000000000"
  887. "\'"
  888. "4912"
  889. "620" //服务代码620 zhanglei
  890. "123"
  891. "0888000";
  892. char defNewTrack3[]= "999555500000000000000\'1561560500050000001015000000214000049120\'0000000000\'000000000\'00000000000000000000";
  893. pdata=(IC_TRACK0 *)data;
  894. strcpy((char*)&strTrack2,defNew1Track2);
  895. strcpy((char*)&strTrack3,defNewTrack3);
  896. memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  897. do
  898. {
  899. srand( (unsigned)time( NULL ) );
  900. randValue = rand();
  901. }while(randValue == 0);
  902. sprintf(strTmp,"%03d",(unsigned int)randValue);
  903. memcpy(strTrack2.localCheckMessage,strTmp,3);
  904. strTrack2.appendData[0]=pdata->cardSerial; //此处做了修改 zhanglei
  905. /*
  906. randValue = 0;
  907. do
  908. {
  909. srand( (unsigned)time( NULL ) );
  910. randValue = rand();
  911. }while(randValue == 0);
  912. sprintf(strTmp,"%02d",(unsigned int)randValue);
  913. memcpy(strTrack2.appendData,strTmp,2);
  914. */
  915. memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
  916. memcpy(strTrack2.appendData+1,pdata->SVCD,6); //此处做了修改 zhanglei
  917. /*
  918. memcpy(strTrack2.appendData+2,pdata->SVCD,3);
  919. randValue = 0;
  920. do
  921. {
  922. srand( (unsigned)time( NULL ) );
  923. randValue = rand();
  924. }while(randValue == 0);
  925. sprintf(strTmp,"%03d",(unsigned int)randValue);
  926. memcpy(strTrack2.appendData+5,strTmp,3);
  927. */
  928. //3磁道采用老的95555卡的3磁道格式
  929. memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  930. memcpy(strTrack3.SVCD,strTrack2.appendData+1,6); //取二磁道SVCD, zhanglei
  931. strTrack3.cardSerial=pdata->cardSerial;
  932. memcpy(strTrack3.SAN1,(pdata->masterAccount)+9,sizeof(strTrack3.SAN1));
  933. memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
  934. memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
  935. strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  936. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  937. }
  938. BOOL CARD::ISOHKcode( char *data)
  939. {
  940. return ISOHKcode_help(data, FALSE);
  941. }
  942. BOOL CARD::ISOHKcode_help( char *data, BOOL isIC)
  943. /* 香港一卡通专用
  944. * Lint
  945. */
  946. {
  947. HK_TRACK0 *pdata;
  948. // NEW1_TRACK2 与 HK_TRACK2 相同
  949. HK_TRACK2 strTrack2;
  950. HK_TRACK3 strTrack3;
  951. char defNew1Track2[38]= "0000000000000000"
  952. "\'"
  953. "4912"
  954. "120"
  955. "12345"
  956. "00888000";
  957. char defNew1Track2_IC[38]= "0000000000000000"
  958. "\'"
  959. "4912"
  960. "220"
  961. "12345"
  962. "00888000";
  963. char defHKTrack2[38]= "4026580000000000"
  964. "\'"
  965. "0000"
  966. "101"
  967. "12345"
  968. "00888000";
  969. char defHKTrack3[105]= "92"
  970. "40"
  971. "2658"
  972. "600000000000"
  973. "\'\'"
  974. "000"
  975. "0"
  976. "00"
  977. "00"
  978. "0000"
  979. "0000"
  980. "00"
  981. "4"
  982. "000000"
  983. "0"
  984. "10"
  985. "00"
  986. "00"
  987. "0000"
  988. "00"
  989. //"000000000000"
  990. //"000000000000"
  991. "000000000000000123000000"
  992. "0000"
  993. "0000"
  994. "0000"
  995. "0000"
  996. "000"
  997. "1";
  998. int randValue = 0;
  999. char strTmp[128];
  1000. pdata=(HK_TRACK0 *)data;
  1001. if (pdata->masterAccount[0]=='4') //402658
  1002. {
  1003. strcpy((char*)&strTrack2,defHKTrack2);
  1004. }
  1005. else //621299
  1006. {
  1007. if (isIC == TRUE)
  1008. strcpy((char*)&strTrack2,defNew1Track2_IC);
  1009. else
  1010. strcpy((char*)&strTrack2,defNew1Track2);
  1011. }
  1012. strcpy((char*)&strTrack3,defHKTrack3);
  1013. memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  1014. do
  1015. {
  1016. srand( (unsigned)time( NULL ) );
  1017. randValue = rand();
  1018. }while(randValue == 0);
  1019. sprintf(strTmp,"%05d",(unsigned int)randValue);
  1020. memcpy(strTrack2.localCheckMessage,strTmp,5);
  1021. strTrack2.appendData[1]=pdata->cardSerial; //此处做了修改
  1022. /*
  1023. randValue = 0;
  1024. do
  1025. {
  1026. srand( (unsigned)time( NULL ) );
  1027. randValue = rand();
  1028. }while(randValue == 0);
  1029. sprintf(strTmp,"%02d",(unsigned int)randValue);
  1030. memcpy(strTrack2.appendData,strTmp,2);
  1031. */
  1032. memcpy(strTrack2.appendData+2,pdata->SVCD,6); //此处做了修改
  1033. /*
  1034. memcpy(strTrack2.appendData+2,pdata->SVCD,3);
  1035. randValue = 0;
  1036. do
  1037. {
  1038. srand( (unsigned)time( NULL ) );
  1039. randValue = rand();
  1040. }while(randValue == 0);
  1041. sprintf(strTmp,"%03d",(unsigned int)randValue);
  1042. memcpy(strTrack2.appendData+5,strTmp,3);
  1043. */
  1044. memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
  1045. // memcpy(strTrack3.masterAccount,pdata->masterAccount+6,10);
  1046. // 此处做了修改
  1047. memcpy(strTrack3.cardType,pdata->masterAccount,sizeof(pdata->masterAccount));
  1048. memcpy(strTrack3.masterAccount+10,"00",2);
  1049. memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
  1050. strTrack3.language = pdata->language;
  1051. *(strTrack3.cardSerial+1)=pdata->cardSerial;
  1052. /************************
  1053. > 子帐号 帐号类型 子帐号限制码 货币代码
  1054. 》主账号 : 621299860******* 1 0 1(HKD)
  1055. > 港币子帐户: 860XXXXXXX01 1 0 1(HKD)
  1056. > 人民币子帐户: 860XXXXXXX03 1 0 3(RMB)
  1057. > 其中 XXXXXXX 为PAN号的最后7位。
  1058. ************************/
  1059. if (isIC == TRUE)
  1060. {
  1061. memcpy(strTrack3.appendData, "860", 3);
  1062. memcpy(strTrack3.appendData+3, pdata->masterAccount+9, 7);
  1063. memcpy(strTrack3.appendData+10, "01", 2);
  1064. memcpy(strTrack3.appendData+12, "860", 3);
  1065. memcpy(strTrack3.appendData+15, pdata->masterAccount+9, 7);
  1066. memcpy(strTrack3.appendData+22, "03", 2);
  1067. strTrack3.firstSubsidiaryAccountLimit = '0';
  1068. strTrack3.firstSubsidiaryAccountType = '1';
  1069. memcpy(strTrack3.secondSubsidiaryAccountMessage, "10", 2);
  1070. memcpy(strTrack3.currencyCode, "113", 3);
  1071. strTrack3.exchangeCode = '9';
  1072. }
  1073. else
  1074. {
  1075. /******************************************
  1076. * 取当前日期的函数需要在DOS进行重新编写
  1077. ******************************************/
  1078. #ifdef linux
  1079. memset(strTmp,0,128);
  1080. tzset();
  1081. time_t now = time(NULL);
  1082. strftime(strTmp,128,"%m/%d/%y",localtime(&now));
  1083. #else
  1084. _tzset();
  1085. _strdate(strTmp);
  1086. #endif
  1087. memcpy(strTrack3.appendData,"20",2);
  1088. memcpy(strTrack3.appendData+2,strTmp,2);
  1089. memcpy(strTrack3.appendData+4,strTmp+3,2);
  1090. memcpy(strTrack3.appendData+6,strTmp+6,2);
  1091. randValue = 0;
  1092. do
  1093. {
  1094. srand( (unsigned)time( NULL ) );
  1095. randValue = rand();
  1096. }while(randValue == 0);
  1097. sprintf(strTmp,"%07d",(unsigned int)randValue);
  1098. memcpy(strTrack3.appendData+8,strTmp,7);
  1099. //此处做了修改
  1100. memcpy(strTrack3.appendData+15,pdata->SVCD,6);
  1101. randValue = 0;
  1102. do
  1103. {
  1104. srand( (unsigned)time( NULL ) );
  1105. randValue = rand();
  1106. }while(randValue == 0);
  1107. sprintf(strTmp,"%03d",(unsigned int)randValue);
  1108. memcpy(strTrack3.appendData+21,strTmp,3);
  1109. /*
  1110. memcpy(strTrack3.appendData+15,pdata->SVCD,3);
  1111. randValue = 0;
  1112. do
  1113. {
  1114. srand( (unsigned)time( NULL ) );
  1115. randValue = rand();
  1116. }while(randValue == 0);
  1117. sprintf(strTmp,"%06d",(unsigned int)randValue);
  1118. memcpy(strTrack3.appendData+18,strTmp,6);
  1119. */
  1120. }
  1121. strTrack3.PIN = pdata->PIN;
  1122. memcpy(strTrack3.PINOffset,pdata->PINOffset,sizeof(strTrack3.PINOffset));
  1123. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  1124. }
  1125. BOOL CARD::ISONewdecode( char *data,char* MARGType)
  1126. {
  1127. NEW_TRACK0 *pdata;
  1128. NEW_TRACK2 strTrack2; // maxof(NEW_TRACK2, NEW1_TRACK2)
  1129. NEW_TRACK3 strTrack3;
  1130. /*
  1131. char CardBin[10];
  1132. int CardType;
  1133. */
  1134. data[0]=0;
  1135. if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
  1136. return FALSE;
  1137. if ( strlen((char*)&strTrack3)!=sizeof(NEW_TRACK3)-1)
  1138. return FALSE;
  1139. pdata=(NEW_TRACK0 *)data;
  1140. memset((char*)pdata,'0',sizeof(NEW_TRACK0));
  1141. pdata->stringEnd=0;
  1142. memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount));
  1143. pdata->cardSerial=strTrack3.cardSerial;
  1144. memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); //此处做了修改
  1145. /*
  1146. memcpy(CardBin,pdata->masterAccount,6);
  1147. CardBin[6]=0;
  1148. CardType=ISONewCardType(CardBin);
  1149. if (CardType==1) //需要后面补零
  1150. {
  1151. memcpy(pdata->SVCD,strTrack3.SVCD,3);
  1152. memcpy(pdata->SVCD+3,"000",3);
  1153. }
  1154. else
  1155. memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
  1156. //八转十六BZSL 以上工作为将6开头的卡号的SVCD码后3位强制置0,其他卡号不变
  1157. */
  1158. memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD));
  1159. memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
  1160. return TRUE;
  1161. }
  1162. BOOL CARD::CMBdecodeMag2( char* Mag2Data, char * data)
  1163. {
  1164. NEW_TRACK0 *pdata;
  1165. NEW1_TRACK2 *Track2;
  1166. data[0]=0;
  1167. if ( strlen(Mag2Data)!=37)
  1168. return FALSE;
  1169. //so ugly
  1170. if (memcmp(Mag2Data,"370576",6) == 0 || memcmp(Mag2Data,"374820",6) == 0 || memcmp(Mag2Data,"374821",6) == 0)
  1171. {
  1172. AE_TRACK2_DATA *pTrack2Data;
  1173. AE_T2_DATA *pT2Data;
  1174. pTrack2Data = (AE_TRACK2_DATA*)Mag2Data;
  1175. pT2Data = (AE_T2_DATA*)data;
  1176. memset((char*)pT2Data,'0',sizeof(AE_T2_DATA));
  1177. pT2Data->stringEnd=0;
  1178. memcpy(pT2Data->masterAccount,pTrack2Data->account,sizeof(pT2Data->masterAccount));
  1179. pT2Data->cardSerial = pTrack2Data->reserved[0];
  1180. memcpy(pT2Data->cardSeCode,pTrack2Data->cardSeCode,sizeof(pT2Data->cardSeCode));
  1181. memcpy(pT2Data->expireDate,pTrack2Data->expireDate,sizeof(pT2Data->expireDate));
  1182. return TRUE;
  1183. }
  1184. pdata=(NEW_TRACK0 *)data;
  1185. Track2 = (NEW1_TRACK2 *)Mag2Data;
  1186. memset((char*)pdata,'0',sizeof(NEW_TRACK0));
  1187. pdata->stringEnd=0;
  1188. memcpy(pdata->masterAccount, Track2->masterAccount,sizeof(pdata->masterAccount));
  1189. pdata->cardSerial=Track2->appendData[1];
  1190. memcpy(pdata->expireDate, Track2->expireDate, sizeof(pdata->expireDate));
  1191. memcpy(pdata->SVCD,Track2->appendData+2,sizeof(pdata->SVCD));
  1192. return TRUE;
  1193. }
  1194. BOOL CARD::ICdecode( char *data,char* MARGType)
  1195. {
  1196. IC_TRACK0 *pdata;
  1197. IC_TRACK2 strTrack2; // maxof(NEW_TRACK2, NEW1_TRACK2)
  1198. IC_TRACK3 strTrack3;
  1199. /*
  1200. char CardBin[10];
  1201. int CardType;
  1202. */
  1203. data[0]=0;
  1204. if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
  1205. return FALSE;
  1206. if ( strlen((char*)&strTrack3)!=sizeof(NEW_TRACK3)-1)
  1207. return FALSE;
  1208. pdata=(IC_TRACK0 *)data;
  1209. memset((char*)pdata,'0',sizeof(NEW_TRACK0));
  1210. pdata->stringEnd=0;
  1211. memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount));
  1212. pdata->cardSerial=strTrack3.cardSerial;
  1213. memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD)); //此处做了修改
  1214. /*
  1215. memcpy(CardBin,pdata->masterAccount,6);
  1216. CardBin[6]=0;
  1217. CardType=ISONewCardType(CardBin);
  1218. if (CardType==1) //需要后面补零
  1219. {
  1220. memcpy(pdata->SVCD,strTrack3.SVCD,3);
  1221. memcpy(pdata->SVCD+3,"000",3);
  1222. }
  1223. else
  1224. memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
  1225. //八转十六BZSL 以上工作为将6开头的卡号的SVCD码后3位强制置0,其他卡号不变
  1226. */
  1227. memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD));
  1228. memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
  1229. return TRUE;
  1230. }
  1231. BOOL CARD::ISOHKdecode( char *data,char* MARGType)
  1232. {
  1233. BOOL isIC;
  1234. return ISOHKdecode_help(data, MARGType, &isIC);
  1235. }
  1236. BOOL CARD::ISOHKdecode_help( char *data,char* MARGType, BOOL* isIC)
  1237. {
  1238. HK_TRACK0 *pdata;
  1239. HK_TRACK2 strTrack2;
  1240. HK_TRACK3 strTrack3;
  1241. data[0]=0;
  1242. if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
  1243. return FALSE;
  1244. if ((strTrack2.serviceCode[0] == '2') && (strTrack2.serviceCode[1] == '2') &&
  1245. (strTrack2.serviceCode[2] == '0'))
  1246. *isIC = TRUE;
  1247. else
  1248. *isIC = FALSE;
  1249. pdata=(HK_TRACK0 *)data;
  1250. memset((char*)pdata,'0',sizeof(HK_TRACK0));
  1251. pdata->stringEnd=0;
  1252. memcpy(pdata->masterAccount,strTrack2.masterAccount,sizeof(pdata->masterAccount));
  1253. pdata->cardSerial=strTrack3.cardSerial[1];
  1254. memcpy(pdata->SVCD,strTrack2.appendData+2,6); //此处做了修改
  1255. // memcpy(pdata->SVCD,strTrack2.appendData+2,3);
  1256. if (pdata->masterAccount[0]=='4')
  1257. {
  1258. memcpy(pdata->oldRGCD,"0000",sizeof(pdata->oldRGCD));
  1259. }
  1260. else
  1261. {
  1262. memcpy(pdata->oldRGCD,"0852",sizeof(pdata->oldRGCD));
  1263. }
  1264. // memcpy(pdata->oldRGCD,"0755",sizeof(pdata->oldRGCD)); //此处做了修改
  1265. memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
  1266. pdata->language = strTrack3.language ;
  1267. pdata->PIN = strTrack3.PIN;
  1268. memcpy(pdata->PINOffset,strTrack3.PINOffset,sizeof(strTrack3.PINOffset));
  1269. return TRUE;
  1270. }
  1271. /*
  1272. void main()
  1273. {
  1274. char *data = "12345678S7890098765656565";
  1275. char *dest = codeUserCard( data);
  1276. printf( "%s\n", dest);
  1277. char *dest1 = decodeUserCard( dest, "656565");
  1278. printf( "%s\n", dest1);
  1279. if( strcmp( data, dest1) == 0) printf( "ok\n");
  1280. }
  1281. */
  1282. char* CARD::trimstr(char* strSrc)
  1283. {
  1284. int i,len;
  1285. len=strlen(strSrc);
  1286. if (len<=0)
  1287. {
  1288. return strSrc;
  1289. }
  1290. //trim right
  1291. for(i=len-1;i>=0;i--)
  1292. {
  1293. if (strSrc[i]!=' ')
  1294. {
  1295. break;
  1296. }
  1297. }
  1298. strSrc[i+1]=0;
  1299. //trim left
  1300. i=0;
  1301. while(strSrc[i]==' ')
  1302. { i++;
  1303. }
  1304. if (i>0)
  1305. {
  1306. memmove(strSrc,strSrc+i,len+1-i);
  1307. }
  1308. return strSrc;
  1309. }
  1310. BOOL CARD::ISOINTERcode( char *data)
  1311. /* 国际借记卡专用
  1312. * Lint
  1313. */
  1314. {
  1315. INTER_TRACK0 *pdata;
  1316. INTER_TRACK2 strTrack2;
  1317. INTER_TRACK3 strTrack3;
  1318. char defINTERTrack2[38]= "4026580000000000"
  1319. "\'"
  1320. "0000"
  1321. "101"
  1322. "12345"
  1323. "00888000";
  1324. char defINTERTrack3[105]= "99"
  1325. "41"
  1326. "0062"
  1327. "6000000000"
  1328. "\'"
  1329. "156"
  1330. "156"
  1331. "0"
  1332. "5000"
  1333. "5000"
  1334. "0000"
  1335. "01"
  1336. "5"
  1337. "000000"
  1338. "2"
  1339. "1"
  1340. "4"
  1341. "00"
  1342. "00"
  1343. "0000"
  1344. "0"
  1345. "\'"
  1346. "0000000000"
  1347. "\'"
  1348. "000000000"
  1349. "\'"
  1350. "0"
  1351. "000000"
  1352. "0000000000000000";
  1353. int randValue = 0;
  1354. char strTmp[128];
  1355. pdata=(INTER_TRACK0 *)data;
  1356. strcpy((char*)&strTrack2,defINTERTrack2);
  1357. strcpy((char*)&strTrack3,defINTERTrack3);
  1358. memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  1359. do
  1360. {
  1361. srand( (unsigned)time( NULL ) );
  1362. randValue = rand();
  1363. }while(randValue == 0);
  1364. sprintf(strTmp,"%05d",(unsigned int)randValue);
  1365. memcpy(strTrack2.localCheckMessage,strTmp,5);
  1366. strTrack2.appendData[1]=pdata->cardSerial; //此处做了修改
  1367. /*
  1368. randValue = 0;
  1369. do
  1370. {
  1371. srand( (unsigned)time( NULL ) );
  1372. randValue = rand();
  1373. }while(randValue == 0);
  1374. sprintf(strTmp,"%02d",(unsigned int)randValue);
  1375. memcpy(strTrack2.appendData,strTmp,2);
  1376. */
  1377. memcpy(strTrack2.appendData+2,pdata->SVCD,6); //此处做了修改
  1378. /*
  1379. memcpy(strTrack2.appendData+2,pdata->SVCD,3);
  1380. randValue = 0;
  1381. do
  1382. {
  1383. srand( (unsigned)time( NULL ) );
  1384. randValue = rand();
  1385. }while(randValue == 0);
  1386. sprintf(strTmp,"%03d",(unsigned int)randValue);
  1387. memcpy(strTrack2.appendData+5,strTmp,3);
  1388. */
  1389. memcpy(strTrack2.expireDate,pdata->expireDate,sizeof(strTrack2.expireDate));
  1390. string binCod;
  1391. binCod.assign((char*)&strTrack2, 6);
  1392. string svcCod = this->GetSvcCod(binCod);
  1393. if (svcCod != "")
  1394. memcpy(strTrack2.serviceCode, svcCod.c_str(), 3);
  1395. memcpy(strTrack3.formatCode,"99",2);
  1396. memcpy(strTrack3.cardType,pdata->masterAccount,2);
  1397. memcpy(strTrack3.bankSign,pdata->masterAccount+2,4);
  1398. memcpy(strTrack3.masterAccount,pdata->masterAccount+6,10);
  1399. memcpy(strTrack3.grantControlCode,pdata->SVCD,6); //此处做了修改
  1400. /*
  1401. memcpy(strTrack3.grantControlCode,pdata->SVCD,3);
  1402. randValue = 0;
  1403. do
  1404. {
  1405. srand( (unsigned)time( NULL ) );
  1406. randValue = rand();
  1407. }while(randValue == 0);
  1408. sprintf(strTmp,"%03d",(unsigned int)randValue);
  1409. memcpy(strTrack3.grantControlCode+3,strTmp,3);
  1410. */
  1411. memcpy(strTrack3.expireDate,pdata->expireDate,sizeof(strTrack3.expireDate));
  1412. strTrack3.cardSerial = pdata->cardSerial;
  1413. memcpy(strTrack3.firstSubsidiaryAccount,pdata->masterAccount+6,10);
  1414. memcpy(strTrack3.appendData,pdata->oldRGCD,sizeof(pdata->oldRGCD));
  1415. strTrack3.checkNum[0]=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  1416. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  1417. }
  1418. BOOL CARD::ISOINTERcodetrack1( char *data, char *name, char *parmTrack1)
  1419. /* 国际借记卡一磁道专用
  1420. * CaiJun
  1421. */
  1422. {
  1423. INTER_TRACK0 *pdata;
  1424. char *pTrack1;
  1425. char namefmt[30];
  1426. int len;
  1427. pdata=(INTER_TRACK0 *)data;
  1428. pTrack1=parmTrack1;
  1429. memcpy(pTrack1,"B",1);
  1430. pTrack1+=1;
  1431. memcpy(pTrack1,pdata->masterAccount,sizeof(pdata->masterAccount));
  1432. pTrack1+=sizeof(pdata->masterAccount);
  1433. memcpy(pTrack1,"^",1);
  1434. pTrack1+=1;
  1435. strcpy(namefmt,name);
  1436. trimstr(namefmt);
  1437. strcat(namefmt,"/");
  1438. len=strlen(namefmt);
  1439. memcpy(pTrack1,namefmt,len);
  1440. pTrack1+=len;
  1441. memcpy(pTrack1,"^",1);
  1442. pTrack1+=1;
  1443. memcpy(pTrack1,pdata->expireDate,sizeof(pdata->expireDate));
  1444. pTrack1+=sizeof(pdata->expireDate);
  1445. memcpy(pTrack1,"1011234500",10);
  1446. pTrack1+=10;
  1447. memcpy(pTrack1,pdata->SVCD,3);
  1448. pTrack1+=3;
  1449. memcpy(pTrack1,"000000",6);
  1450. pTrack1+=6;
  1451. *pTrack1=0;
  1452. return TRUE;
  1453. }
  1454. BOOL CARD::ISOINTERdecode( char *data,char* MARGType)
  1455. {
  1456. INTER_TRACK0 *pdata;
  1457. INTER_TRACK2 strTrack2;
  1458. INTER_TRACK3 strTrack3;
  1459. data[0]=0;
  1460. if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
  1461. return FALSE;
  1462. pdata=(INTER_TRACK0 *)data;
  1463. memset((char*)pdata,'0',sizeof(INTER_TRACK0));
  1464. pdata->stringEnd=0;
  1465. memcpy(pdata->masterAccount,strTrack2.masterAccount,sizeof(pdata->masterAccount));
  1466. pdata->cardSerial=strTrack3.cardSerial;
  1467. memcpy(pdata->SVCD,strTrack2.appendData+2,6); //此处做了修改
  1468. // memcpy(pdata->SVCD,strTrack2.appendData+2,3);
  1469. memcpy(pdata->expireDate,strTrack3.expireDate,sizeof(strTrack3.expireDate));
  1470. memcpy(pdata->oldRGCD,strTrack3.appendData,sizeof(pdata->oldRGCD));
  1471. return TRUE;
  1472. }
  1473. BOOL CARD::ISONWPKcode( char *data) //新系统存折
  1474. {
  1475. NWPK_TRACK0 *pdata;
  1476. NWPK_TRACK2 strTrack2;
  1477. NWPK_TRACK3 strTrack3;
  1478. char defNWPKTrack2[]= "000000000000000\'00000000000000000";
  1479. char defNWPKTrack3[]= "60000000000000000\'156156500015100699\'00000000000\'0000000\'0000008130379181303791";
  1480. pdata=(NWPK_TRACK0 *)data;
  1481. strcpy((char*)&strTrack2,defNWPKTrack2);
  1482. strcpy((char*)&strTrack3,defNWPKTrack3);
  1483. memcpy(strTrack2.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  1484. memcpy(strTrack2.PSBNBR,pdata->PSBNBR,sizeof(pdata->PSBNBR));
  1485. memcpy(strTrack2.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
  1486. strTrack2.AccountChk=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  1487. memcpy(strTrack3.masterAccount,pdata->masterAccount,sizeof(pdata->masterAccount));
  1488. memcpy(strTrack3.PSBNBR,pdata->PSBNBR,sizeof(pdata->PSBNBR));
  1489. memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
  1490. strTrack3.AccountChk=getCheckNum(pdata->masterAccount,sizeof(pdata->masterAccount));
  1491. strTrack3.PSBCHK=getCheckNum(pdata->PSBNBR,sizeof(pdata->PSBNBR));
  1492. strTrack3.CVCCHK=getCheckNum(pdata->SVCD,sizeof(pdata->SVCD));
  1493. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  1494. }
  1495. BOOL CARD::ISONWPKdecode( char *data,char* MARGType) //新系统存折
  1496. {
  1497. NWPK_TRACK0 *pdata;
  1498. NWPK_TRACK2 strTrack2;
  1499. NWPK_TRACK3 strTrack3;
  1500. data[0]=0;
  1501. if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
  1502. return FALSE;
  1503. if ( strlen((char*)&strTrack3)!=sizeof(NWPK_TRACK3)-1)
  1504. return FALSE;
  1505. pdata=(NWPK_TRACK0 *)data;
  1506. memset((char*)pdata,'0',sizeof(NWPK_TRACK0));
  1507. pdata->stringEnd=0;
  1508. memcpy(pdata->masterAccount,strTrack3.masterAccount,sizeof(pdata->masterAccount));
  1509. memcpy(pdata->PSBNBR,strTrack3.PSBNBR,sizeof(pdata->PSBNBR));
  1510. memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
  1511. return TRUE;
  1512. }
  1513. BOOL CARD::ISONWUScode( char *data) //新系统用户卡
  1514. {
  1515. NWUS_TRACK0 *pdata;
  1516. NWUS_TRACK2 strTrack2;
  1517. NWUS_TRACK3 strTrack3;
  1518. char defNWUSTrack2[]= "000000\'00000000";
  1519. char defNWUSTrack3[]= "70000000\'5000060106990\'0000000\'0000008130379181303791";
  1520. pdata=(NWUS_TRACK0 *)data;
  1521. strcpy((char*)&strTrack2,defNWUSTrack2);
  1522. strcpy((char*)&strTrack3,defNWUSTrack3);
  1523. memcpy(strTrack2.USRNBR,pdata->USRNBR,sizeof(pdata->USRNBR));
  1524. strTrack2.cardSerial=pdata->cardSerial;
  1525. memcpy(strTrack2.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
  1526. strTrack2.USRCHK=getCheckNum(pdata->USRNBR,sizeof(pdata->USRNBR));
  1527. memcpy(strTrack3.USRNBR,pdata->USRNBR,sizeof(pdata->USRNBR));
  1528. strTrack3.cardSerial=pdata->cardSerial;
  1529. memcpy(strTrack3.SVCD,pdata->SVCD,sizeof(pdata->SVCD));
  1530. strTrack3.USRCHK=getCheckNum(pdata->USRNBR,sizeof(pdata->USRNBR));
  1531. strTrack3.CVCCHK=getCheckNum(pdata->SVCD,sizeof(pdata->SVCD));
  1532. return Track23((char*)&strTrack2,(char*)&strTrack3,TRUE);
  1533. }
  1534. BOOL CARD::ISONWUSdecode( char *data,char* MARGType) //新系统用户卡
  1535. {
  1536. NWUS_TRACK0 *pdata;
  1537. NWUS_TRACK2 strTrack2;
  1538. NWUS_TRACK3 strTrack3;
  1539. data[0]=0;
  1540. if( !Track23((char*)&strTrack2,(char*)&strTrack3,FALSE,MARGType) )
  1541. return FALSE;
  1542. if ( strlen((char*)&strTrack3)!=sizeof(NWUS_TRACK3)-1)
  1543. return FALSE;
  1544. pdata=(NWUS_TRACK0 *)data;
  1545. memset((char*)pdata,'0',sizeof(NWUS_TRACK0));
  1546. pdata->stringEnd=0;
  1547. memcpy(pdata->USRNBR,strTrack3.USRNBR,sizeof(pdata->USRNBR));
  1548. pdata->cardSerial=strTrack3.cardSerial;
  1549. memcpy(pdata->SVCD,strTrack3.SVCD,sizeof(pdata->SVCD));
  1550. return TRUE;
  1551. }
  1552. BOOL CARD::CMBcode( char * type, char * data, char* MagData)
  1553. {
  1554. BOOL Ret;
  1555. ////////////////////////////////
  1556. // data struct
  1557. // 1. ODPK 存折
  1558. // 0..3 Region Code (RGCD)
  1559. // 4..13 Account No (ACNO)
  1560. // 14..21 Passbook (PSBK)
  1561. // 22..27 SVCD (SVCD)
  1562. // total:28
  1563. //
  1564. // 2. ODCD 旧一卡通
  1565. // 0..3 Region Code (RGCD)
  1566. // 4..11 Customer No (CUNO)
  1567. // 12..13 99 (99)
  1568. // 14..21 passbook (PSBK)
  1569. // 22..27 SVCD (SVCD)
  1570. // total:28
  1571. //
  1572. // 3.NWCD 新一卡通
  1573. // 0..15 卡号 (EACNBR)
  1574. // 16..16 卡序号 (PSBSEQ)
  1575. // 17..22 SVCD (CVCCOD)
  1576. // 23..26 Region Code (REGCOD)
  1577. // 27..30 有效期 (EXPDAT)
  1578. // total 31
  1579. //
  1580. // 4.HKCD 香港一卡通
  1581. // 0..15 卡号 (EACNBR)
  1582. // 16..16 卡序号 (PSBSEQ)
  1583. // 17..22 SVCD (CVCCOD)
  1584. // 23..26 Region Code (REGCOD)
  1585. // 27..30 有效期 (EXPDAT)
  1586. // 31..31 语言标志 (语言标志)
  1587. // 32..32 校验位 (校验位)
  1588. // 33..37 PIN偏移量 (PIN偏移量)
  1589. // total 38
  1590. //
  1591. // 5.NWPK 新系统存折
  1592. // 0..14 存折号 (EACNBR)
  1593. // 15..24 凭证号 (PSBNBR)
  1594. // 25..30 SVCD (CVCCOD)
  1595. // total 31
  1596. //
  1597. // 6.NWUS 新系统用户卡
  1598. // 0..5 用户号 (USRNBR)
  1599. // 6..6 卡序号 (PSBSEQ)
  1600. // 7..12 SVCD (CVCCOD)
  1601. // total 13
  1602. // 7.INTE 国际借记卡
  1603. // 0..15 卡号 (EACNBR)
  1604. // 16..16 卡序号 (PSBSEQ)
  1605. // 17..22 SVCD (CVCCOD)
  1606. // 23..26 Region Code (REGCOD)
  1607. // 27..30 有效期 (EXPDAT)
  1608. // total 31
  1609. // 8.ICCD IC磁条卡 zhanglei 20100919
  1610. // 0..18 卡号 (EACNBR)
  1611. // 16..16 卡序号 (PSBSEQ)
  1612. // 17..22 SVCD (CVCCOD)
  1613. // 23..26 Region Code (REGCOD)
  1614. // 27..30 有效期 (EXPDAT)
  1615. // total 34
  1616. // 9.HKIC HK IC磁条卡 zhanglei 20110721
  1617. // 同HKCD,服务代码为220
  1618. Ret=false;
  1619. MagData[0]=0;
  1620. if (strcmp(type,"ODCD")==0)
  1621. {
  1622. Ret=ISOcode(data);
  1623. }
  1624. else if (strcmp(type,"ODPK")==0)
  1625. {
  1626. ISOcode(data);
  1627. Ret=true;
  1628. }
  1629. else if (strcmp(type,"NWCD")==0)
  1630. {
  1631. Ret=ISONewcode(data);
  1632. }
  1633. else if (strcmp(type,"HKCD")==0)
  1634. {
  1635. Ret=ISOHKcode(data);
  1636. }
  1637. else if (strcmp(type,"HKIC")==0)
  1638. {
  1639. Ret=ISOHKcode_help(data, TRUE);
  1640. }
  1641. else if (strcmp(type,"INTE")==0)
  1642. {
  1643. Ret=ISOINTERcode(data);
  1644. }
  1645. else if (strcmp(type,"NWPK")==0)
  1646. {
  1647. Ret=ISONWPKcode(data);
  1648. }
  1649. else if (strcmp(type,"NWUS")==0)
  1650. {
  1651. Ret=ISONWUScode(data);
  1652. }
  1653. else if (strcmp(type,"ICCD")==0)
  1654. {
  1655. Ret=ICcode(data);
  1656. }
  1657. if (Ret)
  1658. {
  1659. strcpy(MagData,trackData);
  1660. }
  1661. return Ret;
  1662. }
  1663. BOOL CARD::CMBdecode( char* MagData, char * type, char * data)
  1664. {
  1665. // CRED 招行信用卡
  1666. // 0..15 卡号 (EACNBR)
  1667. // 16..47 二磁道 (TK2DTA)
  1668. // total 48
  1669. BOOL Ret;
  1670. char strTrack2[250], strTrack3[250];
  1671. int lenTrack2, lenTrack3;
  1672. Ret=false;
  1673. data[0]=0;
  1674. type[0]=0;
  1675. strcpy(trackData,MagData);
  1676. Track23(strTrack2,strTrack3,false);
  1677. lenTrack2=strlen((char*)&strTrack2);
  1678. lenTrack3=strlen((char*)&strTrack3);
  1679. //4-VISA,5-MASTER,6-银联,3-JCB
  1680. if ( ( lenTrack2==sizeof(IC_TRACK2)-1 ) &&
  1681. ( lenTrack3==sizeof(IC_TRACK3)-1 ) &&
  1682. ( strncmp((char*)&strTrack3,"99620520",8)==0 ) )
  1683. {
  1684. Ret=ICdecode(data);
  1685. if (Ret)
  1686. { strcpy(type,"ICCD");
  1687. }
  1688. }
  1689. else if ( ( lenTrack2==sizeof(NEW1_TRACK2)-1 ) &&
  1690. ( lenTrack3==sizeof(NEW_TRACK3)-1 ) &&
  1691. ( strncmp((char*)&strTrack3,"996",3)==0 ) )
  1692. {
  1693. Ret=ISONewdecode(data);
  1694. if (Ret)
  1695. { strcpy(type,"NWCD");
  1696. }
  1697. }
  1698. else if ( ( lenTrack2==sizeof(NEW_TRACK2)-1 ) &&
  1699. ( lenTrack3==sizeof(NEW_TRACK3)-1 ) &&
  1700. ( strncmp((char*)&strTrack3,"999555",6)==0 ) )
  1701. {
  1702. Ret=ISONewdecode(data);
  1703. if (Ret)
  1704. { strcpy(type,"NWCD");
  1705. }
  1706. }
  1707. else if( ( lenTrack2==sizeof(HK_TRACK2)-1) &&
  1708. ( lenTrack3==sizeof(HK_TRACK3)-1) &&
  1709. ( strncmp((char*)&strTrack3,"92",2)==0 ) )
  1710. {
  1711. BOOL isIC;
  1712. Ret=ISOHKdecode_help(data, "23", &isIC);
  1713. if (Ret)
  1714. {
  1715. if (isIC == TRUE)
  1716. strcpy(type, "HKIC");
  1717. else
  1718. strcpy(type,"HKCD");
  1719. }
  1720. }
  1721. else if( ( lenTrack2==sizeof(INTER_TRACK2)-1) &&
  1722. ( lenTrack3==sizeof(INTER_TRACK3)-1) &&
  1723. ( ( strncmp((char*)&strTrack3,"994",3)==0 )
  1724. ||( strncmp((char*)&strTrack3,"995",3)==0 ) ) )
  1725. {
  1726. Ret=ISOINTERdecode(data);
  1727. if (Ret)
  1728. { strcpy(type,"INTE");
  1729. }
  1730. }
  1731. else if ( lenTrack2==sizeof(NEW_CREDIT_TRACK2)-1 &&
  1732. ( lenTrack3<16 || lenTrack3 == 104 ) )
  1733. {
  1734. memcpy(data,strTrack2,16);
  1735. data[16]=0;
  1736. strcat(data,strTrack2);
  1737. strcpy(type,"CRED");
  1738. Ret=true;
  1739. }
  1740. else if ( ( lenTrack2==37 ) &&
  1741. ( lenTrack3 == 104) &&
  1742. ( strncmp((char*)&strTrack3,"993",3)==0 ) )
  1743. {
  1744. // New JCB Credit Card
  1745. memcpy(data,strTrack2,16);
  1746. data[16]=0;
  1747. strcat(data,strTrack2);
  1748. strcpy(type,"CRED");
  1749. // AE Card
  1750. if (( data[15]=='\'') || (data[15]=='\=' ))
  1751. { data[15]=' ';
  1752. }
  1753. Ret=true;
  1754. }
  1755. else if ( ( lenTrack2==37 ) &&
  1756. ( lenTrack3<16 ) &&
  1757. ( strncmp((char*)&strTrack2,"3",1)==0 ) )
  1758. {
  1759. // New JCB Credit Card
  1760. memcpy(data,strTrack2,16);
  1761. data[16]=0;
  1762. strcat(data,strTrack2);
  1763. strcpy(type,"CRED");
  1764. // AE Card
  1765. if (( data[15]=='\'') || (data[15]=='\=' ))
  1766. { data[15]=' ';
  1767. }
  1768. Ret=true;
  1769. }
  1770. else if( ( lenTrack2==sizeof(NWPK_TRACK2)-1) &&
  1771. ( lenTrack3==sizeof(NWPK_TRACK3)-1) &&
  1772. ( strncmp((char*)&strTrack3,"60",2)==0 ) )
  1773. {
  1774. Ret=ISONWPKdecode(data);
  1775. if (Ret)
  1776. { strcpy(type,"NWPK");
  1777. }
  1778. }
  1779. else if( ( lenTrack2==sizeof(NWUS_TRACK2)-1) &&
  1780. ( lenTrack3==sizeof(NWUS_TRACK3)-1) &&
  1781. ( strncmp((char*)&strTrack3,"70",2)==0 ) )
  1782. {
  1783. Ret=ISONWUSdecode(data);
  1784. if (Ret)
  1785. { strcpy(type,"NWUS");
  1786. }
  1787. }
  1788. else if( ( (lenTrack2==35)&&(lenTrack3==97) )|| (lenTrack2==37)&&(lenTrack3==100) )
  1789. {
  1790. Ret=ISOdecode( data);
  1791. if (Ret)
  1792. {
  1793. if ((data[12]=='9') && (data[13]=='9'))
  1794. { strcpy(type,"ODCD");
  1795. }
  1796. else
  1797. { strcpy(type,"ODPK");
  1798. }
  1799. }
  1800. }
  1801. return Ret;
  1802. }
  1803. BOOL CARD::CMBcodeEx( char * type, char * data, char* MagData)
  1804. {
  1805. BOOL Ret;
  1806. char MagDataBuf[TRACK_DATA_LEN];
  1807. char *ptmp;
  1808. char *pDivide;
  1809. char MagDataBuf1[TRACK_DATA_LEN];
  1810. char name[50];
  1811. MagData[0]=0;
  1812. Ret=CMBcode(type,data,MagDataBuf);
  1813. if (!Ret) return Ret;
  1814. pDivide=strstr(MagDataBuf,"A");
  1815. if (pDivide!=NULL)
  1816. {
  1817. memmove(pDivide+2,pDivide,strlen(pDivide)+1);
  1818. memcpy(pDivide,"?_;",3);
  1819. }
  1820. ptmp=MagDataBuf;
  1821. while( *ptmp!=0)
  1822. {
  1823. if(*ptmp=='\'') *ptmp='=';
  1824. ptmp++;
  1825. }
  1826. // strcpy(MagData,MagDataBuf); //改为内部处理
  1827. if (strcmp(type,"INTE")==0) //国际卡
  1828. {
  1829. strcpy(name,data+sizeof(INTER_TRACK0)-1);
  1830. Ret=ISOINTERcodetrack1(data,name,MagDataBuf1);
  1831. if (!Ret) return Ret;
  1832. sprintf(MagData,"%%%s?;%s!",MagDataBuf1,MagDataBuf);
  1833. }
  1834. else
  1835. {
  1836. sprintf(MagData,";%s?",MagDataBuf);
  1837. }
  1838. return Ret;
  1839. }
  1840. BOOL CARD::CMBdecodeEx( char* MagData, char * type, char * data)
  1841. {
  1842. BOOL Ret;
  1843. char MagDataBuf[TRACK_DATA_LEN];
  1844. char *ptmp;
  1845. char *pDivide;
  1846. strcpy(MagDataBuf,MagData);
  1847. pDivide=strstr(MagDataBuf,"?_;");
  1848. if (pDivide!=NULL)
  1849. {
  1850. memmove(pDivide,pDivide+2,strlen(pDivide+2)+1);
  1851. memcpy(pDivide,"A",1);
  1852. }
  1853. ptmp=MagDataBuf;
  1854. while( *ptmp!=0)
  1855. {
  1856. if(*ptmp=='=') *ptmp='\'';
  1857. ptmp++;
  1858. }
  1859. Ret=CMBdecode(MagDataBuf,type,data);
  1860. return Ret;
  1861. }
  1862. BOOL CARD::Othdecode( char* MagData, char * type, char * data)
  1863. {
  1864. BOOL Ret;
  1865. char strTrack2[250], strTrack3[250];
  1866. char *pmag;
  1867. int cnt;
  1868. Ret=false;
  1869. data[0]=0;
  1870. type[0]=0;
  1871. strcpy(trackData,MagData);
  1872. Track23(strTrack2,strTrack3,false);
  1873. pmag=strTrack2;
  1874. cnt=0;
  1875. while ( *pmag!=0 )
  1876. {
  1877. if ( (*pmag=='\'') || (*pmag=='=') ) break;
  1878. pmag++;
  1879. cnt++;
  1880. }
  1881. if (cnt>0)
  1882. {
  1883. memcpy(data, strTrack2,cnt);
  1884. data[cnt]=0;
  1885. strcpy(type,"OTHR");
  1886. Ret=true;
  1887. }
  1888. return Ret;
  1889. }
  1890. void CARD::LoadFromFile()
  1891. {
  1892. m_BinSvcCod.clear();
  1893. #ifdef linux
  1894. return;
  1895. #else
  1896. char szPath[MAX_PATH];
  1897. GetModuleFileName(NULL,szPath,MAX_PATH);
  1898. string strPath = string(szPath);
  1899. string fullpath = strPath.substr(0,strPath.find_last_of("\\"))+"\\BinSvcCode.dat";
  1900. ifstream fin(fullpath.c_str());
  1901. if(!fin.is_open())
  1902. return;
  1903. while(!fin.eof())
  1904. {
  1905. string line;
  1906. getline(fin, line,'\n');
  1907. int pos = line.find("=");
  1908. if (pos == string::npos)
  1909. {
  1910. continue;
  1911. }
  1912. m_BinSvcCod[line.substr(0,pos)] = line.substr(pos+1);
  1913. }
  1914. fin.close();
  1915. #endif
  1916. }
  1917. string CARD::GetSvcCod(string key)
  1918. {
  1919. if (m_BinSvcCod.find(key) != m_BinSvcCod.end())
  1920. {
  1921. return m_BinSvcCod[key];
  1922. }
  1923. return "";
  1924. }
  1925. //oilyang@20201022 add
  1926. CMB_CARD_TRACK_API bool CMBdecodeMag2(char* Mag2Data, char * data)
  1927. {
  1928. //g_pCard delete or not?
  1929. if (g_pCard == NULL)
  1930. g_pCard = new CARD();
  1931. //oiltest new exception
  1932. if (g_pCard == NULL)
  1933. return false;
  1934. return g_pCard->CMBdecodeMag2(Mag2Data,data);
  1935. }
  1936. CMB_CARD_TRACK_API bool CMBdecodeEx(char* MagData, char * type, char * data)
  1937. {
  1938. if (g_pCard == NULL)
  1939. g_pCard = new CARD();
  1940. //oiltest new exception
  1941. if (g_pCard == NULL)
  1942. return false;
  1943. return g_pCard->CMBdecodeEx(MagData,type,data);
  1944. }