#ifndef CARD_HPP #define CARD_HPP ////////////////////////////////////////////////////////////////////////////// // MODULE: Y-PR50.HPP // PORPUSE: Print Sub Class // low level print control // margetic read and write // password keyboard input // DEVELOP TOOL: BOLAND C++ V3.1 // ZINC C++ V3.5 // AUTHOR: HUANG-ZHEN // WEI-JIANGBO // DATE: 1995.1.8 // VERSION: Version 3.0 // // //hz, modified on 95.1.19 #include #include #ifdef linux typedef int BOOL; #define TRUE 1 #define FALSE 0 #else //#include #include #include #include #include #endif //linux #define BAUD 0xe0 /* Baud 9600 */ #define BAUD_RATE 9600 #define ShowLogo 57 #define RS_INIT 0x00 #define RS_XMT 0x01 #define RS_RCV 0x02 #define RS_STATUS 0x03 #define esc 0x1b #ifdef linux #define true 1 #define false 0 #endif //linux #define TIM_OUT_BIT 0x8000 #define XMT_RDV_BIT 0x2000 #define BRK_DET_BIT 0x1000 #define FRM_ERR_BIT 0x0800 #define PAR_ERR_BIT 0x0400 #define OVR_RUN_BIT 0x0200 #define RCV_ERR_BIT 0x8e00 //hz, #define BAUD 0xe0 /* Baud 9600 */ #define PARA 0x00 /* Para None */ #define STOP 0x00 /* Stop 1 */ #define DATA 0x03 /* Data 8 */ #define COM1 1 //hz, 0 /* COM1 port */ #define PORT_ERR 1 #define PORT_OK 0 #define BUFSIZE 1024 #define CLR_BIM "\033\062" #define SET_BIM "\033\061" #define LINE_BUFSIZ 640 //hz, change 240, now, can write 40 chinese word #ifdef linux #define true 1 #define false 0 #endif //linux #define YES 1 #define NO 0 #define OK 1 #define ERR 0 #define ABORT -1 #define NOTHING 0 #define PUBLIC #define LOCAL static #define CME_USER_BREAK 2 #define CM_FORMAT_ERR 3 #define CM_LEN_TRACK1 110 #define CM_LEN_TRACK2 40 #define CM_LEN_TRACK3 110 #define CM_LEN_BUFF (CM_LEN_TRACK1+CM_LEN_TRACK2+CM_LEN_TRACK3+50) #define PORT_COM1 0x03F8 /* COM 1 */ #define PORT_COM2 0x02F8 // COM 2 #define PORT_DATA 0 /* DATA */ #define PORT_IER 1 /* Interrupt enable register */ #define PORT_IIR 2 /* Interrupt info. register */ #define PORT_LCR 3 /* Line control register */ #define PORT_MCR 4 /* Modem control register */ #define PORT_LSR 5 /* Line status register */ #define PORT_MSR 6 /* Modem status register */ typedef struct { char track1[CM_LEN_TRACK1]; char track2[CM_LEN_TRACK2]; char track3[CM_LEN_TRACK3]; } TCMtrackdata; //typedef char BYTE; //typedef unsigned int WORD; typedef int PR50_BOOLEAN; struct CHIN_font { char upper_half[16]; char lower_half[16]; }; #pragma warning(disable:4786) #include #include #include using namespace std; typedef struct SIGN_CARD_DATA //hz, 97.01.30 { char pan[18]; // left //char merchant[8]; //char cardType; // 1.sign card 2.save card 3... //char moneyCode[2]; // 10 //char amount[5]; char exprDate[4]; char cvc1[3]; //char cvc2[15]; //char reserved[10]; char stringEnd; } sign_card_data; typedef struct SIGN_CARD_TRACK2 //hz, 97.01.30 { //char stx; // ; char pan[18]; char fs; // = char exprDate[4]; char cardType[3]; // 530 char cvc[11]; //char etx; // ? char stringEnd; } sign_card_track2; typedef struct SIGN_CARD_TRACK3 //hz, 97.01.30 { //char stx; // ! char formate[2]; // 01 char pan[18]; char fs1; // = char country[3]; // 156 char moneyCode[3]; // 156 char point; // 0 char auth[4]; // 5000 char remSum[4]; // 5000 char rsDate[4]; // 0000 char rLength[2]; // 01 char retry; // 3 char pinOffset[6]; // 000000 char cardType[3]; // 530 char TA_SR1[2]; // 00 char TA_SR2[2]; // 00 char exprDate[4]; char fix[10]; // 1000000000 char san1[12]; // 000000000000 char fs2; // = char san2[12]; // 000000000000 char fs3; // = char tFlag; // 0 char cvc[6]; char sFlag; // 0 //char etx; // ? char stringEnd; } sign_card_track3; typedef struct CREDIT_CARD_TRACK2 { //char start; char masterAccount[16]; char separator1; // = '\''; char expirationDate[4]; char serviceCode[3]; char discretionaryData[11]; //char end; char stringEnd; } credit_card_track2; typedef struct NEW_CREDIT_TRACK2 { //char start; char masterAccount[16]; char separator1; // = '\''; char otherData[15]; //char end; char stringEnd; } new_credit_track2; typedef struct SZ_TRACK2 { //char start; char masterAccount[15]; char separator1; // = '\''; char constant[10]; //= "1560000514" char cardType; char area[8]; //char end; char stringEnd; } sz_track_2; typedef struct TRACK2 { //char start; char masterAccount[15+3]; char separator1; // = '\''; char constant[10]; //= "1560000514" char cardType; char area[7]; //char end; char stringEnd; } track_2; typedef struct TRACK3 { char formatCode[2]; // = { '0', '1'}; char masterAccount[15+3]; char separator1; // = '\''; char constant1_0[22]; char controlPara[6]; char constant1_1[12]; char separator2; char slave1[11]; char separator3; char slave2[9]; char separator4; char constant2[7]; char cardType; char area[8]; char stringEnd; } track_3; typedef struct SZ_TRACK3 { char formatCode[2]; // = { '0', '1'}; char masterAccount[15]; //hz, 96.05.28 char separator1; // = '\''; char constant1_0[22]; char controlPara[6]; char constant1_1[12]; char separator2; char slave1[11]; char separator3; char slave2[9]; char separator4; char constant2[7]; char cardType; char area[8]; char stringEnd; } sz_track_3; typedef struct INTERNET_TRACK2 { //char start; char PAN[16]; char separator1[1]; // = '\''; char expirationDate[4]; // char serviceCode[3]; char CVV[3]; //char end; char stringEnd; } internet_track_2; typedef struct INTERNET_TRACK3 { char formatCode[2]; // = { '0', '1'}; char PAN[16]; char separator1[1]; // = '\''; char countryCode[3]; char currency[3]; char currencyExponent[1]; char amountAuthorized[4]; char amountRemaining[4]; char cycleBegin[4]; char cycleLength[2]; char retryCount[1]; char PINPARM[6]; char interchangeControl[1]; char serviceRestriction[2]; char SRofSAN1[2]; char SRofSAN2[2]; char expiryDate[4]; char sequenceNo[1]; char securityNo[1]; char SAN1[12]; char separator2[1]; char SAN2[12]; char separator3[1]; char relayMarker[1]; char CCD[6]; char transactionDate[1]; char AVV[1]; char INNIC[3]; char CVV[3]; char stringEnd; } internet_track_3; /* typedef struct NEW_TRACK0 { char masterAccount[16]; char cardSerial; char SVCD[6]; char oldRGCD[4]; char oldCUNO[8]; char oldPSBK[8]; char stringEnd; } new_track_0; */ typedef struct NEW_TRACK0 { char masterAccount[16]; char cardSerial; char SVCD[6]; char oldRGCD[4]; char expireDate[4]; char stringEnd; } new_track_0; typedef struct IC_TRACK0 { char masterAccount[19]; char cardSerial; char SVCD[6]; char oldRGCD[4]; char expireDate[4]; char stringEnd; } ic_track_0; typedef struct NEW_TRACK2 //9555银联卡 { // char start; // ; char masterAccount[16]; char separator1; // ' char expireDate[4]; // * 9912->4912 char serviceCode[3]; // 220->120 char appendData[13]; // SVCD(6) +卡顺号(1) +CVC(3)+'000' // char endFlag; // ? // char LRC; char stringEnd; } new_track_2; typedef struct NEW1_TRACK2 // 6字头银联卡 { // char start; // ; char masterAccount[16]; //* char separator1; // ' char expireDate[4]; // * 9912->4912 char serviceCode[3]; // 101->120 char localCheckMessage[5]; // 12345 PVKI(1) + PVV(4) char appendData[8]; //* 随机数(2)+ CVV(3) + 随机数(3) // char endFlag; // ? // char LRC; char stringEnd; } new1_track_2; typedef struct IC_TRACK2 // 6字头IC卡, zhanglei, 2010.09.19 { // char start; // ; char masterAccount[19]; //* 帐号长度与NEW1_TRACK2不同,localCheckMessage和appendData调整 char separator1; // ' char expireDate[4]; // * 9912->4912 char serviceCode[3]; // 101->120 char localCheckMessage[3]; // 12345 PVKI(1) + PVV(4) char appendData[7]; //* 随机数(2)+ CVV(3) + 随机数(3) // char endFlag; // ? // char LRC; char stringEnd; } ic_track_2; typedef struct HK_TRACK0 //Lint 香港两地通 2003-1-6 16:16 { char masterAccount[16]; char cardSerial; char SVCD[6]; char oldRGCD[4]; char expireDate[4]; char language; char PIN; //* PIN校验位 char PINOffset[5]; //* PIN偏移量 char stringEnd; } hk_track_0; typedef struct HK_TRACK2 //Lint 香港一卡通 2002-11-25 16:53 { // char start; // ; char masterAccount[16]; //* char separator1; // ' char expireDate[4]; // * char serviceCode[3]; // 101 char localCheckMessage[5]; // 12345 PVKI(1) + PVV(4) char appendData[8]; //* 随机数(2)+ CVV(3) + 随机数(3) // char endFlag; // ? // char LRC; char stringEnd; } hk_track_2; //extern const char defHKTrack2[]; //香港一卡通 2002-11-25 17:03 //extern const char defNewTrack2[]; typedef struct NEW_TRACK3 { // char start; // ; char formatCode[2]; // 99 char masterAccount[16]; char separator1; // ' char countryCode[3]; // 156 char currencyCode[3]; // 156 char moneyExp; // 0 char periodAccredit[4]; // 5000 char periodBalance[4]; // 5000 char periodStartDate[4]; // 0000->0001 char periodLength[2]; // 01 char passwordRetry; // 5 char SVCD[6]; char exchangeCode; // 2 char PANTASR[2]; // 14 char SAN1TASR[2]; // 00 char SAN2TASR[2]; // 00 char expireDate[4]; // * 9912->4912 char cardSerial; char separator2; // ' char SAN1[10]; // (新)内部客户号:分行(3)+客户号(6)+校验(1) char separator3; // ' char SAN2[9]; // * 卡凭证号(8)+校验(1) char separator4; // ' char transferFlag; // 0 char checkNum[6]; // 加密校验数 char appendData[16]; // * (旧)分行号(4)+客户号(8)+校验(1)+'000' // char endFlag; // ? // char LRC; char stringEnd; } new_track_3; typedef struct IC_TRACK3 // 6字头IC卡, zhanglei, 2010.09.19 { // char start; // ; char formatCode[2]; // 99 char masterAccount[19]; //* 帐号长度与NEW1_TRACK3不同 char separator1; // ' char countryCode[3]; // 156 char currencyCode[3]; // 156 char moneyExp; // 0 char periodAccredit[4]; // 5000 char periodBalance[4]; // 5000 char periodStartDate[4]; // 0000->0001 char periodLength[2]; // 01 char passwordRetry; // 5 char SVCD[6]; char exchangeCode; // 2 char PANTASR[2]; // 14 char SAN1TASR[2]; // 00 char SAN2TASR[2]; // 00 char expireDate[4]; // * 9912->4912 char cardSerial; char separator2; // ' char SAN1[10]; // (新)内部客户号:分行(3)+客户号(6)+校验(1) char separator3; // ' char SAN2[9]; // * 卡凭证号(8)+校验(1) char separator4; // ' char transferFlag; // 0 char checkNum[6]; // 加密校验数 char appendData[13]; // * (旧)分行号(4)+客户号(8)+校验(1)+'000' // char endFlag; // ? // char LRC; char stringEnd; } ic_track_3; typedef struct HK_TRACK3 // 香港一卡通3磁道格式包 { // char start; // ; char formatCode[2]; // 92 char cardType[2]; // 40 卡类别 char bankSign[4]; // 2658 发卡行标识 char masterAccount[12]; //* 右10位主账号+00 char separator1; // ' char separator2; // ' char currencyCode[3]; // 000 货币代码 char currencyIndex; // 0 货币指数 //char countryCode[3]; // 156 char VISAGrantDegree[2]; // 00 VISA账户周期授权额度 char grantDegree[2]; // 00 本行账户周期授权额度 char transferrableBalance[4]; //0000 VISA当前周期内可提款或转账的余额 char secondBankSign[4]; //0000 第二发卡行标示 //char moneyExp; // 0 //char periodAccredit[4]; // 5000 //char periodBalance[4]; // 5000 //char periodStartDate[4]; // 0000 char periodLength[2]; // 00 周期长度,ATM忽略 char passwordRetry; // 4 密码重试次数 char PIN; //* PIN校验位 char PINOffset[5]; //* PIN偏移量 // char checkNum[6]; // 校验和 char exchangeCode; // 0 交换控制符 char masterAccountType; //1 主账户类型 1 - 储蓄帐户2 - 支票账户3 - 信用卡或联名卡账户4 - 员工账户5 - 无存折储蓄帐户6 - 保留 char masterAccountLimit; //0 主账户限制码 0 - 无限制1 - 禁止扣帐(允许存款、转入)2 - 禁止存入(允许提款、转出) char firstSubsidiaryAccountType; // 0 第一辅助账户类型 0 - 不存在编码;其他同masterAccountType char firstSubsidiaryAccountLimit; // 0 第一辅助账户限制码 char secondSubsidiaryAccountMessage[2]; //00 第二辅助账户及限制码 char expireDate[4]; //* 失效日期 char cardSerial[2]; //* 卡顺序号 //char firstSubsidiaryAccount[12]; //000000000000 第一辅助账号 //char secondSubsidiaryAccount[12]; //000000000000 第二辅助账号 char appendData[24]; //* 附加数据 "YYYYMMDD"(申请日期)+随机数(7)+CVV(3)+随机数(6) char lastTranDate[4]; // 0000 上次交易日期 char lastTranTime[4]; // 0000 上次交易时间 char lastVISADate[4]; // 0000 上次VISA交易日期 char lastVISATime[4]; // 0000 上次VISA交易时间 char currentTransferrableBalance[3]; // 000 本行账户当前周期内可提款或转账的余额 char language; //* 语言代码 1-中文 2-英文 // char endFlag; // ? // char LRC; char stringEnd; } hk_track_3; typedef struct INTER_TRACK0 //Lint 国际借记卡 2003-1-6 16:16 { char masterAccount[16]; char cardSerial; char SVCD[6]; char oldRGCD[4]; char expireDate[4]; char stringEnd; } inter_track_0; typedef struct INTER_TRACK2 //Lint 国际借记卡2磁道 2004-2-13 15:22 { // char start; // ; char masterAccount[16]; //* char separator1; // ' char expireDate[4]; // * char serviceCode[3]; // 101 char localCheckMessage[5]; // 12345 PVKI(1) + PVV(4) char appendData[8]; //* 随机数(2)+ CVV(3) + 随机数(3) // char endFlag; // ? // char LRC; char stringEnd; } inter_track_2; typedef struct INTER_TRACK3 // 国际借记卡3磁道格式包 { // char start; // ; char formatCode[2]; // 99 char cardType[2]; // 41 卡类别 char bankSign[4]; // 0062 发卡行标识 char masterAccount[10]; //* 右10位主账号 char separator1; // ' char nationCode[3]; // 156 国家代码 char currencyCode[3]; // 156 货币代码 char currencyIndex; // 0 货币指数 char periodAccredit[4]; // 5000 周期授予量 char periodBalance[4]; //5000 当前周期内可提款或转账的余额 char periodStartDate[4]; //0000 周期开始日期 char periodLength[2]; // 01 周期长度,ATM忽略 char passwordRetry; // 5 密码重试次数 //char PIN; //* PIN校验位 //char PINOffset[5]; //* PIN偏移量 char grantControlCode[6]; //CVV(3)+随机数(3) char exchangeCode; // 2 交换控制符 char masterAccountType; //1 主账户类型 1 - 储蓄帐户2 - 支票账户3 - 信用卡或联名卡账户4 - 员工账户5 - 无存折储蓄帐户6 - 保留 char masterAccountLimit; //4 主账户限制码 0 - 无限制1 - 禁止扣帐(允许存款、转入)2 - 禁止存入(允许提款、转出) char firstSubsidiaryAccountType[2]; // 00 第一辅助账户类型 0 - 不存在编码;其他同masterAccountType char firstSubsidiaryAccountLimit[2]; // 00 第一辅助账户限制码 char expireDate[4]; //* 失效日期 char cardSerial; //* 卡顺序号 char encryptCode; //' 卡保密号 缺省为分隔符 char firstSubsidiaryAccount[10]; //000000000000 第一辅助账号 分行(3)+客户号(6)+校验(1) char separator2; // ' char secondSubsidiaryAccount[9]; //000000000000 第二辅助账号 卡凭证号(8)+校验(1) char separator3; // ' char passingCode; // 0 char checkNum[6]; // 校验和 char appendData[16]; //* 附加数据 分行号(4)+客户号(8)+校验(1)+"000" // char endFlag; // ? // char LRC; char stringEnd; } inter_track_3; typedef struct NWPK_TRACK0 // 新系统存折 { char masterAccount[15]; char PSBNBR[10]; char SVCD[6]; char stringEnd; } nwpk_track_0; typedef struct NWPK_TRACK2 // 新系统存折 { // char start; // ; char masterAccount[15]; // * char separator1; // ' char PSBNBR[10]; // * char SVCD[6]; // * char AccountChk; // * // char endFlag; // ? // char LRC; char stringEnd; } nwpk_track_2; typedef struct NWPK_TRACK3 // 新系统存折 { // char start; // ; char formatCode[2]; // 60 char masterAccount[15]; // * char separator1; // ' char countryCode[3]; // 156 char currencyCode[3]; // 156 char passwordRetry; // 5 char AccountChk; // * char LENSTR[10]; // 0015100699 char separator2; // ' char PSBNBR[10]; // * char PSBCHK; // * char separator3; // ' char SVCD[6]; // * char CVCCHK; // * char separator4; // ' char checkNum[6]; // 000000 char appendData[16]; // 8130379181303791 // char endFlag; // ? // char LRC; char stringEnd; } nwpk_track_3; typedef struct NWUS_TRACK0 // 新系统用户卡 { char USRNBR[6]; char cardSerial; char SVCD[6]; char stringEnd; } nwus_track_0; typedef struct NWUS_TRACK2 // 新系统用户卡 { // char start; // ; char USRNBR[6]; // * char separator1; // ' char cardSerial; // * char SVCD[6]; // * char USRCHK; // * // char endFlag; // ? // char LRC; char stringEnd; } nwus_track_2; typedef struct NWUS_TRACK3 // 新系统用户卡 { // char start; // ; char formatCode[2]; // 70 char USRNBR[6]; // * char separator1; // ' char passwordRetry; // 5 char USRCHK; // * char LENSTR[10]; // 0006010699 char cardSerial; // * char separator2; // ' char SVCD[6]; // * char CVCCHK; // * char separator3; // ' char checkNum[6]; // 000000 char appendData[16]; // 8130379181303791 // char endFlag; // ? // char LRC; char stringEnd; } nwus_track_3; typedef struct AE_TRACK2_DATA // 运通借记卡oilyang 2021.9.23 { char account[15]; //*Primary Account Number char separator1; // Field Separator char expireDate[4]; // Card Expiration Date char serviceCode[3]; // Service Code char effectiveDate[4]; // Card Effective Date char cardSeCode[5]; // Card Security Code char reserved[3]; // Card Serial(1) + (2) char langCode[2]; char stringEnd; } ae_track2_data; typedef struct AE_T2_DATA { char masterAccount[15]; char cardSerial; char cardSeCode[5]; char expireDate[4]; char stringEnd; } ae_t2_data; #define TRACK_DATA_LEN 300 class CARD { private: map m_BinSvcCod; void LoadFromFile(); string GetSvcCod(string key); public: CARD(){LoadFromFile();}; ~CARD(){}; char* SIGNCARD_ISOcode( SIGN_CARD_DATA *data); //hz, 97.01.30 char* SIGNCARD_ISOdecode( char *trackData); //hz, 97.01.30 char plus(char ch1, char ch2); char minus(char ch1, char ch2); char *plusString( char *str1, char *str2, int len); char *minusString( char *str1, char *str2, int len); char *codeUserCard( char *data); char *decodeUserCard( char *data, char *SVCD); char *codeUserCardTrack( char *data); char *decodeUserCardTrack( char *data, char *SVCD); char trackData[TRACK_DATA_LEN]; char getCheckNum(char *string, int len=0); BOOL ISOcode( char *data); char* ISOdecode2( char *data); char* ISOdecode3( char *data); BOOL ISOdecode( char *data); char* CREDIT_ISOdecode( char *data); void INTERNET_ISOcode( char *PAN, char *CVV); char* INTERNET_ISOdecode( char* PAN, char* CVV); BOOL Track23( char *strTrack2, char *strTrack3, BOOL bWrite, char* MARGType="23" ); int ISONewCardType(char * CardBin); BOOL ISONewcode( char *data); BOOL ISONewcode0( char *data); //原来9字头卡 BOOL ISONewcode1( char *data); //八转十六BZSL专用 6字头卡 BOOL ISONewdecode( char *data,char* MARGType="23"); BOOL ISOHKcode( char *data); //Lint 香港一卡通专用 BOOL ISOHKdecode( char *data,char* MARGType="23"); BOOL ISOHKcode_help( char *data, BOOL isIC); //Lint 香港一卡通专用 BOOL ISOHKdecode_help( char *data,char* MARGType, BOOL* isIC); char* trimstr(char* strSrc); BOOL ISOINTERcode( char *data); //Lint 国际借记卡 BOOL ISOINTERcodetrack1( char *data, char *name, char *parmTrack1); BOOL ISOINTERdecode( char *data,char* MARGType = "23"); //Cai BOOL ISONWPKcode( char *data); BOOL ISONWPKdecode( char *data,char* MARGType="23"); BOOL ISONWUScode( char *data); BOOL ISONWUSdecode( char *data,char* MARGType="23"); BOOL CMBcode( char * type, char * data, char* MagData); BOOL CMBdecode( char* MagData, char * type, char * data); BOOL CMBcodeEx( char * type, char * data, char* MagData); BOOL CMBdecodeEx( char* MagData, char * type, char * data); BOOL CMBdecodeMag2( char* Mag2Data, char * data); //zhanglei, IC磁条卡, 20100919 BOOL ICcode( char *data); BOOL ICdecode( char *data,char* MARGType="23"); BOOL Othdecode( char* MagData, char * type, char * data); }; #if (!defined(_WIN32) && !defined(_WIN64)) #include #else #include #endif //NOT _WIN32 #if (defined(_WIN32) || defined(_WIN64)) # ifdef CMB_CARD_TRACK_EXPORTS # define CMB_CARD_TRACK_API __declspec(dllexport) # else # define CMB_CARD_TRACK_API __declspec(dllimport) # endif #elif ( defined(__GNUC__) && __GNUC__ >= 4 ) # define CMB_CARD_TRACK_API __attribute__((visibility("default"))) #else # define CMB_CARD_TRACK_API #endif #ifdef __cplusplus extern "C" { #endif CMB_CARD_TRACK_API bool CMBdecodeMag2(char* Mag2Data, char * data); CMB_CARD_TRACK_API bool CMBdecodeEx(char* MagData, char * type, char * data); #ifdef __cplusplus } #endif class TPR50 { public: static int BPType; }; #endif