int PubICReadCard(char* pszOut, int *pLen) { unsigned char ucRecBuf[256]; unsigned int uiRetLen; unsigned char CFlagGetKey; EA_vCls(); CFlagGetKey = NO; EA_vCls(); if ( PubOpenUserICCardDev () != NORMAL ) return EXCEPTION; PubDisplayInv(1, "联名卡"); PubDisplayCen(2, "请插入IC卡"); PubDisplayCen(3, "按<取消>退出"); while(1) { if ( PubUserICCardIn() == NORMAL ) break; if (EA_ucKBHit () == EM_key_HIT) { if (PubuiInkey (1) == CANCEL) { return EXCEPTION; } } } if ( PubUserICCardPowerUp() != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("MF选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("EF05选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\xEF\x05", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("读文件选择",CPU_CARD, 0x00, 0xB0, 0x00, 0x00, 0x00, "", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; EA_ucCloseDevice (&gbhdlUserCard); memcpy(pszOut, ucRecBuf, uiRetLen); *pLen = uiRetLen; EA_ucCloseDevice (&gbhdlUserCard); return NORMAL; }
int PubOpenUserICCardDev (void) { uchar result; DevHandle hdlTmp; result = 0; hdlTmp = EM_NULL; if (gbhdlUserCard != EM_NULL) EA_ucCloseDevice (&gbhdlUserCard); result = EA_ucOpenDevice("USERCARD", 0 ,&hdlTmp); if (result == EM_SUCCESS) { gbhdlUserCard = hdlTmp; result = EA_ucICInitModule (gbhdlUserCard, EM_ic_VOLDEFAULT,EM_ic_DEFAULTMODE); if ( result != EM_SUCCESS ) { PubDisplay (2, "初始化Module%02x", result); PubuiInkey (20); return EXCEPTION; } return NORMAL; } else { PubDisplay (2, "初始化句柄%02x", result); PubuiInkey (20); return EXCEPTION; } }
int send_to_EFT(int len, char *p) { uchar ucRet; DevHandle hRS232Handle; ET_ProductInfo tProductInfo; #ifdef EPT_A9L memset(&tProductInfo, 0x00, sizeof(ET_ProductInfo)); EA_ucGetProductInfo(&tProductInfo); if ( memcmp(tProductInfo.acName , "E520" , 4) == 0 && tProductInfo.ucMachType == 2) { ucRet = EA_ucOpenDevice("COM3", 0, &hRS232Handle); } else { ucRet = EA_ucOpenDevice(SERIAL_PORT, 0, &hRS232Handle); } #else ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &hRS232Handle); #endif if (ucRet != EM_SUCCESS) { EA_vCls(); EA_vDisplay(2, "打开RS232口出错"); EA_ucCloseDevice(&hRS232Handle); PubuiInkey(3); return (EXCEPTION); } EA_ucInitRS232(hRS232Handle, EM_232_9600BPS, EM_232_NOPAR, EM_232_8DBS); EA_ucClearRS232(hRS232Handle);//清除RS232缓冲区 ucRet = EA_ucWriteDevice(hRS232Handle, (uint)len, 0, p); EA_ucCloseDevice(&hRS232Handle); // debug_print((char*)"SendToPC", p, len); if (ucRet == EM_io_SUCCESS) return NORMAL; else return EXCEPTION; return (NORMAL) ; }
uchar EI_ucTMSExit(TMS_AppScript *ptTMSHead) { if (EG_ucDevCloseFlg) { switch (ptTMSHead->ucCOMMType) { case TMS_COMTYPE_BYMODEM: EA_ucDialOff(EG_hCommHandle); break; case TMS_COMTYPE_BYETHENET: #ifndef PLAT_M3 close(ptTMSHead->uiSockID); #endif break; case TMS_COMTYPE_BYGPRS: case TMS_COMTYPE_BYCDMA: #ifndef PLAT_M3 EA_ucGsmModeExit(); #endif break; case TMS_COMTYPE_BYGPRSPPP: case TMS_COMTYPE_BYCDMAPPP: case TMS_COMTYPE_BYMODEMPPP: #ifndef PLAT_M3 EA_ucDialOffPpp(EG_iPPPn); close(ptTMSHead->uiSockID); #endif break; } EA_ucCloseDevice(&EG_hCommHandle); EA_ucCloseDevice(&EG_hPINPadDev); EA_ucCloseTimer(&EG_hTimer); } return EM_SUCCESS; }
UINT8 ucClosePrinter(DevHandle *hDev) { uchar ucRet = 0; ucRet = EA_ucCloseDevice(hDev); if (ucRet != EM_SUCCESS) { EA_vCls(); display(2, "打印口关闭失败[%02X]", ucRet); inkey(0); return 1; } return 0; }
int SetS100LoadKeyMode(void) { uchar aucOut[20], ucRet; DevHandle hDevHandle; uint uiOutLen; int nReturn; nReturn = 0; ucRet = EA_ucOpenDevice("COM", EM_io_PORT2, &hDevHandle); if ( ucRet != EM_SUCCESS) { EA_vCls(); PubDisplay(2,"打开端口错误 %d", ucRet); PubuiInkey(30); return -1; } EA_ucInitRS232(hDevHandle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS); EA_ucClearRS232(hDevHandle);//清除缓冲区 memcpy(aucOut,"\x02\x06\x9a\x01\x00\x00\x03\x02",8); ucRet = EA_ucWriteDevice(hDevHandle, 8, 1, (char*)aucOut); memset(aucOut, 0x00, 8); memcpy(aucOut+8,"\x06\x02\x04\x00\x01\x03\x02",7); uiOutLen = 0; ucRet = EA_ucReadDevice(hDevHandle, 7, 3, aucOut, &uiOutLen); if ( ucRet != EM_SUCCESS|| uiOutLen != 7) { EA_vCls(); PubDisplay(2,"从端口读数据错 %d %d", ucRet, uiOutLen); PubuiInkey(30); nReturn = -2; } else { if(memcmp(aucOut+8, aucOut, 7)) { EA_vCls(); PubDisplay(2,"数据校验错误"); PubuiInkey(30); nReturn = -3; } } EA_ucCloseDevice(&hDevHandle); return nReturn; }
uchar TA_BT_ucReadBT(uint* puiDataLen, uchar* pucData) { uchar ucRet = 0; uchar ucStatus = 0, ucRS232Status = 0; int iConnectStatus = 0; EA_ucGetBTLinkStatus(&iConnectStatus); if (EM_BTCONNECTED != iConnectStatus) { if (EM_SUCCESS == EA_ucIfIODeviceBufEmpty(g_hBtHandle, &ucRS232Status)) { if (EM_BUFEMPTY == ucRS232Status) { return EM_ERROR; } EA_ucClearIODeviceBuf(g_hBtHandle); } return EM_ERROR; } EA_ucIfIODeviceBufEmpty(g_hBtHandle, &ucStatus); if (ucStatus == 1) //蓝牙串口有数据,一般是请求输入密码之类的 { ucRet = EA_BT_ucReadFrame(g_hBtHandle, 100, READ_BUFFER_MAX, pucData, puiDataLen); PRINT_RET("EA_BT_ucReadFrame", ucRet); if (0x00 == memcmp((char*)pucData, "\xf6\x00\x07\x53\x44\xdd\x5a\xa5\x00\xff\xca\x03", 12)) { TA_BT_ucWriteBT(2, (uchar*)&"\x90\x00"); EA_ucCloseDevice(&g_hBtHandle); EA_vDownMain(EM_DOWN_TYPE_BT); ucRet = EA_ucOpenDevice(DEV_NAME_BLUETOOTH, DEV_OPEN_MODE_DEFAULT, &g_hBtHandle); if (ucRet != EM_SUCCESS) { PRINT_RET(DEV_NAME_BLUETOOTH, ucRet); } TA_vSetDeskTopState(TM_DTM_REFRESH, 0, FALSE); return EM_ERROR; } return ucRet; } return EM_ERROR; }
int ProDisplayECBal(char * pszAddiAmount, int nLen) { DevHandle hdlPinpad; if (iPinpadType == 1) { if (PubOpenDevice((char *)"PINPAD", EM_io_EPP, &hdlPinpad) != EM_SUCCESS) { EA_vCls(); PubDisplay(2, "无法打开密码键盘"); PubDisplay(3, "按任意键返回"); PubuiInkey(TIPS_TIMEOUT); ASSERT_NORMAL(EXCEPTION); } PubucDispPinpad(hdlPinpad, 1, (char *)" "); PubucDispPinpad(hdlPinpad, 2, (char *)" "); } PubClearAll(); PubDisplay(2, "电子现金余额:"); PubDisplay(3, "%s", pszAddiAmount); if (iPinpadType == 1) //外置PINPAD { PubucDispPinpad(hdlPinpad, 1, (char*)"BALANCE:"); PubucDispPinpad(hdlPinpad, 2, pszAddiAmount); } if (IsDisplayExtRf(0) == YES) { EA_ucDisplay_ExtRF(gbMifCardHandle,2, 1," 余额:"); EA_ucDisplay_ExtRF(gbMifCardHandle,3, 1," %s", pszAddiAmount); EA_ucDisplay_ExtRF(gbMifCardHandle,4, 1," "); } PubuiInkey(TIPS_TIMEOUT); if (iPinpadType == 1) { ClearPinpadDisp(hdlPinpad); while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS) ; } return NORMAL; }
uchar ucOfflineLoadTms(uint uiKeyIndex ,uint uiTmkIndex, char *KeyBuf , char *szShopID , char *szPosID) { DevHandle hRS232Handle; uchar ucRet; // uchar ucInitBuf[11]; // uchar ucKeyBuf[64]; // uchar ucCloseBuf[11]; // uchar ucCMD[2]; // uchar ucRespCode[2]; // uint uiDealCounts;//处理次数,三次失败函数返回EM_ERROR uint uiNextKeyNo; // uint uiKeyNo; uint uiKeySum; uint uiWRecNum;//可写记录数 uint uiVRecNum;//有效记录数 uchar ucKeyFileID; uchar ucFlashBuf[50]; uchar ucIsFileEmpty; // return EM_SUCCESS; //打开密钥文件 ucKeyFileID = ucKeyFileOpen("KeyFile");//包含报错 if (ucKeyFileID == 0) { ucKeyFileClose(ucKeyFileID);//关闭文件 return EM_ERROR; } //-------------------------------------------------------- //查询剩余可写记录数 ucRet = EA_ucPFInfo(ucKeyFileID, EM_ffs_FREEREC, &uiWRecNum); if(ucRet == EM_SUCCESS) { if( uiWRecNum < 1) { EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiWRecNum); PubClearAll(); PubDisplayInv(1, "错误"); PubDisplay(2,"系统已有%d条密钥",uiWRecNum); PubDisplayCen(3,"密钥文件已满,无法加载密钥"); PubDisplayCen(4,"请先清除所有密钥"); PubuiInkey(10); ucKeyFileClose(ucKeyFileID);//关闭文件 return EM_ERROR; } } //--------------------------------------------------------- ucIsFileEmpty = 0; EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiVRecNum); if(uiVRecNum == 0)//密钥文件为空 { //使用ucFileOpNoSearch函数 ucIsFileEmpty = 1; } //----------------------------- uiKeySum = 0; uiNextKeyNo = 1; /*写flash*/ BUFCLR(ucFlashBuf); memcpy( ucFlashBuf, szShopID, 15 ); memcpy( ucFlashBuf +15, szPosID, 8 ); memcpy( ucFlashBuf +23, KeyBuf, 24 ); ucFlashBuf[47] = uiKeyIndex/10*16 + uiKeyIndex%10; ucFlashBuf[49] = uiTmkIndex/10*16 + uiTmkIndex%10; #ifdef SET_DEBUG PubDisplay(1 , "[%ld]tmk[%ld]", uiKeyIndex ,uiTmkIndex ); PubDisplay(2 , "[%02x][%02x]" , ucFlashBuf[47] , ucFlashBuf[49]); PubuiInkey(0); #endif if(ucIsFileEmpty == 1) { //密钥文件为空时,不搜索匹配,直接添加记录 if(ucFileOpNoSearch( ucKeyFileID,ucFlashBuf) != EM_SUCCESS) { ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); return EM_ERROR; } } else if(ucIsFileEmpty == 0) { //密钥文件非空时,搜索是否有一样记录,防重复 if( ucFileOp( ucKeyFileID, ucFlashBuf) != EM_SUCCESS) { ucKeyFileClose(ucKeyFileID);//关闭文件 PubDisplayInv(1, "错误"); PubDisplayCen(2, "写密钥文件错误"); PubuiInkey(10); return EM_ERROR; } } else { PubClearAll(); PubDisplayInv(1, "错误"); PubDisplayCen(2, "搜索标志位错误"); PubuiInkey(3); ucKeyFileClose(ucKeyFileID);//关闭文件 return EM_ERROR; } PubDisplayInv(1, "密钥加载"); PubDisplayCen(2,"正在接收密钥..."); PubDisplay(3,"加载密钥成功"); PubuiInkey(1); ucKeyFileClose(ucKeyFileID);//关闭文件 return EM_SUCCESS; }
/* 系统检查,此函数为检测不过只有按取消键跳越 */ void PubCheckTerminal( void ) { DevHandle hDevHandle; uchar ucRet; int iPrinterType ,iPinpadType, iPinpadVer; EA_vCls(); PubDisplayInv(1 , "系统自检"); PubDisplayCen(3 , "密码键盘"); PubuiInkey(1); PubUsePinpadInside(FV.gbstCfg.nInputPinType); //[12/15/2013 zyf DJ] 德基默认内置 hDevHandle = EM_NULL; PubGetPinpadType( &iPinpadType ); while ((ucRet = PubOpenDevice((char*)"PINPAD", EM_io_EPP, &hDevHandle)) != EM_SUCCESS) { PubDisplay(3, "========[%d]========", ucRet); PubDisplayCen(4, "请接入密码键盘"); EA_vBeepMs(50); if( PubuiInkey(1) == EM_key_CANCEL ){ EA_ucCloseDevice(&hDevHandle); break; } } PubGetPinpadVer(hDevHandle, &iPinpadVer); while ((ucRet = PubResetPinpad( hDevHandle )) != EM_SUCCESS) { PubDisplay(3, "========[%d]========", ucRet); PubDisplayCen(4, "请接入密码键盘"); EA_vBeepMs(50); if( PubuiInkey(1) == EM_key_CANCEL ){ EA_ucCloseDevice(&hDevHandle); break; } } EA_ucCloseDevice(&hDevHandle); PubClearAll(); PubDisplayCen(3 , "打 印 机"); PubuiInkey(1); PubGetPrinterType( &iPrinterType ); while ((ucRet = PubOpenDevice((char *)"PRINT", EM_io_REALMODE, &hDevHandle)) != EM_SUCCESS) { PubDisplay(3, "========[%d]========", ucRet); PubDisplayCen(4, "请检查打印机"); EA_vBeepMs(50); if( PubuiInkey(1) == EM_key_CANCEL ){ EA_ucCloseDevice(&hDevHandle); break; } } while ((ucRet = EA_ucGetPrinterStatus(hDevHandle)) != EM_SUCCESS) { PubDisplayCen(2, "缺纸或系统故障"); PubDisplay(3, "========[%d]========", ucRet); PubDisplayCen(4, "请检查打印机"); EA_vBeepMs(50); if( PubuiInkey(1) == EM_key_CANCEL ){ EA_ucCloseDevice(&hDevHandle); break; } } EA_ucCloseDevice(&hDevHandle); PubClearAll(); PubDisplayCen(3 , "通 信 口"); PubInitComm(&CommInfo, AUTOCHECK); #ifdef TEST while(1) { PubDisplayCen(2, "这是测试是程序不能使"); PubDisplayCen(3, "用在生产环境由此产生"); PubDisplayCen(4, "的一切后果概不负责"); EA_vBeepMs(200); if( PubuiInkey(1) == EM_key_FUNC ) break; } #endif return; }
/* * 函数功能:IC卡下载密钥 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubICDownKey(void) { unsigned char ucSedBuf[256],ucRecBuf[256],szBuf[4096]; unsigned int uiRetLen,uiRet; unsigned char Cp1,Cp2,Cle,CFlagGetKey; int len; char szGetBuffer[30],szGetBuffer1[30],szGetBuffer2[30],szGetBuffer3[30]; int i, nBufSize; CARDHEADER stCardHead; KEYREC stKeyRec; unsigned char szKeyPwd[9],ucTEK2[17],ucTMK[17],ucTMK1[17],chLRCValue, chCheckvalue[9], kyLRCValue; int nKeyNum, nKeyLen; ET_DATETIME tDateTime; char szBuffer[100], cRet; int nTmpFlag, nIndex = 5; DevHandle phPinpad; EA_vCls(); PubDisplayInv(1, "IC卡导入密钥"); PubDisplay(2, "主密钥索引号(0-31)"); //PubDisplay(3, "[%d]",nIndex); nTmpFlag = 1; do { BUFCLR(szBuffer); cRet = PubGetNStr(4, 0, szBuffer, 2); if (cRet == CANCELED||cRet == APPTIMEOUT) { nTmpFlag = 0; break; } if (strlen(szBuffer) > 2) continue; nIndex = atoi(szBuffer); } while (nIndex > 31); if (nTmpFlag == 0) return EXCEPTION; PubGetBankcDesType(&cDesType); CFlagGetKey = NO; EA_vCls(); if ( PubOpenUserICCardDev () != NORMAL ) return EXCEPTION; //EA_vCls(); PubDisplayInv(1, "IC卡导入密钥"); PubDisplayCen(2, "请插入密钥IC卡"); PubDisplayCen(3, "按<取消>退出"); while(1) { if ( PubUserICCardIn() == NORMAL ) break; if (EA_ucKBHit () == EM_key_HIT) { if (PubuiInkey (1) == CANCEL) { return EXCEPTION; } } } if ( PubUserICCardPowerUp() != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("DF1选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("DF3选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x03", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("READ BINARY",CPU_CARD, 0x00, 0xb0, 0x83, 0x00, 0x00, ucSedBuf, 0x1b, ucRecBuf, &uiRetLen)!= NORMAL ) return EXCEPTION; memcpy(&stCardHead, ucRecBuf, 27); chLRCValue = 0; for(i=0;i<26;i++) chLRCValue ^= ucRecBuf[i]; if(chLRCValue != stCardHead.chLRCValue) { PubClearAll(); PubDisplayCen(2, "IC卡错误"); PubuiInkey(20); return EXCEPTION; } EA_ucGetDateTime (&tDateTime); sprintf (szBuffer, "%4d%02d%02d", tDateTime.usYear, tDateTime.ucMonth, tDateTime.ucDay); PubAscToHex (szGetBuffer, szBuffer, 8, 0); if(memcmp(stCardHead.chExpireDate, szGetBuffer, 4) < 0) { PubClearAll(); PubDisplayCen(2, "此卡已过期"); PubuiInkey(20); return EXCEPTION; } if ( ProICCComm1 ("DF2选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x02", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; nBufSize = sizeof(szGetBuffer); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, nBufSize)); nBufSize = sizeof(szGetBuffer); BUFCLR(szGetBuffer1); ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer1, nBufSize)); strcat(szGetBuffer, "F"); //商户号是右补F PubAscToHex(szGetBuffer2, szGetBuffer, 16, 0); PubAscToHex(szGetBuffer3, szGetBuffer1, 8, 0); nKeyNum = stCardHead.KeyNum[0]*256+stCardHead.KeyNum[1]; BUFCLR(szBuf); i=0; while(1) { len = i * 31; Cp1 = (uchar)(len/256); Cp2 = (uchar)(len%256); Cle = 31; if ( ProICCComm1 ("READ BINARY",CPU_CARD, 0x00, 0xb0, Cp1, Cp2, 0x00, ucSedBuf, Cle, ucRecBuf, &uiRetLen)!= NORMAL ) return EXCEPTION; if (CARD_SW1 == 0x6B ) break; memcpy(&stKeyRec, ucRecBuf, 31); if(!memcmp(stKeyRec.kyMechID,szGetBuffer2,8) && !memcmp(stKeyRec.kyTermID,szGetBuffer3,4)) { CFlagGetKey = YES; break; } i++; if(i > nKeyNum) break; } if ( CFlagGetKey == NO ) { PubClearAll(); PubDisplayCen(2, "主密钥未找到"); PubuiInkey (20); return EXCEPTION; } // 银商规范修改,这个值无效,不用判断了。 // if(stKeyRec.kyNum < 1) // { // PubClearAll(); // PubDisplayCen(2, "该密钥已无法使用"); // PubuiInkey(20); // return EXCEPTION; // } BUFCLR(szBuf); memcpy(szBuf, &stKeyRec, 31); kyLRCValue = 0; for(i=0;i<29;i++) kyLRCValue ^= szBuf[i]; if(kyLRCValue != stKeyRec.kyLRCValue) { /*银商总公司沈进要求不写卡 //可用次数减1 stKeyRec.kyNum--; memcpy(ucSedBuf, &stKeyRec, 31); if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, Cp1, Cp2, 0x1f, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; */ PubClearAll(); PubDisplayCen(2, "主密钥有误"); PubuiInkey(20); return EXCEPTION; } PubClearAll(); PubDisplay(2,"请输入密钥卡密码"); PubKeyOff(); BUFCLR(szBuffer); uiRet = PubGetAStr(3,BIGFONT,szBuffer,8); PubKeyOn(); if (uiRet != NORMAL) { return EXCEPTION; } strcpy(szKeyPwd, szBuffer); BUFCLR(ucTEK2); memset(ucTEK2, 0xff, 8); memcpy(ucTEK2, szKeyPwd, strlen(szKeyPwd)); BUFCLR(szBuffer); DES(ucTEK2, szBuffer, chCheckvalue); if(memcmp(stCardHead.chCheckvalue, chCheckvalue, 4)) { /*银商总公司沈进要求不写卡 //可用次数减1 stKeyRec.kyNum--; memcpy(ucSedBuf, &stKeyRec, 31); if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, Cp1, Cp2, 0x1f, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; */ PubClearAll(); PubDisplayCen(2, "密码错误"); PubuiInkey(20); return EXCEPTION; } //使用手工输入的密码对IC卡中存在的二级转加密主密钥TMK2进行Des解密,获得TMK1 BUFCLR(ucTMK1); _DES(ucTEK2, stKeyRec.kyEncryptMKey, ucTMK1); _DES(ucTEK2, stKeyRec.kyEncryptMKey+8, ucTMK1+8); //初始化加密指令 if ( ProICCComm1 ("INIT FOR DES",CPU_CARD, 0x80, 0x1a, 0x08, 0x03, 0x00, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //解密 if ( ProICCComm1 ("DESCRYPT",CPU_CARD, 0x80, 0xfa, 0x80, 0x00, 0x10, ucTMK1, 0x10, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; memcpy(ucTMK, ucRecBuf, 16); if (PubOpenDevice("PINPAD", EM_io_EPP, &phPinpad) != EM_SUCCESS) { PubDisplay(2, "密码键盘打开失败!"); EA_vBeepMs(50); return EXCEPTION;; } nKeyLen = 16; while (PubLoadKey(phPinpad, EM_pin_MASTERKEY, nIndex, nKeyLen, ucTMK) != NORMAL) { PubDisplay(2, "请接好密码键盘!"); EA_vBeepMs(50); PubuiInkey(1); } EA_ucCloseDevice(&phPinpad); PubSetBankcDesType(DES3); //设定密钥类型为3DES /*银商总公司沈进要求不写卡 //可用次数置0 stKeyRec.kyNum=0; memcpy(ucSedBuf, &stKeyRec, 31); if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, Cp1, Cp2, 0x1f, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; */ EA_ucCloseDevice (&gbhdlUserCard); EA_vCls(); PubDisplay(2, "主密钥导入成功!"); PubuiInkey(20); return NORMAL; }
/* * 函数功能:检查返回的报文 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubDispRetMsg(struct FileRecStru *pos) { char szBuffer[50]; //char szRetAmt[15]; char szBuf[256],szAmtBuf[25]; unsigned char ucRet; unsigned long ulBalance,ulAvilBanlance; int i, nLen; DevHandle hdlPinpad; ET_DATETIME dtLocal; char szDateTime[3]; PubClearAll(); // PubDisplay( 4 , "1111[%s]",pos->szProcCode ); // PubuiInkey(0); /*检验是否串包 */ ASSERT_NORMAL(PubCheckPack(pos)); EA_ucGetDateTime(&dtLocal); BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_TIME, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szTime); sprintf(pos->szTime, "%6.6s", szBuffer); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer, 2); dtLocal.ucHour = atoi(szDateTime); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer + 2, 2); dtLocal.ucMinute = atoi(szDateTime); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer + 4, 2); dtLocal.ucSecond = atoi(szDateTime); EA_ucSetDateTime(&dtLocal, EM_SYSTEM_TIME); } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szDate); sprintf(pos->szDate, "%4.4s", szBuffer); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer, 2); dtLocal.ucMonth = atoi(szDateTime); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer + 2, 2); dtLocal.ucDay = atoi(szDateTime); EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE); } /*非签到交易而且返回码不成功,就清除冲正标志 */ if ((pos->cTransType != LOGIN) && (memcmp(gbszErrCode, "00", 2) != 0)) PubSetPoscfgcAutoVoidFlag(0); i = 0; while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2)) i++; if (err_mess[i][0] == '\0') /* Unknow Error */ sprintf(szBuffer, "交易失败"); else // strcpy(szBuffer, err_mess[i] + 2); 20060119 by luo strcpy(szBuffer, err_mess[i] ); /*Defined Error */ if (strlen(szBuffer) > 20) { BUFCLR(szBuf); memcpy(szBuf, szBuffer, 20); PubDisplayCen(2, szBuf); PubDisplayCen(3, szBuffer + 20); } else PubDisplayCen(2, szBuffer); if (memcmp(gbszErrCode, "00", 2)) PubuiInkey(30); BUFCLR(szBuffer); nLen = sizeof(szBuffer); BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, RETR_NUM, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szReferenceNum); sprintf(pos->szReferenceNum, "%12.12s", szBuffer); } PubGetAccountInfo(pos); if (!memcmp(gbszErrCode, "00", 2)) { switch (pos->cTransType) { case INQUERY: BUFCLR(szBuffer); ulBalance = atol(pos->Balance); ulAvilBanlance = atol(pos->available); nLen = sizeof(szBuffer); ucRet = PubOpenDevice((char *)"PINPAD", EM_io_EPP, &hdlPinpad); if (ucRet != EM_SUCCESS) { PubuiInkey(3); PubClearAll(); if (ucRet == EM_DEVICE_USED) PubDisplay(2, "密码键盘已经打开"); else PubDisplay(2, "无法打开密码键盘"); PubuiInkey(3); break; } BUFCLR(szAmtBuf); PubFormatAmount(1,pos->Balance,szAmtBuf); if ( iPinpadType == 1 ) //外置PINPAD { if(!memcmp(pos->Sign, "0", 1)) { sprintf(szBuffer,"-%s", szAmtBuf); //sprintf(szBuffer,"-%ld.%02ld", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100); } else { sprintf(szBuffer,"%s", szAmtBuf); //sprintf(szBuffer,"%ld.%02ld", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100); } PubDisplayCen (3, "查询成功"); PubDisplayCen (4, "请查看密码键盘"); PubucDispPinpad(hdlPinpad, 1, (char *)"Balance:"); PubucDispPinpad(hdlPinpad, 2, szBuffer); } else { if(!memcmp(pos->Sign, "0", 1)) { PubDisplay(3, "余额:-%s元", szAmtBuf); // PubDisplay(3, "余额:%ld.%02ld元", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100); } else { PubDisplay(3, "余额:%s元", szAmtBuf); // PubDisplay(3, "余额:%ld.%02ld元", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100); } } /* PubuiInkey(5); if ( iPinpadType == 1 ) //外置PINPAD { sprintf(szBuffer,"%ld.%02ld", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100); PubDisplayCen (3, "可用余额"); PubDisplayCen (4, "请查看密码键盘"); PubucDispPinpad(hdlPinpad, 1, "Available:"); PubucDispPinpad(hdlPinpad, 2, szBuffer); } else { PubDisplay(3, "可用余额:%ld.%02ld元", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100); } */ if(pos->Remark[0])//打印会员号 PubPrintQueryMsg(pos->Remark); PubuiInkey(10); if ( iPinpadType == 1 ) //外置PINPAD { PubucDispPinpad(hdlPinpad, 1, (char *)"WELCOME TO USE "); PubucDispPinpad(hdlPinpad, 2, (char *)" START PINPAD"); } while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS); break; default: BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, EXPIRY, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szExpDate); sprintf(pos->szExpDate, "%4.4s", szBuffer); } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, PAN, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szCardNo); strcpy(pos->szCardNo, szBuffer); } // BUFCLR(szBuf); // nLen = sizeof(szBuf); // PubGetBit(&iso1, 63, szBuf, &nLen); // if (nLen > 0) // { // BUFCLR(pos->szCardId); // BUFCLR(pos->szIssuerMsg); // BUFCLR(pos->szCupMsg); // BUFCLR(pos->szAquMsg); // memcpy(pos->szCardId, szBuf, 3); // if (nLen > 3) // sprintf(pos->szIssuerMsg, "%20.20s", szBuf + 3); // if (nLen > 23) // sprintf(pos->szCupMsg, "%20.20s", szBuf + 23); // if (nLen > 43) // sprintf(pos->szAquMsg, "%20.20s", szBuf + 43); // } memcpy(pos->szCardId, "CUP", 3); BUFCLR(szBuf); nLen = sizeof(szBuf); BUFCLR(pos->szIssuerID); BUFCLR(pos->szAcqId); PubGetBit(&iso1, 44, szBuf, &nLen); if (nLen > 0) { //dudj20060725 modify after ylsw, 右靠改左靠 sprintf(pos->szIssuerID, "%-11.11s", szBuf); sprintf(pos->szAcqId, "%-11.11s", szBuf + 11); } BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 32, szBuf, &nLen); if (nLen) sprintf(pos->szPosCenter, "%s", szBuf); /* Pos 中心号 */ BUFCLR (szBuffer); nLen = sizeof (szBuffer); PubGetBit (&iso1, ADDI_AMOUNT, szBuffer, &nLen); if (szBuffer[0]) { if (pos->cTransType == ADD) { BUFCLR (pos->szAmount2); sprintf (pos->szAmount2, "%12.12s", szBuffer + 2); } } break; } } else { if(!memcmp(gbszErrCode, "77", 2)) { PubDisplay(4 , "请重新签到"); PubuiInkey(3); } return EXCEPTION; } return NORMAL; }
void ProEncSSl(char *szOutSendStr, int *pnOutLen) { #ifndef EPT_A9L return; #else char ucRd[17],ucRd1[17],szBuffer[300],szCrc[2]; char szTmpBuf[30]; char szMacBuf1[30]; uint uiOutLen; char szValue [80]; uint nLen , nKeyId ,nJ,i; ET_ProductInfo PI; char szSerial[40],szPosid[30],szPosName[30]; DevHandle hdlPinpad; EA_ucGetProductInfo(&PI); BUFCLR(szPosName); sprintf(szPosName,"LANDI %s" , PI.acName); BUFCLR(szSerial); EA_ucGetSerial(EM_SERIAL_MAIN_BOARD,szSerial); i = 1; //公司标识 i += szSerial[i] - '0' + 1; // 得到版本型号长度位置 i += szSerial[i] - '0' + 1; // 得到生产序列号长度位置 nLen = szSerial[i++] - '0'; // 得到生产序列号长度 BUFCLR(szPosid); memcpy(szPosid, szSerial+i, nLen); memset(ucRd,0,sizeof(ucRd)); memset(ucRd1,0,sizeof(ucRd1)); EA_ucGetRandom(16,ucRd); BUFCLR(szCrc); szCrc[0] = ucRd[0]; for (nJ = 1; nJ < 16; nJ++) { szCrc[0] ^= ucRd[nJ]; } // strcpy(PI.acName,(char *)"E330P"); // strcpy(szSerial,(char *)"S4E3307PTJ1-03898902696000000000"); memset(szBuffer,0,sizeof(szBuffer)); memset(szBuffer , 0x20,58); memcpy(szBuffer , szPosName , strlen(szPosName)); memcpy(szBuffer +20 , szPosid , strlen(szPosid)); memcpy(szBuffer+82,ucRd,16); memcpy(szBuffer+98,szCrc,1); BUFCLR(szTmpBuf); memset(szTmpBuf , 0x20 , 24); memcpy(szTmpBuf,szPosName , strlen(szPosName)); nKeyId = 7;//默认tms密钥是7 //从主控参数中读取tms密钥索引,如果读到,则覆盖 if (EA_ucParamFileFindPara("D086UCUPyldla", "parafile", "12000007", &nLen, szValue) == EM_SUCCESS) { if ( szValue[0]) { nKeyId = atol(szValue); } } if(PubOpenDevice((char *)"PINPAD", EM_io_EPP, &hdlPinpad)== EM_SUCCESS) { if(PubSelectKey(hdlPinpad, EM_pin_MASTERKEY, nKeyId) == NORMAL) if(EA_pci_ucUserDes(hdlPinpad, nKeyId , ucRd, ucRd1) == EM_SUCCESS) if(EA_pci_ucUserDes(hdlPinpad, nKeyId , ucRd+8, ucRd1+8) == EM_SUCCESS) if(EA_ucTDes(EM_alg_TDESENCRYPT|EM_alg_TDESDEFAULTMODE, 16, ucRd1, 24, szTmpBuf, &uiOutLen, szMacBuf1) == EM_SUCCESS) { memcpy(szBuffer+ 58,szMacBuf1,24); *pnOutLen=99; memcpy(szOutSendStr,szBuffer,*pnOutLen); EA_ucCloseDevice(&hdlPinpad); return; } EA_ucCloseDevice(&hdlPinpad);// 这里要关一下句柄。 } // 硬件加密失败,使用软加密固定密钥 // 使用软算法 DES((char *)"\x11\x11\x11\x11\x11\x11\x11\x11",ucRd,ucRd1); DES((char *)"\x11\x11\x11\x11\x11\x11\x11\x11",&ucRd[8],&ucRd1[8]); uiOutLen=24; EA_ucTDes(EM_alg_TDESENCRYPT|EM_alg_TDESDEFAULTMODE, 16, ucRd1, 24, szTmpBuf, &uiOutLen, szMacBuf1); memcpy(szBuffer+58,szMacBuf1,24); *pnOutLen=99; memcpy(szOutSendStr,szBuffer,*pnOutLen); //PubDisplay(0 , "soft"); //PubuiInkey(1); #endif return; }
/***************************************************************** 函数原型:Device_Handle_Init() 功能描述:设备所有句柄初始化 参数描述: 返回值: OK ? NOTOK 作 者: 刘及华 日 期: 2012-11-24 修改历史: 日期 修改人 修改描述 ------ --------- ------------- *****************************************************************/ INT8U Device_Handle_Init(void) { uchar ucRet; if (EA_ucOpenDevice("RFCARD", EM_mifs_TYPEA, &hMifsHandle) != EM_SUCCESS) { lcddisperr("读卡器初始化失败"); return notok; } if ( EA_ucOpenDevice("PRINT", EM_io_REALMODE, &hDprinterHandle) != EM_SUCCESS ) { lcddisperr("获得打印操作句柄失败!"); return notok; } // if ( EA_ucOpenDevice("USBD", EM_io_REALMODE, &hUSBDHandle) != EM_SUCCESS ) // { // lcddisperr("获得打印操作句柄失败!"); // return notok; // } // if ( EA_ucOpenDevice("WLM", 0, &hWLMHandle) != EM_SUCCESS ) // { // lcddisperr("获得GPRS句柄失败!"); // return notok; // } ///////////////////////////////////////////////打印机设置参数 ucRet = EA_ucInitPrinter(hDprinterHandle); if ( ucRet != EM_SUCCESS ) { EA_vDisplay(2, "初始化打印机芯失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_XSPACE, 0); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_YSPACE, 6); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } // ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE, 578); ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE , 220); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_DOTTYPE, EM_prn_ASCIIDOT24X12); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_PRNTYPE, EM_prn_ASCIIPRN1X1); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_DOTTYPE, EM_prn_HZDOT24X24); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_PRNTYPE, EM_prn_HZPRN1X1); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PRNGRAY, 4); if ( ucRet != EM_SUCCESS ) { // (void)EA_ucCloseDevice(&hDprinterHandle); lcddisperr("打印机设置失败!"); return notok; } /////////////////////////////////////////////////////////////////////////////初始化时候只设置一次 if (EA_ucOpenDevice("SAM1CARD", 0, &hSam1Handle) != EM_SUCCESS) { lcddisperr("PSAM卡初始化失败"); return notok; } // if (EA_ucOpenDevice("USERCARD", 0, &hCpuHandle) != EM_SUCCESS) // { // lcddisperr("CPU卡初始化失败"); // return notok; // } // if (EA_ucICInitModule(hCpuHandle, EM_ic_VOLDEFAULT, EM_ic_TCRMODE) != EM_SUCCESS) // { // lcddisperr("设置CPU规范失败"); // return notok; // } ucRet = EA_ucOpenDevice("USBD", 0, &hRS232Handle); if ( ucRet != EM_SUCCESS ) { (void)EA_ucCloseDevice(&hRS232Handle); lcddisperr("COM口设置失败!"); return notok; } EA_ucInitRS232(hRS232Handle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS); return ok; }
/* * 函数功能: 联机签到 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL--成功 * EXCEPTION--失败 */ int PubBankLogin(void) { uchar szBatch[7], szBuffer[121], szBuf[33],szGetBuffer[121]; uchar szDateTimeBuf[3], szTmpBuffer[30], szWorkKey[25], szMacKey[25], szWorkKeyChk[5], szMacKeyChk[5]; uchar szTdkKey[25], szTdkKeyChk[5]; struct FileRecStru LoginPos; int nSendLen, nLen , nWorkKeyLen=8,nMacKeyLen=8,nTdkKeyLen=8; ET_DATETIME DateTime; //#ifndef PRG_TST uchar szTmp1[20]; int nKeyIndex; DevHandle phPinpad; //#endif /*获得当前操作员号 */ #ifdef TRANSTEST PubSetPoscfgcLoginState(LOGON); return NORMAL; #endif LoginPos.cTransType = LOGIN; gbnTransType = LOGIN; PubGetBankcDesType(&cDesType); /*获得批次号 */ ASSERT_NORMAL(PubGetBankstateszBatchNum(szBatch, sizeof(szBatch))); sprintf(LoginPos.szBatchNum, "%s", szBatch); /*设置mac方式 */ PubSetBankcMacChk(MAC_NO); /* 8583打包 */ ASSERT_NORMAL(PubPacketFix(&LoginPos)); BUFCLR(szTmpBuffer); /*** modified by gud 20060124 ***/ if (cDesType == DES1) sprintf(szTmpBuffer, "00%6.6s001", LoginPos.szBatchNum); else { // if(FV.bank.cEncryptTrack == YES) //增加磁条加密功能 // sprintf(szTmpBuffer, "00%6.6s004", LoginPos.szBatchNum); // else sprintf(szTmpBuffer, "00%6.6s003", LoginPos.szBatchNum); } /*** modified by gud 20060124 ***/ ASSERT_NORMAL(PubSetBitYL(&iso, 60, szTmpBuffer, 11)); /* //add by baijz 20110620 终端设备信息 nLen = 0; i = 0; BUFCLR(szBuffer); if(EA_ucGetSerial(EM_SERIAL_MAIN_BOARD, szBuffer) == EM_SUCCESS) { i++; //公司标识 nLen = szBuffer[i]-0x30; i++; //产品类别长度 i+=nLen; //产品类别 nLen = szBuffer[i]-0x30; i++; //版本型号长度 i+=nLen; //版本型号 nLen = szBuffer[i]-0x30; i++; //序列号长度 BUFCLR(szBuf); if(nLen > 32) nLen = 32; memcpy(szBuf, szBuffer+i, nLen); } else { strcpy(szBuf, "00000000"); nLen = 8; } BUFCLR(szTmpBuffer); PubGetPosYlCode(szTmpBuffer); sprintf(szBuffer, "Sequence No%02d%4.4s%s", nLen+4, szTmpBuffer, szBuf);//证书编号+序列号 ASSERT_NORMAL(PubSetBitYL(&iso, 62, szBuffer, strlen(szBuffer))); //add end */ BUFCLR(szBuf); sprintf(szBuf, "%2.2s ", FV.OPER.gbszOper); ASSERT_NORMAL(PubSetBitYL(&iso, 63, szBuf, 3)); /*iso到字符串 */ nSendLen = sizeof(gbszSendStr); ASSERT_NORMAL(PubIsoToStr(gbszSendStr, &iso, &nSendLen)); gbnSendLen = nSendLen; /*发送数据 */ ASSERT_NORMAL(PubCommu(&CommInfo, gbszSendStr, gbnSendLen, gbszReadStr, &gbnReadLen, DIALOFF_NO)); /*接收返回 */ ASSERT_NORMAL(PubDispRetMsg(&LoginPos)); PubDisplay(2 , "");//bctc认为这个时候显示交易成功不合理,必须在校验完密钥后才显示交易成功,所以这里清空PubDispRetMsg里面显示成功 BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSURE_NORMAL(PubGetBit (&iso1, 60, szBuffer, &nLen)); if (nLen > 0) { BUFCLR (szTmp1); memcpy (szTmp1, szBuffer + 8, 3); if (cDesType == DES1) { if (memcmp (szTmp1, "001", 3) != 0) { PubClearAll (); PubDisplay (3, "密钥算法有误"); PubuiInkey (30); return EXCEPTION; } } else if (cDesType == DES3) { //add by baijz 20110426 // if (FV.bank.cEncryptTrack == YES) // { // if(memcmp (szTmp1, "004", 3) != 0) // { // PubClearAll (); // PubDisplay (3, "密钥算法有误"); // PubuiInkey (30); // return EXCEPTION; // } // } // else //add end if (memcmp (szTmp1, "003", 3) != 0) { PubClearAll (); PubDisplay (3, "密钥算法有误"); PubuiInkey (30); return EXCEPTION; } } } BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSURE_NORMAL(PubGetBit(&iso1, 62, szBuffer, &nLen)); //华腾后台62域返回的密钥长度为61位,第一位跳过 BUFCLR(szGetBuffer); memcpy(szGetBuffer,szBuffer+1,60); BUFCLR(szBuffer); memcpy(szBuffer,szGetBuffer,60); nLen --; #ifdef LDYTEST PubDisplay(2,"返回62域长度%d",nLen); PubuiInkey(0); #endif if ((nLen != 24) && (cDesType == DES1)) { PubDisplay(3, "下载参数密钥失败"); PubDisplayCen (4, "使用单DES"); PubuiInkey(30); return EXCEPTION; } //add by baijz 20110426 // else if(FV.bank.cEncryptTrack == YES) // { // if ((nLen != 60) && (cDesType == DES3)) // { // PubDisplay(3, "下载参数密钥失败"); // PubDisplayCen (4, "使用 3DES"); // PubuiInkey(30); // return EXCEPTION; // } // } //add end else if ((nLen != 60) && (cDesType == DES3)) { PubDisplay(3, "下载参数密钥失败"); PubDisplayCen (4, "使用 3DES"); PubuiInkey(30); return EXCEPTION; } /*选择主密钥 */ ASSURE_NORMAL(PubGetBanknMKeyIndex(&nKeyIndex)); #ifdef EMVIC if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); //先关闭串口,然后下面打开串口 } #endif if (PubOpenDevice("PINPAD", EM_io_EPP, &phPinpad) != EM_SUCCESS) { EA_vCls(); PubDisplay(2, "无法打开密码键盘"); PubDisplay(3, "按任意键返回"); PubuiInkey(3); return EXCEPTION; } ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MASTERKEY, nKeyIndex)); if (cDesType == DES1) { memset(szWorkKey, 0, sizeof(szWorkKey)); memset(szMacKey, 0, sizeof(szMacKey)); memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk)); memset(szMacKeyChk, 0, sizeof(szMacKeyChk)); memcpy(szWorkKey, szBuffer, 8); memcpy(szWorkKeyChk, szBuffer + 8, 4); memcpy(szMacKey, szBuffer + 12, 8); memcpy(szMacKeyChk, szBuffer + 20, 4); nWorkKeyLen = 8 ; nMacKeyLen = 8 ; } else if ( cDesType == DES3) { memset(szWorkKey, 0, sizeof(szWorkKey)); memset(szMacKey, 0, sizeof(szMacKey)); memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk)); memset(szMacKeyChk, 0, sizeof(szMacKeyChk)); memcpy(szWorkKey, szBuffer, 16); memcpy(szWorkKeyChk, szBuffer + 16, 4); memcpy(szMacKey, szBuffer + 20, 8); // mackey 银联预留了16位,目前只用了8位 memcpy(szMacKeyChk, szBuffer + 36, 4); nWorkKeyLen = 16 ; nMacKeyLen = 8 ; //add by baijz 20110422 // if(FV.bank.cEncryptTrack == YES) { memcpy(szTdkKey, szBuffer + 40, 16); memcpy(szTdkKeyChk, szBuffer + 56, 4); nTdkKeyLen = 16; } //add end } /*判断密钥是否正确 */ ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_WORKKEY, 0, nWorkKeyLen, szWorkKey)); ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, 0, nWorkKeyLen, szWorkKey)); ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, 0)); BUFCLR(szTmpBuffer); memset(szTmp1, 0, sizeof(szTmp1)); ASSURE_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer)); if (memcmp(szTmpBuffer, szWorkKeyChk, 4)) { PubClearAll(); PubDisplay(3, "校验workkey错"); PubuiInkey(10); EA_ucCloseDevice(&phPinpad); #ifndef TAICANGTEST return EXCEPTION; #endif } ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, 0, nMacKeyLen, szMacKey)); ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, 0)); BUFCLR(szTmpBuffer); memset(szTmp1, 0, sizeof(szTmp1)); ASSURE_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer)); if (memcmp(szTmpBuffer, szMacKeyChk, 4)) { PubClearAll(); PubDisplay(3, "校验mackey错"); PubuiInkey(10); EA_ucCloseDevice(&phPinpad); #ifndef TAICANGTEST return EXCEPTION; #endif } //add by baijz 20110426 if(FV.bank.cEncryptTrack == YES) { ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, 1, nTdkKeyLen, szTdkKey)); ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, 1)); BUFCLR(szTmpBuffer); memset(szTmp1, 0, sizeof(szTmp1)); ASSURE_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer)); if (memcmp(szTmpBuffer, szTdkKeyChk, 4)) { PubClearAll(); PubDisplay(3, "校验tdkkey错"); PubuiInkey(10); EA_ucCloseDevice(&phPinpad); #ifndef TAICANGTEST return EXCEPTION; #endif } } //add end EA_ucCloseDevice(&phPinpad); BUFCLR(FV.Other.gbszWorkKey); BUFCLR(FV.Other.gbszMacKey); memcpy(FV.Other.gbszWorkKey, szWorkKey, nWorkKeyLen); FV.Other.gbWorkKeyLen = nWorkKeyLen; WRITE_nVAR(FV.Other.gbszWorkKey); WRITE_nVAR(FV.Other.gbWorkKeyLen); memcpy(FV.Other.gbszMacKey, szMacKey , nMacKeyLen); FV.Other.gbMacKeyLen = nMacKeyLen; WRITE_nVAR(FV.Other.gbszMacKey); WRITE_nVAR(FV.Other.gbMacKeyLen); //add by baijz 20110420 BUFCLR(FV.Other.gbszTdkKey); memcpy(FV.Other.gbszTdkKey, szTdkKey , nTdkKeyLen); FV.Other.gbTdkKeyLen = nTdkKeyLen; WRITE_nVAR(FV.Other.gbszTdkKey); WRITE_nVAR(FV.Other.gbTdkKeyLen); //add end //add by baijz 20120109 /* * 设置批次号 */ BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, 60, szBuffer, &nLen); if (nLen > 0) { BUFCLR(szTmpBuffer); memcpy(szTmpBuffer, szBuffer + 2, 6); PubSetBankstateszBatchNum(szTmpBuffer); } EA_ucGetDateTime(&DateTime); BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen); if (nLen > 0) { BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer, 2); DateTime.ucMonth = atoi(szDateTimeBuf); BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer + 2, 2); DateTime.ucDay = atoi(szDateTimeBuf); // EA_ucSetDateTime(&DateTime, EM_SYSTEM_DATE); //del by baijz 20120524 } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_TIME, szBuffer, &nLen); if (nLen > 0) { BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer, 2); DateTime.ucHour = atoi(szDateTimeBuf); BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer + 2, 2); DateTime.ucMinute = atoi(szDateTimeBuf); BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer + 4, 2); DateTime.ucSecond = atoi(szDateTimeBuf); // EA_ucSetDateTime(&DateTime, EM_SYSTEM_TIME); //del by baijz 20120524 } //add end EA_ucSetDateTime(&DateTime, EM_SYSTEM_DATE|EM_SYSTEM_TIME); //add by baijz 20120524 //BCTST strcpy(FV.OPER.gbszLoginOper, FV.OPER.gbszOper); //已向主机签到的操作员不能删除 WRITE_nVAR(FV.OPER.gbszLoginOper); PubDisplayCen(2, "交易成功"); PubuiInkeyMs(500); #ifdef EMVIC BUFCLR(szGetBuffer); PubGetDownLoadEmvPara(szGetBuffer); if ( szGetBuffer[0] == YES) { //这里有多一次拨号,是无法避免的,因为签到有下密钥动作, //而这个动作有打开外置密码键盘,这样拨号和密码键盘会冲突, //所以只能多一次拨号 PubDisplay(2,"下载EMV参数中..."); PubuiInkey(1); //下载EMV 参数,先下载密钥,然后下载 if(PubYlConnect(&CommInfo) ==NORMAL) { if (PubQueryPubilcKey () == 1) { PubDownPubilcKey (); } // PubDialOff (&CommInfo); if(PubYlConnect(&CommInfo)==NORMAL) { PubDownEmvPara (); } // PubDialOff (&CommInfo); } PubDialOff (&CommInfo); VERIFY_NORMAL(PubSetDownLoadEmvPara(NO)); } #endif PubDialOff (&CommInfo); //add by baijz 20110718 BCTC检测要求,参数下载成功,清除标志 if(FV.Other.POSSTATFLAG == 3) { FV.Other.POSSTATFLAG = 0; WRITE_nVAR(FV.Other.POSSTATFLAG); } PubSetPoscfgcLoginState(LOGON); //add end return NORMAL; }
/* * 函数功能:检查返回的报文 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubDispRetMsg(struct FileRecStru *pos) { char szBuffer[50]; char szRetAmt[15]; char szBuf[256]; unsigned char ucRet; int i, nLen; DevHandle hdlPinpad; int nTmpLen; uchar ucFd; //chenjs20061220 add down ET_DATETIME dtLocal; char szDateTime[3]; //chenjs20061220 add up PubClearAll(); /*检验是否串包 */ ASSERT_NORMAL(PubCheckPack(pos)); EA_ucGetDateTime(&dtLocal); BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_TIME, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szTime); sprintf(pos->szTime, "%6.6s", szBuffer); //chenjs20061220 add down BUFCLR(szDateTime); memcpy(szDateTime, szBuffer, 2); dtLocal.ucHour = atoi(szDateTime); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer + 2, 2); dtLocal.ucMinute = atoi(szDateTime); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer + 4, 2); dtLocal.ucSecond = atoi(szDateTime); //chenjs20061220 add up // EA_ucSetDateTime(&dtLocal, EM_SYSTEM_TIME); } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szDate); sprintf(pos->szDate, "%4.4s", szBuffer); //chenjs20061220 add down BUFCLR(szDateTime); memcpy(szDateTime, szBuffer, 2); dtLocal.ucMonth = atoi(szDateTime); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer + 2, 2); dtLocal.ucDay = atoi(szDateTime); //chenjs20061220 add up // EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE); } EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE|EM_SYSTEM_TIME); /*非签到交易而且返回码不成功,就清除冲正标志 */ if ((pos->cTransType != LOGIN) && (memcmp(gbszErrCode, "00", 2) != 0)) PubSetPoscfgcAutoVoidFlag(0); i = 0; while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2)) i++; if (err_mess[i][0] == '\0') /* Unknow Error */ sprintf(szBuffer, "%2.2s交易失败" , gbszErrCode); else // strcpy(szBuffer, err_mess[i] + 2); 20060119 by luo strcpy(szBuffer, err_mess[i] ); /*Defined Error */ //磁条卡充值返回98,需要马上发起确认交易 if(memcmp(gbszErrCode, "98", 2) == 0 && gbnTransType == MAG_LOAD_CASH) { return NORMAL; } //add by baijz 20110704 11 A2 A4 A5 A6 交易成功 if ((memcmp(gbszErrCode, "11", 2) == 0) || (memcmp(gbszErrCode, "A2", 2) == 0) || (memcmp(gbszErrCode, "A4", 2) == 0) || (memcmp(gbszErrCode, "A5", 2) == 0) || (memcmp(gbszErrCode, "A6", 2) == 0)) { if (memcmp(gbszErrCode, "11", 2) == 0) { PubDisplayCen(2, "11交易成功"); PubDisplayCen(3, "VIP客户"); } else { sprintf(szBuffer, "%2.2s交易成功", gbszErrCode); PubDisplayCen(2,szBuffer); PubDisplayCen(3, "请向发卡行确认"); } strcpy(gbszErrCode, "00"); PubuiInkeyMs(1000); } if (memcmp(gbszErrCode, "00", 2)) { if (strlen(szBuffer) > 20) { BUFCLR(szBuf); memcpy(szBuf, szBuffer, 20); PubDisplayCen(1, "交易失败"); PubDisplayCen(2, szBuf); PubDisplayCen(3, szBuffer + 20); } else { PubDisplayCen(2, "交易失败"); PubDisplayCen(3, szBuffer); } PubVoice(4); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); memcpy(szCMDRetCode,gbszErrCode, 2); strncpy(szCMDRetMsg,szBuffer+2,sizeof(szCMDRetMsg) - 1); PubuiInkey(5); } else { if (pos->cTransType != LOGIN) { PubVoice(3); EA_vBeepMs(100); PubDisplayCen(2, "交易成功"); PubuiInkeyMs(200); EA_vBeepMs(100); } } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, AUTH_ID, szBuffer, &nLen); if (nLen > 0) { if ( pos->cTransType == CONFIRM || pos->cTransType == OFFLINE_CONFIRM || pos->cTransType == MOTO_CONFIRM || pos->cTransType == MOTO_OFFLINE_CONFIRM) { BUFCLR(pos->szOldAuthID); sprintf(pos->szOldAuthID, "%6.6s", pos->szAuthID ); } BUFCLR(pos->szAuthID); sprintf(pos->szAuthID, "%6.6s", szBuffer); } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, RETR_NUM, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szReferenceNum); sprintf(pos->szReferenceNum, "%12.12s", szBuffer); } if (!memcmp(gbszErrCode, "00", 2)) { switch (pos->cTransType) { case INQUERY: case YLJF_INQUERY: //add by baijz 20110428 BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen)); if (nLen == 0) { PubClearAll(); PubDisplayInv(2, "未返回余额"); EA_vBeepMs(1000); PubuiInkey(5); return EXCEPTION; } memcpy(szRetAmt, szBuffer + 7, 13); szRetAmt[13] = '\0'; if (szRetAmt[0] == 'C') szRetAmt[0] = ' '; else szRetAmt[0] = '-'; i = 1; while (1) { if (i == 13)//chenjs20061115 12->13 break; if (szRetAmt[i] != '0' && szRetAmt[i] != ' ') break; //chenjs20061115研发测试 if (szRetAmt[i] == '0') if (szRetAmt[i] == '0' && i < 10) szRetAmt[i] = ' '; //chenjs20061115 add down if( i >=10 && szRetAmt[i] == ' ') szRetAmt[i] = '0'; //chenjs20061115 add up i++; } #ifdef EMVIC if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); //先关闭串口,然后下面打开串口 } #endif ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad); if (ucRet != EM_io_SUCCESS) { PubuiInkey(3); PubClearAll(); if (ucRet == EM_io_OPENED) PubDisplay(2, "密码键盘已经打开"); else { PubDisplay(2, "无法打开密码键盘"); PubuiInkey(3); return EXCEPTION; } PubuiInkey(3); break; } sprintf(szBuffer, "%11.11s.%2.2s", szRetAmt, szRetAmt + 11); //bctc add by wei #ifndef EPT5610 ucRet = EA_ucICCardIn(gbhdlUserCard); #endif #ifdef EPT5610 ucRet = EA_ucICCardIn(EM_ic_USERCARD); #endif //bctc add end if ( iPinpadType == 1 ) //外置PINPAD { EA_vCls(); PubDisplayCen (2, "查询成功"); PubDisplayCen (3, "请查看密码键盘"); if(ucRet == EM_SUCCESS) { PubDisplayCen (4, "并拔卡"); } PubucDispPinpad(hdlPinpad, 1, "Balance:"); PubucDispPinpad(hdlPinpad, 2, szBuffer); } else { sprintf(szBuf , " %14.14s" , szBuffer); EA_vCls(); PubDisplayCen (1, "查询成功"); PubDisplay (2, "可用余额:"); PubDisplay(3, "%s", szBuf); if(ucRet == EM_SUCCESS) { PubDisplayCen (4, "请拔卡"); } } PubuiInkey(10); if ( iPinpadType == 1 ) //外置PINPAD { PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE "); PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD"); } while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS); break; default: BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, EXPIRY, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szExpDate); sprintf(pos->szExpDate, "%4.4s", szBuffer); } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, PAN, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szCardNo); strcpy(pos->szCardNo, szBuffer); } if(pos->cTransType == CDT_PURCHASE) { BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 62, szBuf, &nLen); if (nLen > 26) { BUFCLR(pos->szRetAmount); BUFCLR(pos->szRetMoneyCode); BUFCLR(pos->szRetFee); BUFCLR(pos->szCdtPoint); BUFCLR(pos->szCdtType); BUFCLR(pos->szCdt1stFee); BUFCLR(pos->szCdtEvyFee); memcpy(pos->szRetAmount, szBuf, 12); memcpy(pos->szRetMoneyCode, szBuf+12, 3); memcpy(pos->szRetFee, szBuf+15, 12); memcpy(pos->szCdtPoint, szBuf+27, 12); memcpy(pos->szCdtType, szBuf+27+12, 1); memcpy(pos->szCdt1stFee, szBuf+27+12+1, 12); memcpy(pos->szCdtEvyFee, szBuf+27+12+1+12, 12); } } if(pos->cTransType == FQ_PURCHASE || pos->cTransType == CDT_PURCHASE) { BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 62, szBuf, &nLen); if (nLen > 26) { BUFCLR(pos->szRetAmount); BUFCLR(pos->szRetMoneyCode); BUFCLR(pos->szRetFee); memcpy(pos->szRetAmount, szBuf, 12); memcpy(pos->szRetMoneyCode, szBuf+12, 3); memcpy(pos->szRetFee, szBuf+15, 12); } } if(pos->cTransType == JF_PURCHASE || pos->cTransType == YLJF_PURCHASE) { BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 62, szBuf, &nLen); if (nLen > 21) { BUFCLR(pos->szJFPoint); BUFCLR(pos->szJFPayAmount); BUFCLR(pos->szJFBalance); memcpy(pos->szJFPoint, szBuf, 10); memcpy(pos->szJFPayAmount, szBuf +10, 12); memcpy(pos->szJFBalance, szBuf + 22, 10); } //add by baijz 20120109 积分余额以54域为准 BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 54, szBuf, &nLen); if (nLen > 8) { memcpy(pos->szJFBalance, szBuf + 8, 12); } //add end } BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 63, szBuf, &nLen); if (nLen > 0) { BUFCLR(pos->szCardId); BUFCLR(pos->szIssuerMsg); BUFCLR(pos->szCupMsg); BUFCLR(pos->szAquMsg); memcpy(pos->szCardId, szBuf, 3); if (nLen > 3) sprintf(pos->szIssuerMsg, "%20.20s", szBuf + 3); if (nLen > 23) sprintf(pos->szCupMsg, "%20.20s", szBuf + 23); if (nLen > 43) sprintf(pos->szAquMsg, "%20.20s", szBuf + 43); } BUFCLR(szBuf); nLen = sizeof(szBuf); BUFCLR(pos->szIssuerID); BUFCLR(pos->szAcqId); PubGetBit(&iso1, 44, szBuf, &nLen); if (nLen > 0) { sprintf(pos->szIssuerID, "%-11.11s", szBuf); sprintf(pos->szAcqId, "%-11.11s", szBuf + 11); } BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 32, szBuf, &nLen); if (nLen) sprintf(pos->szPosCenter, "%s", szBuf); /* Pos 中心号 */ BUFCLR (szBuffer); nLen = sizeof (szBuffer); PubGetBit (&iso1, ADDI_AMOUNT, szBuffer, &nLen); if (szBuffer[0]) { if (pos->cTransType == ADDPRE_AUTH) { BUFCLR (pos->szAmount2); sprintf (pos->szAmount2, "%12.12s", szBuffer + 2); } } if( pos->cTransType == CDT_OPEN || pos->cTransType == CDT_QUERY ) { BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen)); if (nLen == 0) { PubClearAll(); PubDisplayInv(2, "未返回余额"); EA_vBeepMs(1000); PubuiInkey(5); return EXCEPTION; } memcpy(szRetAmt, szBuffer + 7, 13); szRetAmt[13] = '\0'; if (szRetAmt[0] == 'C') szRetAmt[0] = ' '; else szRetAmt[0] = '-'; sprintf (pos->szAmount2, "%13.13s", szRetAmt); //for icbc cdt 取可用额度 BUFCLR(szBuf); nLen = sizeof(szBuf); PubGetBit(&iso1, 62, szBuf, &nLen); if (nLen > 0) { BUFCLR(pos->szLCdtAmount); BUFCLR(pos->szBCdtAmount); memcpy(pos->szLCdtAmount, szBuf, 12); //取授信额度 memcpy(pos->szBCdtAmount, szBuf +12, 12);//取银行评定额度 } } break; } // 2009-7-27 10部分承兑处理 if (memcmp(pos->szReturnCode, "10", 2) == 0) { //pos->cPart=1; strcpy(pos->szReturnCode, "00"); if(gbnComposFlag==1) { return NORMAL; } else { EA_vCls (); BUFCLR(szBuffer); sprintf(szBuffer, "金额: %ld.%02ld", atol(pos->szAmount) / 100, atol(pos->szAmount) % 100); PubDisplayCen(1, "交易成功, 但为部分承兑"); PubDisplayCen(2, "是否接受部分承兑?"); PubDisplayCen(3, "接受1 取消0"); PubDisplayCen(4, szBuffer); i = PubuiInkey(60); EA_vCls (); if (i == '1') { EA_vCls (); BUFCLR(szBuffer); sprintf(szBuffer, "%ld.%02ld", atol(pos->szJFPayAmount) / 100, atol(pos->szJFPayAmount) % 100); //PubDisplayCen(1, "交易成功, 但为部分承兑"); PubDisplayCen(2, "未付金额"); PubDisplayCen(3, szBuffer); PubDisplayCen(4, "请另行收取"); PubuiInkey(10); EA_vCls (); return NORMAL; } } //保存流水 nTmpLen = sizeof(struct FileRecStru); if(PubFileOpen(YLWATER, &ucFd)!= NORMAL) { FV.Void.gbnVoidReason = WRI_WATER_ERR; WRITE_nVAR(FV.Void.gbnVoidReason); PubWriteLog(EXCEPTION, __FILE__, __LINE__); return EXCEPTION; } if (PubFileOper(ucFd, REC_WRITE, 0, 0, (char *)pos, &nTmpLen) != NORMAL) { FV.Void.gbnVoidReason = WRI_WATER_ERR; WRITE_nVAR(FV.Void.gbnVoidReason); EA_ucPFClose(ucFd); PubWriteLog(EXCEPTION, __FILE__, __LINE__); return EXCEPTION; } EA_ucPFClose(ucFd); PubSaveDetail(pos); PubSetPoscfgcAutoVoidFlag(0); //PubSetPoscfgcPrintEndFlag(1); PubPrint(0, iPrinterType); //自动撤销 if(gbnTransType == PURCHASE) gbnTransType = POS_VOID; if(gbnTransType == YLJF_PURCHASE) gbnTransType = YLJF_VOID; PubAutoPosVoid(pos); return EXCEPTION; } } else { //根据孙银泉反馈修改,20080509 if(!memcmp(gbszErrCode, "77", 2)||!memcmp(gbszErrCode, "99", 2)||!memcmp(gbszErrCode, "A0", 2)) { PubDisplay(4 , "请重新签到"); VERIFY_NORMAL(PubSetPoscfgcPosState(NO_LOGON)); VERIFY_NORMAL(PubSetPoscfgcLoginState(NO_LOGON)); memset( FV.Other.gbLoginDate , 0 , sizeof(FV.Other.gbLoginDate)); WRITE_nVAR(FV.Other.gbLoginDate); PubuiInkey(5); } //end return EXCEPTION; } return NORMAL; }
int dlm_main(void) { char szGetBuffer[100],szTmpBuf[100]; char cWaitRet; uint uiKey , uiRet; uchar ucRetVal; uchar ucFd; uchar ucRet; int nScreen = 0; char cMenuTime; uint uiCount1,uiCount2; uint uiOption; uint puiConfigInfo; const char *pcModuleName = MODULE_FILE_NAME; // const char *pcCommModuleName = "applib"; DevHandle phPinpad; #ifdef EPT_A9L uint_64 llCnt = 0; char szData[100]; #endif #ifdef EMVIC EA_EMV_vInit(); #endif //设备句柄清空 gbPrintHandle = EM_NULL; //清空所有全局设备句柄,add by zhuchentao 060831 gbhdlMagCard = EM_NULL;; //磁卡模块 gbhdlUserCard = EM_NULL; gbhdlMasterCard = EM_NULL; gbhdlSAM1Card = EM_NULL; gbhdlSAM2Card = EM_NULL; gbhdlSAM3Card = EM_NULL; gbhdlSAM4Card = EM_NULL; gbMifCardHandle = EM_NULL; #ifdef EMVIC gbhdlPINPAD = EM_NULL; gbhdlRS232 = EM_NULL; gbMifCardHandle = EM_NULL; #endif cRunState = 1; CommInfo.gbHdl = EM_NULL; memset(&iso, 0, sizeof(ISODataStru)); memset(&iso1, 0, sizeof(ISODataStru)); memset(&printiso, 0, sizeof(ISODataStru)); memset(&upiso, 0, sizeof(ISODataStru)); gbcECDefault = 0; #ifndef EPT_A9L #ifdef EPT_M3 if (EA_uiLoadAndExecuteModule("LibRFReader.dlm", "") != EM_SUCCESS) #endif #ifdef EPT56X0 if (EA_uiLoadAndExecuteModule("LibRFReader", "") != EM_SUCCESS) #endif { PubDisplay(3, "载入LibRFReader.dlm失败"); PubDisplay(4, "请下载LibRFReader.dlm文件"); PubuiInkey(0); return EXCEPTION; } #endif EA_vCls(); PubucLoadAllMfVar((char*)MODULE_FILE_NAME, &FV, sizeof(FV)); // #ifdef EPT56X0 // EA_ucSetStopFlag(EM_DISABLE_STOP); // #endif // #ifdef EPT_A9L // EA_ucSetStopFlag(EM_DISABLE_STOP); // #endif // 银商允许修改参数标志,提交程序的时候分别tms非tms的2种情况编译提交 // setup.c 中设置的地方取消无用了!! cSetupModifyFlag = 1;// 下载版 允许修改参数 // cSetupModifyFlag = 0;// TMS服务器版 不允许修改参数 #ifndef EPT5610 EA_vSetLCDLightTimer(60); #endif EA_vCls(); if (PubucFirstRunPara(pcModuleName, "parafile") == EM_SUCCESS) { PubGetPinpadPara();// 先读取参数文件中密码键盘标签 FV.gbnParaFirstFlag = YES; WRITE_nVAR(FV.gbnParaFirstFlag); } PubUsePinpadInside(FV.Other.SetPinpadType); // PubUsePinpadInside(1); PubGetPrinterType(&iPrinterType); PubGetPinpadType(&iPinpadType); while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS) { PubDisplayInv(2, "打开密码键盘错"); PubDisplay(3, "请接入密码键盘"); PubDisplay(4, "[%d][%02x]", ucRet, ucRet); EA_vBeepMs(50); uiRet = PubuiInkey(1); if (uiRet == EM_key_FUNC1) { PubSetUsePinpadType(); } if (uiRet == EM_key_FUNC9||uiRet == EM_key_CANCEL) { return EM_ERROR; } } while ((PubGetPinpadVer(phPinpad ,&iPinpadVer)) == 3) { PubDisplayInv(2, "请接好密码键盘"); EA_vBeepMs(50); PubuiInkey(1); } #ifndef EPT5610 //20070914 by wei 将安全级别设置成默认级别 if ( iPinpadVer == 2 ) { EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &puiConfigInfo); if ( puiConfigInfo != EM_pin_DEFAULTCONFIG) { EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG); } } #endif EA_ucCloseDevice(&phPinpad); nFirstSetupFlag = NO; if (PubucFirstRunProg(pcModuleName) == EM_SUCCESS) { FV.gbnFirstFlag = YES; WRITE_nVAR(FV.gbnFirstFlag); } // 导入def8583.h中的8583包定义 if (PubImport8583(YlIso8583Def) == EXCEPTION) { EA_vCls(); PubDisplay(3, "8583包导入出错"); PubDisplay(4, "请检查程序重新下装"); PubuiInkey(0); return EXCEPTION; } // 导入结束 PubGetMifsType(&iMifsType); //增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断 if (FV.gbnFirstFlag == YES) { PubSetupFirst(); #ifdef EMVIC setup_first (); #endif WRITE_nVAR(FV); //这里把setupfirst里面的内容统一写入一次 nFirstSetupFlag = YES; FV.gbnFirstFlag = NO; WRITE_nVAR(FV.gbnFirstFlag); FV.gbnParaFirstFlag = YES; WRITE_nVAR(FV.gbnParaFirstFlag); if (FV.gbnParaFirstFlag == YES) { PubReadPara() ; } FV.gbnParaFirstFlag = NO; WRITE_nVAR(FV.gbnParaFirstFlag); } if (FV.gbnParaFirstFlag == YES) { PubReadPara(); } if (nFirstSetupFlag == YES) { PubInitGlobal(); PubSetup(10); nFirstSetupFlag = NO; } else { PubInitGlobal(); } #ifdef TMS //读取主控应用参数 ProReadBasePara(); #endif // by wei 每次进入应用不需要重新操作员签到 modify by baijz 20110723 BCTC要求每次开机操作员签到 BUFCLR(szGetBuffer); // VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); // if (szGetBuffer[0] == LOGON) // PubSetPoscfgcPosState(NO_LOGON); EA_vCls(); PubKeyOn(); PubDisplayInv( 1, "银联应用" ); PubDisplayCen(2, "CUP2.0"); PubDisplayCen(3, "自检..."); //ucRet = EA_ucOpenDevice("PINPAD",EM_io_IPP, &phPinpad); while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS) { PubDisplayInv(2, "打开密码键盘错"); PubDisplay(3, "[%d][%02x]", ucRet, ucRet); EA_vBeepMs(50); PubuiInkey(1); } while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS) { PubDisplayInv(2, "请接好密码键盘"); PubDisplay(3, "[%d][%02x]", ucRet, ucRet); EA_vBeepMs(50); PubuiInkey(1); } // 为多应用,怕其他应用使用和银联相同的mackey workkey的ID号,这里重新load一次。 PubucSelectKey(phPinpad, EM_pin_MASTERKEY, FV.bank.nMKeyIndex); if(FV.Other.gbMacKeyLen) PubucLoadKey(phPinpad,EM_pin_DEFAULTMODE ,EM_pin_MACKEY, 0, FV.Other.gbMacKeyLen, FV.Other.gbszMacKey); if(FV.Other.gbWorkKeyLen) PubucLoadKey(phPinpad, EM_pin_DEFAULTMODE ,EM_pin_WORKKEY, 0, FV.Other.gbWorkKeyLen, FV.Other.gbszWorkKey); EA_ucCloseDevice(&phPinpad); if (PubuiInkeyMs(500) == EM_key_CANCEL) PubLogin(); PubGetMifsType(&iMifsType); //增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断 PubInitComm(&CommInfo, AUTOCHECK); BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcBatchState(szGetBuffer)); if (szGetBuffer[0] == YES) { EA_vCls(); PubDisplayInv(2, "请先结算再作交易"); PubuiInkey(0); } BUFCLR(szGetBuffer); BUFCLR(gbPosTags); gbTags = 0; #ifdef EMVIC PubSetExeReader(1); #endif // 为防止清冲正标志的时候死机这种非常极端小概率事件,这里做一次判断最后一笔交易流水来清冲正 PubPreAutoVoid(); nScreen = 0 ; while (1) { // 当冲正标识、冲正缓冲区两者中的一个为0时,两者都清0 if (FV.Void.cAutoVoidFlag != 1 || !memcmp(FV.Void.gbszVoidStr, "\x00\x00\x00\x00\x00\x00\x00\x00", 8)) { PubClearAutoVoidBuf(); } PubClearIcon();// //清图标行 #ifdef TMS if (ProJudgeBaseDlaVer() == EM_SUCCESS) { ProGetBaseDialFix(); ucRet = PubReturnUpdate() ; if (ucRet != EM_ERROR) { PubDelAllBit(&iso); close_all_dev(); return ucRet; } if (PubCheckRunState() == EM_SUCCESS) { PubDelAllBit(&iso); close_all_dev(); return EM_ERROR; } if (PubCheckSettleTimes() == EM_SUCCESS) { PubDisplay(2 , "到达累计结算次数"); PubDisplay(3 , "自动联机报道"); PubuiInkey(2); FV.SettleTimesCount = 0; WRITE_nVAR(FV.SettleTimesCount); PubDelAllBit(&iso); close_all_dev(); return 29;// 标签120000029 } } #endif memset(&gbTrkInfo, 0, sizeof(struct TrackInfo)); memset(&gbCardinfo, 0, sizeof(struct CardConfig)); //FV.Other.POSSTATFLAG = 6;//chenjs20060915 ls add for test TMS switch (FV.Other.POSSTATFLAG) { case 0: break; case 1: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求下载参数"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); PubDownPara(); continue; case 2: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求上传状态"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); PubUploadState(); continue; case 3: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求重新签到"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); PubSetPoscfgcLoginState(NO_LOGON); //add by chenjis 20130423 PubBankLogin(); continue; #ifdef EMVIC case 4: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求公钥下载"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); if(PubYlConnect(&CommInfo)!=NORMAL) continue; if (PubQueryPubilcKey () == 1) { PubDownPubilcKey (); } PubDialOff (&CommInfo); continue; case 5: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求更新参数"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); if(PubYlConnect(&CommInfo)!=NORMAL) continue; //add by baijz 20110906 下载过程断电,需要删除EMV参数文件,否则会重复下载 EA_ucPFDel (FEmvPara); EA_ucPFCreate (FEmvPara, (sizeof (struct EMVPARA))); //add end PubDownEmvPara (); PubDialOff (&CommInfo); continue; #endif #ifdef TMS case 6: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "要求下载TMS参数"); PubDisplay(2, "请按确认键继续"); PubuiInkey(60); TmsDownPara(); continue; #endif case 7: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "要求下载卡BIN黑名单"); PubDisplay(2, "请按确认键继续"); PubuiInkey(60); PubDownCardBin(); continue; //JP add default: break; } FV.Other.POSSTATFLAG = 0;//chenjs20070104 add防止不小心死循环 CheckPOSSTATFLAGTimes = 0; WRITE_nVAR(FV.Other.POSSTATFLAG); EA_ucGetDateTime(&datetime); sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay); PubDialOff(&CommInfo); // 判断打印是否完成 PubJudePrintFinish(1); if (EA_ucPFOpen(YLWATER, &ucFd) == EM_SUCCESS) { uiCount1 = 0; uiCount2 = 0; EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount1); //查询剩余笔数 EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount2); //查询有效笔数 //add by chenjis 20130624 if (uiCount1 < 5 || uiCount2 >= FV.Other.gbnForceSettleNums) //modify by chenjis 20130624 { EA_vCls(); PubDisplayInv(1, "系统报告"); if(uiCount1 < 5) PubDisplay(2, "存储满,请先结算"); else PubDisplay(2, "满%d笔,请先结算", FV.Other.gbnForceSettleNums ); PubDisplay(3, "按确认键结算"); PubuiInkey(0); EA_ucPFClose(ucFd); PubSettle(); continue; } EA_ucPFClose(ucFd); } // 如果隔日了,就要求POS的操作员签到。 if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 )) PubSetPoscfgcPosState(NO_LOGON); BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); if (szGetBuffer[0] == NO_LOGON) { #ifdef TMS EA_vCls(); PubDisplayInv(1,"银联EMV应用"); PubDisplayCen(3,"按任意键签到"); PubDisplayCen(4,"按取消键切换应用"); uiRet = PubuiInkey(10); if (uiRet == EM_key_FUNC9|| uiRet == EM_key_CANCEL) { EA_vCls(); PubClearIcon();// //清图标行 PubDisplayCen(2, "应用切换"); PubuiInkeyMs(500); PubDelAllBit(&iso); close_all_dev(); EA_vCls(); return EM_ERROR; } #endif if (PubLogin() != NORMAL) continue; } // 20060119 //for test dudj /* PubDisplay(3, "是否联机签到?"); if (PubuiInkey(2)!=EM_key_ENTER) sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf); PubDisplay(3, ""); */ // 测试的时候打开。发布的封掉 // sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf); if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 )) { if (PubBankLogin() != NORMAL) { PubSetPoscfgcPosState(NO_LOGON); } else { EA_ucGetDateTime(&datetime); sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay); sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf); WRITE_nVAR(FV.Other.gbLoginDate); } continue; } BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); if (szGetBuffer[0] == LOCK) { PubLock(); continue; } PubGetPoscfgcMenuTime(&cMenuTime); PubGetTermCapSet(); //add by chenjis 20130311 while (1) { // PubSetExeReader(0); gbcECDefault = 0; gbcMifUpCard = 0; PubClearIcon();// //清图标行 #ifdef TMS if (ProJudgeBaseDlaVer() == EM_SUCCESS) { // for 主控应用更新,添加一个新返回值2 ucRet = PubReturnUpdate() ; if (ucRet != EM_ERROR) { PubDelAllBit(&iso); close_all_dev(); return ucRet; } if (PubCheckRunState() == EM_SUCCESS) { PubDelAllBit(&iso); close_all_dev(); return EM_ERROR; } if (PubCheckSettleTimes() == EM_SUCCESS) { PubDisplay(2 , "到达累计结算次数"); PubDisplay(3 , "自动联机报道"); PubuiInkey(2); FV.SettleTimesCount = 0; WRITE_nVAR(FV.SettleTimesCount); PubDelAllBit(&iso); close_all_dev(); return 29;// 标签120000029 } } #endif PubSetPoscfgcSettleEnd(1); /*设置结算未结束标志 */ EA_vCls(); PubClearIcon();// //清图标行 // nScreen = 0 ; //chenjs20060725 add down memset(&gbTrkInfo, 0, sizeof(struct TrackInfo)); memset(&gbCardinfo, 0, sizeof(struct CardConfig)); #ifndef TAICANGTEST PubSetBankcMacChk(MAC_X99); #else PubSetBankcMacChk(MAC_NO); #endif #ifdef EMVIC //ecash by wei gblTranAmt = 0l; BUFCLR(gbszTermData); gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes #endif strcpy(gbszErrCode, ""); // if(nScreen == 0) // { // PubDisplay (1, "1.消 费 2.撤 销"); // PubDisplay (2, "3.退 货 4.预授权"); // PubDisplay (3, "5.离 线 6.打 印"); // PubDisplay (4, "7.管 理 8.其 它"); // } // else // PubDisplay (1, "9.转 账 0.水电煤"); //[08/31/2015 shizd]modify PubDisplay (1, "1.查 询 2.消 费"); PubDisplay (2, "3.撤 销 4.补 登"); PubDisplay (3, "5.管 理 6.打 印"); gbTrkInfo.cDoneFlag = 0; uiKey = PubuiInkey((char) cMenuTime); if (uiKey == EM_key_FUNC||uiKey == EM_key_CANCEL) { uiKey = EM_key_NOHIT ; } if (uiKey == EM_key_ENTER) { nScreen = (nScreen + 1) % 2; continue; } uiOption = 0; //if (nScreen == 1) //uiOption += 8; switch (uiKey) { case EM_key_NOHIT: PubDisdoter(); /*chenjs 20060228 del PubDisplays(5 , 1 , " "); PubDisplays(6 , 1 , " "); */ PubDispLogo(); cWaitRet = PubWaitProcess(&ucRetVal); if (cWaitRet == EXCEPTION) continue; PubClearIcon();// //清图标行 switch (ucRetVal) { case 0x99: continue;//[08/31/2015 shizd]add for不允许待机快速交易 if (FV.Other.gbuiDefault == 0) //无默认交易 continue; else // 有默认交易 { if (FV.Other.gbuiDefault == PRE_AUTH) uiOption = 9; else uiOption = 1; break; } // 屏保状态下对快捷键的响应 case EM_key_PURCHASE: uiOption = 1; break; case EM_key_POSVOID: uiOption = 2; break; case EM_key_QUERY: uiOption = 10; break; case EM_key_REFUND: uiOption = 3; break; case EM_key_PREAUTH: uiOption = 9; break; case EM_key_SETTLE: uiOption = 12; break; case '1': uiOption = 13;// 电子现金快速支付 break; case '2': uiOption = 14;// 电子现金余额查询 break; case '3': uiOption = 15;//分期付款消费 break; case '4': uiOption = 16;//手机芯片消费 break; case '5': uiOption = 9;//预授权 break; case '6': uiOption = 17;//预授权撤销 break; case '7': uiOption = 18;//预授权完成请求 break; case '8': uiOption = 19;//圈存 break; case EM_key_CANCEL: PubClearIcon();// //清图标行 EA_vCls(); PubDisplayCen(2, "应用切换"); PubuiInkeyMs(500); PubDelAllBit(&iso); close_all_dev(); EA_vCls(); return EM_ERROR; default: nScreen = 0; continue; } break; // 对快捷键的响应 case EM_key_PURCHASE: uiOption = 1; break; case EM_key_POSVOID: uiOption = 2; break; case EM_key_QUERY: uiOption = 10; break; case EM_key_REFUND: uiOption = 3; break; case EM_key_PREAUTH: uiOption = 9; break; case EM_key_SETTLE: uiOption = 12; break; // 对ATM键的响应 case EM_key_L1: case '1': uiOption = 10; break; case EM_key_R1: case '2': uiOption = 1; break; case EM_key_L2: case '3': uiOption = 2; break; case EM_key_R2: case '4': uiOption = 21; break; case EM_key_L3: case '5': uiOption = 7; break; case EM_key_R3: case '6': uiOption = 6; break; // case EM_key_L4: // case '7': // uiOption = 7; // break; // case EM_key_R4: // case '8': // uiOption = 8; // break; // //添加转账 liudy // case '9': // uiOption = 11; // break; // //添加水电煤 liudy // case '0': // uiOption = 20; // break; case EM_key_FUNC8: #ifdef EPT_A9L EA_vCls(); PubDisplay(2, "写内存文件次数:"); PubucGetMfVarCnt((char*)MODULE_FILE_NAME, &llCnt); BUFCLR(szData); sprintf(szData, "%lld", llCnt); PubDisplay(3, " %s", szData); PubuiInkey(5); #endif continue; case EM_key_FUNC9: EA_vCls();//chenjs20061127 add PubDisplayCen(2, "应用切换"); PubuiInkeyMs(500); PubDelAllBit(&iso); close_all_dev(); EA_vCls(); return EM_ERROR; default: continue; } if (uiOption >= 1 && uiOption <= 21) break; } // PubInitComm(&CommInfo, WAIT); PubProcess(uiOption); // gbnTransType = 0; } return EM_SUCCESS; }
/************************************** *功能: 基于EMV整个流程交易结果显示 *注意: 卡片批准后显示查询余额 *参数意义: * pos.transresult:0x00--交易批准 * 0x01--交易拒绝 ***************************************/ void PubEMVResult(struct FileRecStru *TmpPos) { char szBuffer[50]; char szRetAmt[15]; unsigned char ucRet; int i, nLen; DevHandle hdlPinpad; char szBuf[50];//chenjs20070125 add i = 0; while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2)) i ++; PubClearAll(); if (err_mess [ i ][ 0 ] == '\0') /* Unknow Error*/ sprintf(szBuffer, "交易失败[%2.2s]",gbszErrCode); else strcpy(szBuffer, err_mess[i]); /*Defined Error*/ if (memcmp(gbszErrCode, "00", 2)&&TmpPos->transresult == 0x00 ) { if (gbnTransType != LOGIN && gbnTransType !=LOGOUT) { PubClearAll(); if (strlen(szBuffer) > 20) { //chenjs20060712 del PubDisplayCen(2, "交易失败"); PubDisplay(2, "%20.20s", szBuffer);//chenjs20060712 3->2 PubDisplayCen(3, szBuffer + 20);//chenjs20060712 4->3 } else { PubDisplayCen(2, "交易失败"); PubDisplayCen(3, szBuffer); } PubVoice(4); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); memcpy(szCMDRetCode,gbszErrCode, 2); strncpy(szCMDRetMsg,szBuffer+2,sizeof(szCMDRetMsg) - 1); // PubuiInkey(2); } } if (!memcmp(gbszErrCode, "00", 2) && TmpPos->transresult == 0x01) { BUFCLR(szBuf); PubHexToAsc(szBuf,TmpPos->tvr,10,0); EA_vCls(); PubDisplays(1,1,"95:%s",szBuf); PubDisplays(2,1, "9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]); strcpy (szBuffer, "交易拒绝"); PubDisplayCen(3, szBuffer); PubDisplayCen(4, "请拔卡"); PubuiInkey(5); EA_vCls(); } //add by wei bctc debug 拒绝交易也显示tvr if ((strlen(gbszErrCode)==0) && TmpPos->transresult == 0x01) { BUFCLR(szBuf); PubHexToAsc(szBuf,TmpPos->tvr,10,0); EA_vCls(); PubDisplays(1,1,"95:%s",szBuf); PubDisplays(2,1, "TSI9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]); strcpy (szBuffer, "交易拒绝"); PubDisplayCen(3, szBuffer); PubDisplayCen(4, "请拔卡"); PubuiInkey(5); EA_vCls(); } if (memcmp(gbszErrCode, "00", 2)&&(strlen(gbszErrCode)>0))//bctc add by wei { //chenjs20070125 add down 解决研发测试组提的显示不完整 PubClearAll(); if (strlen(szBuffer) > 20) { BUFCLR(szBuf); memcpy(szBuf, szBuffer, 20); PubDisplayCen(2, szBuf); PubDisplayCen(3, szBuffer + 20); } else PubDisplayCen(2, szBuffer); PubDisplayCen(4, "请拔卡"); PubVoice(4); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); memcpy(szCMDRetCode,gbszErrCode, 2); strncpy(szCMDRetMsg,szBuffer+2,sizeof(szCMDRetMsg) - 1); PubuiInkey(2); } //chenjs20070125 add up if (!memcmp(gbszErrCode, "00", 2) && (gbnTransType == INQUERY || gbnTransType == YLJF_INQUERY || gbnTransType == CDT_OPEN || gbnTransType == CDT_QUERY) && TmpPos->transresult == 0x00) { nLen = sizeof(szBuffer); PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen); if (nLen == 0) { PubClearAll(); PubDisplayInv(2, "未返回余额"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"XR"); strcpy(szCMDRetMsg,"未返回余额"); EA_vBeepMs(1000); PubuiInkey(3); return; } memcpy(szRetAmt, szBuffer + 7, 13); szRetAmt[13] = '\0'; if (szRetAmt[0] == 'C') szRetAmt [ 0 ] = ' '; else szRetAmt [ 0 ] = '-'; i = 1; while (1) { if (i == 13)//chenjs20061115 12->13 break; if (szRetAmt[i] !='0' && szRetAmt[i] != ' ') break; //chenjs20061115研发测试if (szRetAmt[i] == '0') if (szRetAmt[i] == '0' && i < 10) //chenjs20061115 add szRetAmt[i] = ' '; //chenjs20061115 add down if( i >= 10 && szRetAmt[i] == ' ') szRetAmt[i] = '0'; //chenjs20061115 add up i ++; } if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); } ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad); if (ucRet != EM_io_SUCCESS) { //PubuiInkey(3); PubClearAll(); if (ucRet == EM_io_OPENED) PubDisplay(2, "密码键盘已经打开"); else { PubDisplay(2, "无法打开密码键盘"); PubuiInkey(3); return ; } PubuiInkey(3); } sprintf(szBuffer, "%11.11s.%2.2s", szRetAmt, szRetAmt + 11); if ( iPinpadType == 1 ) //外置PINPAD { EA_vCls(); PubDisplayCen (2, "查询成功"); PubDisplayCen (3, "请查看密码键盘"); PubDisplayCen (4, "并拔卡"); PubucDispPinpad(hdlPinpad, 1, "Balance:"); PubucDispPinpad(hdlPinpad, 2, szBuffer); } else { PubDisplay(3, "余额:%s元", szBuffer); sprintf(szBuf , " %14.14s" , szBuffer); EA_vCls(); PubDisplayCen (1, "查询成功"); PubDisplay (2, "可用余额:"); PubDisplay(3, "%s", szBuf); PubDisplayCen (4, "请拔卡"); } while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS); RemoveIccTimeOut(10); if ( iPinpadType == 1 ) //外置PINPAD { if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); } ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad); PubClearAll(); PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE "); PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD"); while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS); } } EA_vCls(); return; }
int read_from_EFT(int *pLen, char *readstr) { char buffer[512]; ET_ProductInfo tProductInfo; uint unActLen; uchar ucRet; DevHandle hRS232Handle = EM_INVALID_HANDLE; unActLen = 0; #ifdef EPT_A9L memset(&tProductInfo, 0x00, sizeof(ET_ProductInfo)); EA_ucGetProductInfo(&tProductInfo); if ( memcmp(tProductInfo.acName , "E520" , 4) == 0 && tProductInfo.ucMachType == 2) { ucRet = EA_ucOpenDevice("COM3", 0, &hRS232Handle); } else { ucRet = EA_ucOpenDevice(SERIAL_PORT, 0, &hRS232Handle); } #else ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &hRS232Handle); #endif if (ucRet != EM_SUCCESS || hRS232Handle == EM_INVALID_HANDLE) { EA_vCls(); EA_vDisplay(2, "打开RS232口出错[%02x]", ucRet); EA_ucCloseDevice(&hRS232Handle); PubuiInkey(3); return (EXCEPTION); } ucRet = EA_ucInitRS232(hRS232Handle, EM_232_9600BPS, EM_232_NOPAR, EM_232_8DBS); if (ucRet != EM_SUCCESS) { EA_vCls(); EA_vDisplay(2, "RS232初始化错[%02x]", ucRet); EA_ucCloseDevice(&hRS232Handle); PubuiInkey(3); return (EXCEPTION); } while (1) { *pLen = 0; /* * read STX 0x02 until time out */ memset (buffer ,0 ,sizeof(buffer)); do { if(EM_key_HIT == EA_ucKBHit()) { EA_ucCloseDevice(&hRS232Handle); return (EXCEPTION); } EA_ucReadDeviceMs(hRS232Handle, 1, 10, buffer, &unActLen); } while (buffer[0] != 0x02); //read left data ucRet = EA_ucReadDeviceMs(hRS232Handle, 200, 10, buffer+1, &unActLen); if (ucRet != EM_SUCCESS || unActLen > 200) continue; // debug_print((char*)"SERIAL CMD", buffer, unActLen + 1);//FIXME *pLen = unActLen + 1; memcpy(readstr, buffer, *pLen); break; } //end of while EA_ucCloseDevice(&hRS232Handle); return (NORMAL); }
/* * 函数功能:IC密钥卡发行 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubICCreateKey(void) { unsigned char ucSedBuf[256],ucRecBuf[256],szBuf[4096]; unsigned int uiRetLen; int i, j; CARDHEADER stCardHead; KEYREC stKeyRec; unsigned char szKeyPwd[9],ucTEK1[17],ucTEK2[17],ucTMK[17],ucTMK1[17],ucTMK2[17],chLRCValue, chCheckvalue[9], kyLRCValue; unsigned char ucRandom[5], ucCardMonKey[17], ucMac[9], ucEncryptData[33]; int nKeyNum; ET_DATETIME tDateTime; char szBuffer[100], cRet; EA_vCls(); if ( PubOpenUserICCardDev () != NORMAL ) return EXCEPTION; PubDisplayInv(1, "IC密钥卡发行"); PubDisplayCen(2, "请插入密钥IC卡"); PubDisplayCen(3, "按<取消>退出"); while(1) { if ( PubUserICCardIn() == NORMAL ) break; if (EA_ucKBHit () == EM_key_HIT) { if (PubuiInkey (1) == CANCEL) { return EXCEPTION; } } } if ( PubUserICCardPowerUp() != NORMAL ) return EXCEPTION; BUFCLR(ucCardMonKey); //卡片主控密钥默认是16个0x00 PubClearAll(); PubDisplay(2,"请输入密钥卡密码"); PubKeyOff(); BUFCLR(szBuffer); cRet = PubGetAStr(3,BIGFONT,szBuffer,8); PubKeyOn(); if (cRet != NORMAL) { return EXCEPTION; } strcpy(szKeyPwd, szBuffer); //写卡时间做为一级转加密密钥(POS时间后补0xFF0xFF) BUFCLR(ucTEK1); EA_ucGetDateTime (&tDateTime); sprintf (szBuffer, "%4d%02d%02d%02d%02d%02d", tDateTime.usYear, tDateTime.ucMonth, tDateTime.ucDay,tDateTime.ucHour,tDateTime.ucMinute,tDateTime.ucSecond); memset(ucTEK1, 0xff, 16); memcpy (ucTEK1, szBuffer, 14); //手工输入的密码做为二级转加密密钥 BUFCLR(ucTEK2); memset(ucTEK2, 0xff, 8); memcpy(ucTEK2, szKeyPwd, strlen(szKeyPwd)); //获取随机数 if ( ProICCComm1 ("GET CHALLENGE",CPU_CARD, 0x00, 0x84, 0x00, 0x00, 0x00, ucSedBuf, 0x04, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; memcpy(ucRandom,ucRecBuf,4); //外部内证 BUFCLR(szBuf); memcpy(szBuf, ucRandom, 4); DES(ucCardMonKey, szBuf, ucSedBuf); if ( ProICCComm1 ("EXT AUTH",CPU_CARD, 0x00, 0x82, 0x00, 0x00, 0x08, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //擦除目录 if ( ProICCComm1 ("CLEAR MF",CPU_CARD, 0x80, 0xee, 0x00, 0x00, 0x00, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("DF1选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //建立安全文件 memcpy(ucSedBuf, "\x1E\x00\x00\x01\x00\xF0\xF0\x00\xFF\x00\xFF", 11); if ( ProICCComm1 ("CREATE FILE",CPU_CARD, 0x80, 0xe0, 0x02, 0x00, 0x0b, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //写入MF下密钥 memcpy(ucSedBuf, "\x39\xF0\xF0\x33\x02", 5); memcpy(ucSedBuf+5, ucCardMonKey, 16); if ( ProICCComm1 ("WRITE KEY",CPU_CARD, 0x80, 0xd4, 0x01, 0x00, 0x15, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //创建卡信息记录文件 memcpy(ucSedBuf, "\x00\x00\x03\x00\x20\xF0\xF0\x03\x00\xFF\x00", 11); if ( ProICCComm1 ("CREATE FILE",CPU_CARD, 0x80, 0xe0, 0x02, 0x00, 0x0b, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //创建密钥信息记录文件 memcpy(ucSedBuf, "\x00\x00\x02\x08\x00\xF0\xF0\x02\x00\xFF\x00", 11); if ( ProICCComm1 ("CREATE FILE",CPU_CARD, 0x80, 0xe0, 0x02, 0x00, 0x0b, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("DF1选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //计算密钥的密文 BUFCLR(ucEncryptData); memcpy(ucEncryptData, "\x13\x48\x03\x00", 4); memcpy(ucEncryptData+4, ucTEK1, 16); memcpy(ucEncryptData+20, "\x80\x00\x00\x00", 4); DES(ucCardMonKey, ucEncryptData, ucEncryptData); _DES(ucCardMonKey+8, ucEncryptData, ucEncryptData); DES(ucCardMonKey, ucEncryptData, ucEncryptData); DES(ucCardMonKey, ucEncryptData+8, ucEncryptData+8); _DES(ucCardMonKey+8, ucEncryptData+8, ucEncryptData+8); DES(ucCardMonKey, ucEncryptData+8, ucEncryptData+8); DES(ucCardMonKey, ucEncryptData+16, ucEncryptData+16); _DES(ucCardMonKey+8, ucEncryptData+16, ucEncryptData+16); DES(ucCardMonKey, ucEncryptData+16, ucEncryptData+16); //获取随机数 BUFCLR(ucRecBuf); if ( ProICCComm1 ("GET CHALLENGE",CPU_CARD, 0x00, 0x84, 0x00, 0x00, 0x00, ucSedBuf, 0x04, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; memcpy(ucRandom,ucRecBuf,4); //计算MAC BUFCLR(ucMac); memcpy(ucMac, ucRandom, 4); BUFCLR(ucSedBuf); memcpy(ucSedBuf, "\x84\xd4\x00\x00\x1c", 5); memcpy(ucSedBuf+5, ucEncryptData, 24); memcpy(ucSedBuf+29, "\x80\x00\x00", 3); for (i = 0; i < 4; i++) { for (j = 0; j < 8; j++) { ucMac[j] ^= ucSedBuf[i * 8 + j]; } DES(ucCardMonKey, ucMac, ucMac); } _DES(ucCardMonKey+8, ucMac, ucMac); DES(ucCardMonKey, ucMac, ucMac); //写密钥 memcpy(ucSedBuf, ucEncryptData, 24); memcpy(ucSedBuf+24, ucMac, 4); if ( ProICCComm1 ("WRITE KEY",CPU_CARD, 0x84, 0xd4, 0x00, 0x00, 0x1c, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //写卡信息文件 BUFCLR(szBuffer); DES(ucTEK2, szBuffer, chCheckvalue); memset(&stCardHead, 0, sizeof(CARDHEADER)); stCardHead.KeyNum[0] = 0x00; //密钥数量 根据实际情况填写 最大66条 在此做为测试只写一条 stCardHead.KeyNum[1] = 0x01; memcpy(stCardHead.chExpireDate, "\x20\x99\x12\x31", 4);//有效期 memset(stCardHead.chReserved, 0xff, 16); memcpy(stCardHead.chCheckvalue, chCheckvalue, 4); memcpy(szBuf, &stCardHead, 27); chLRCValue = 0; for(i=0;i<26;i++) chLRCValue ^= szBuf[i]; stCardHead.chLRCValue = chLRCValue; if ( ProICCComm1 ("DF3选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x03", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; BUFCLR(ucSedBuf); memcpy(ucSedBuf, &stCardHead, 31); if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, 0x00, 0x00, 0x1b, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; if ( ProICCComm1 ("DF2选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x02", 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; nKeyNum = stCardHead.KeyNum[0]*256+stCardHead.KeyNum[1]; for(i=0; i<nKeyNum; i++) { BUFCLR(ucTMK); //终端主密钥明文 根据实际情况填写 在此做为测试固定8个0x31 8个0x32 memset(ucTMK, 0x31, 8); memset(ucTMK+8, 0x32, 8); //初始化加密指令 if ( ProICCComm1 ("INIT FOR DES",CPU_CARD, 0x80, 0x1a, 0x08, 0x03, 0x00, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; //加密 memcpy(ucSedBuf, ucTMK, 16); if ( ProICCComm1 ("DESCRYPT",CPU_CARD, 0x80, 0xfa, 0x00, 0x00, 0x10, ucSedBuf, 0x10, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; memcpy(ucTMK1, ucRecBuf, 16); //使用手工输入的密码加密,生成二级转加密密钥 BUFCLR(ucTMK2); DES(ucTEK2, ucTMK1, ucTMK2); DES(ucTEK2, ucTMK1+8, ucTMK2+8); //写密钥信息文件 nKeyNum = stCardHead.KeyNum[0]*256+stCardHead.KeyNum[1]; memset(&stKeyRec, 0, sizeof(stKeyRec)); stKeyRec.kyIndex = 0x00; //密钥索引 默认值为0x00 实际并没有使用 stKeyRec.kyNum = 0x01; //可用次数 0-9 做为预留值 暂时没有使用 PubAscToHex(stKeyRec.kyMechID, "123456789111115F", 16, 0); //商户号 根据实际情况填写 记住后补F 在此做为测试 PubAscToHex(stKeyRec.kyTermID, "11115010", 8, 0); //终端号 根据实际情况填写 在此做为测试 memcpy(stKeyRec.kyEncryptMKey, ucTMK2, 16); //密钥密文 BUFCLR(szBuf); memcpy(szBuf, &stKeyRec, 31); kyLRCValue = 0; for(i=0;i<29;i++) kyLRCValue ^= szBuf[i]; stKeyRec.kyLRCValue = kyLRCValue; //校验位 memcpy(ucSedBuf, &stKeyRec, 31); if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, 0x00, 0x00, 0x1f, ucSedBuf, 0x00, ucRecBuf, &uiRetLen) != NORMAL ) return EXCEPTION; } EA_ucCloseDevice (&gbhdlUserCard); EA_vCls(); PubDisplay(2, "发卡成功!"); PubDisplay(3, "密钥总数:%d", nKeyNum); PubuiInkey(20); return NORMAL; }
//两个出口参数,*uiTotalKeyCounts = 0表示第一个包接收失败 uchar ucOfflineLoad(uint *uiTotalKeyCounts, uint *uiLoadKeyCounts) { DevHandle hRS232Handle; uchar ucRet; uchar ucInitBuf[11]; uchar ucKeyBuf[100]; uchar ucCloseBuf[11]; uchar ucCMD[2]; uchar ucRespCode[2]; uint uiDealCounts;//处理次数,三次失败函数返回EM_ERROR uint uiNextKeyNo; uint uiKeyNo; uint uiKeySum; uint uiWRecNum;//可写记录数 uint uiVRecNum;//有效记录数 uchar ucKeyFileID; uchar ucFlashBuf[50]; uchar ucIsFileEmpty; ucRet = PubOpenDevice("COM", EM_io_PORT1,&hRS232Handle); if (ucRet != EM_SUCCESS) { PubClearAll(); PubDisplayInv(1, "错误"); PubDisplayCen(2, "打开串口错误"); PubuiInkey(3); EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = 0; return EM_ERROR; } ucRet = EA_ucInitRS232(hRS232Handle, FV.ucBPS, EM_232_NOPAR, EM_232_8DBS);//!!!!!!!!!!!!! ucRet = EA_ucClearRS232(hRS232Handle);//清除缓冲 ucRet = ucInitConnect(hRS232Handle, ucInitBuf);//与PC建链 if (ucRet != EM_SUCCESS)//建链失败 { PubClearAll(); PubDisplayInv(1, "错误"); PubDisplayCen(2, "建链失败"); PubuiInkey(3); EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = 0; return EM_ERROR; } //打开密钥文件 ucKeyFileID = ucKeyFileOpen("KeyFile");//包含报错 if (ucKeyFileID == 0) { ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = 0; return EM_ERROR; } //-------------------------------------------------------- //查询剩余可写记录数 ucRet = EA_ucPFInfo(ucKeyFileID, EM_ffs_FREEREC, &uiWRecNum); if(ucRet == EM_SUCCESS) { if( uiWRecNum < 1) { EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiWRecNum); PubClearAll(); PubDisplayInv(1, "错误"); PubDisplay(2,"系统已有%d条密钥",uiWRecNum); PubDisplayCen(3,"密钥文件已满,无法加载密钥"); PubDisplayCen(4,"请先清除所有密钥"); PubuiInkey(10); ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = 0; return EM_ERROR; } } //--------------------------------------------------------- ucIsFileEmpty = 0; EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiVRecNum); if(uiVRecNum == 0)//密钥文件为空 { //使用ucFileOpNoSearch函数 ucIsFileEmpty = 1; } //----------------------------- *uiTotalKeyCounts = 0; uiKeySum = 0; uiNextKeyNo = 1; PubClearAll(); while (1) { uiDealCounts = 3; while (uiDealCounts > 0) { ucRet = ucRecvPackage(hRS232Handle, ucKeyBuf); if (ucRet != EM_SUCCESS)//收密钥失败 { PubClearAll(); PubDisplayInv(1, "错误"); PubDisplay(2, "接收第%d条密钥失败", uiNextKeyNo); PubuiInkey(3); ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_ERROR; } if(ucKeyBuf[7] != 0x00 || ucKeyBuf[8] != 0x02)//不是离线加载报文,抛弃 { continue; } uiKeyNo = ucKeyBuf[9] / 16 * 100000 + ucKeyBuf[9] % 16 * 10000 + ucKeyBuf[10] / 16 * 1000 + ucKeyBuf[10] % 16 * 100 + ucKeyBuf[11] / 16 * 10 + ucKeyBuf[11] % 16 ;//当前密钥序号 if( uiKeyNo != uiNextKeyNo ) { continue;//若当前密钥序号!=预计的序号,抛弃该包 } if (uiKeySum == 0)//第一次收到密钥包,仅计算一次密钥总条数 { uiKeySum = ucKeyBuf[12] / 16 * 100000 + ucKeyBuf[12] % 16 * 10000 + ucKeyBuf[13] / 16 * 1000 + ucKeyBuf[13] % 16 * 100 + ucKeyBuf[14] / 16 * 10 + ucKeyBuf[14] % 16 ;//包内密钥总条数 *uiTotalKeyCounts = uiKeySum;//修改出口 } //核对密钥校验值 ucRet = ucCheckTMK(&ucKeyBuf[38], &ucKeyBuf[62]); if (ucRet != EM_SUCCESS)//密钥校验失败 { ucCMD[0] = 0x80, ucCMD[1] = 0x02; ucRespCode[0] = 0x39, ucRespCode[1] = 0x39; ucResponse(hRS232Handle, &ucKeyBuf[3], ucCMD, ucRespCode);//&ucInitBuf[3]:SEQ序列号 uiDealCounts --; continue; } break; }//结束该循环表示:收到一个包或重试了三次 if (uiDealCounts == 0)//三次处理失败 { ucCloseConnect(hRS232Handle, ucCloseBuf);//断链 ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); PubClearAll(); PubDisplayInv(1, "错误"); PubDisplay(2, "接收第%d条密钥失败",uiNextKeyNo); PubuiInkey(3); ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_ERROR; } /*写flash*/ memcpy( ucFlashBuf, &ucKeyBuf[15], 47 ); ucFlashBuf[47] = ucKeyBuf[66]; ucFlashBuf[49] = 0; if(ucIsFileEmpty == 1) { //密钥文件为空时,不搜索匹配,直接添加记录 if(ucFileOpNoSearch( ucKeyFileID,ucFlashBuf) != EM_SUCCESS) { ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_ERROR; } } else if(ucIsFileEmpty == 0) { //密钥文件非空时,搜索是否有一样记录,防重复 if( ucFileOp( ucKeyFileID, ucFlashBuf) != EM_SUCCESS) { ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_ERROR; } } else { PubClearAll(); PubDisplayInv(1, "错误"); PubDisplayCen(2, "搜索标志位错误"); PubuiInkey(3); ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_ERROR; } ucCMD[0] = 0x80, ucCMD[1] = 0x02; ucRespCode[0] = 0x30, ucRespCode[1] = 0x30;//加载成功 ucResponse(hRS232Handle, &ucKeyBuf[3], ucCMD, ucRespCode);//&ucInitBuf[3]:SEQ序列号 //----------------------------------------------------------- uiWRecNum--; if(uiWRecNum == 0) { //查询剩余可写记录数 EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiVRecNum); PubClearAll(); PubDisplayInv(1, "错误"); PubDisplay(2,"系统已有%d条密钥",uiVRecNum); PubDisplayCen(3,"密钥文件已满,无法加载密钥"); PubuiInkey(5); ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_ERROR; } //----------------------------------------------- PubDisplayInv(1, "密钥加载"); PubDisplayCen(2,"正在接收密钥..."); PubDisplay(3,"接收第%d条密钥成功", uiNextKeyNo); uiNextKeyNo ++ ; if (uiNextKeyNo - 1 == uiKeySum)//接收完所有密钥 { break; } } ucCloseConnect(hRS232Handle, ucCloseBuf);//断链 ucKeyFileClose(ucKeyFileID);//关闭文件 EA_ucCloseDevice(&hRS232Handle); *uiLoadKeyCounts = uiNextKeyNo - 1; return EM_SUCCESS; }
// E5X0的DLM需要固定dlm_main这个名字,base才能调用 int dlm_main(void) { DevHandle phPinpad; uchar ucFd; uint uiCount, uiValidRec; char cMenuTime; uchar ucRet; int nLoginFailCnt; // 签到失败次数 int nSettleFailCnt; // 自动结算失败次数 ET_DATETIME dtTmp; char szBuffer[200]; char *CMDBUF=0 ;//yinzc add 2011-10-29 int *nCmdLen=0;//yinzc add 2011-10-29 int nRet;//yinzc add 2011-10-29 UINT uiKey;//yinzc add 2011-10-29 #ifdef EPT56X0 uint uiConfigInfo; #endif char cIsAutoVoid=0; // 是否需要自动发送冲正,开机若有遗留冲正,签到后自动发送一次 ProInitVar(); PubucLoadAllMfVar (MODULE_FILE_NAME, (void *)&FV, sizeof(FV)); #ifdef _ECASH_ PubInitRFReader(); #endif #ifdef EPT_A9L // EPT_A9L的FV内存写操作不记录日志 PubSetFVDBGMsgWrite(1); #endif #ifdef SGPL ///add by kevin 20150423 uchar ucFd1; uint uiCount3; #endif BUFCLR(szBuffer); // 导入def8583.h中的8583包定义。 if (PubImport8583(Iso8583Def) == EXCEPTION) { EA_vCls(); PubDisplay(3, "8583包导入出错"); PubDisplay(4, "请检查程序重新下装"); PubuiInkey(0); ASSERT_NORMAL(EXCEPTION); } if (PubucFirstRunProg(MODULE_FILE_NAME) == EM_SUCCESS) FV.gbcFirstFlag = YES; if (PubucFirstRunPara(MODULE_FILE_NAME, PARAM_FILE_NAME) == EM_SUCCESS) FV.gbcParaFirstFlag = YES; gbPrintHandle = NULL_HANDLE; CommInfo.gbHdl = NULL_HANDLE; EA_vCls(); PubGetPrinterType(&iPrinterType); gbcPrintType = iPrinterType; PubUsePinpadInside(FV.bank.cPinpadUseInside); PubGetPinpadType(&iPinpadType); ucRet = FV.bank.cIsDCCMode; FV.bank.cIsDCCMode = YES; // 20090928确保DCC模块存在的话,能先执行DCC模块的初始化动作 ucFd=PubRunBocccProc(CMD_INITPOS, (char *)"", 0); FV.bank.cIsDCCMode = ucRet; if (FV.gbcFirstFlag == YES || FV.gbcParaFirstFlag == YES) { if (FV.gbcFirstFlag == YES) { PubSetupFirst(); #ifdef EMVIC setup_first(); gbnNeedDownAIDParamAll = YES; gbnNeedDownAIDParam = YES;//[5/12/2015 shizd]modify gbnNeedDownCAPKeyAll = YES; gbnNeedDownCAPKey = YES;//[5/12/2015 shizd]modify #endif FV.gbcNeedDownParam = YES; } PubInitGlobal(); if (PubReadPara() != NORMAL) { PubDisplayCen(2, "读参数失败"); PubDisplayCen(3, "请下载参数"); PubDisplayCen(4, "或按<确认键>设置"); while (PubuiInkey(5) != ENTER) ; PubSetup(); } else { #ifdef TMS ProTmsRestorePara(); // 成功读入参数文件后,恢复TMS保存的相关参数 #endif } FV.gbcFirstFlag = NO; FV.gbcParaFirstFlag = NO; PubWriteMemFile(&FV, sizeof(FV)); PubRunBocccProc(CMD_SETFORCECHGPWD, &FV.bank.cForceChgPwd, 1); #ifdef TMS iInitTmsVar((void *)&EG_tTMSHead, sizeof(EG_tTMSHead)); // 支持TMS的如果系统管理员密码是默认值,则提示设置,否则不设置 if (memcmp(FV.gbszParSetupOperPwd, "000000", ADMIN_PWD_LEN) == 0) { ProSetManager(); ProSetCustom(); } #else ProSetManager(); ProSetCustom(); #endif } PubInitGlobal(); #ifdef TEL_FUNC if (FV.bank.cCommFlag == TCP) EA_ucSelectEnetOrFsk(ETH_USED); //获取以太网模块工作需要的SPI口,使用以太网通讯方式,将无法支持电话来电显示 else EA_ucSelectEnetOrFsk(FSK_USED); //获取FSK模块工作需要的SPI口 //电话模块初始化 TA_Tel_vInit(0x71,0x1b); // main_teltest(); // 电话功能测试 #endif #ifdef EMVIC #if EPT_A9L || EPT_M3 EA_EMV_vInit(); #endif #endif #ifdef TMS iRestoreAllTmsVar((void *)&EG_tTMSHead, sizeof(EG_tTMSHead)); // 载入TMS结构 #endif EA_vCls(); PubDisplayInv(1, "BOC POS"); PubDisplay(2, "自检..."); PubKeyOn(); /* EA_vCls(); PubDisplay(1, "自检:"); PubDisplayInv(2, "密码键盘"); PubDisplayCen(3, "打 印 机"); PubDisplayCen(4, "通 信 口"); PubDisplayInv(2, "密码键盘"); EA_vDelay(1); PubDisplayCen(2, "密码键盘"); PubDisplayInv(3, "打 印 机"); EA_vDelay(1); PubDisplayCen(3, "打 印 机"); PubDisplayInv(4, "通 信 口"); */ #ifdef _ECASH_ gblTranAmt = 0l; BUFCLR(gbszTermData); gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes if (FV.bank.nRFReaderType == 0) ProAutoSetcBanknRFReaderType(); #endif PubDisplay(3, "按<取消>进入设置"); if (PubuiInkey(1) == EM_key_CANCEL) //如果误选通讯方式(无线),造成死机,在这里可以进行设置。 ProGetSuperOper(); PubDisplay(3, " "); while ((ucRet = PubOpenDevice((char *)"PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS) { PubClearAll(); PubDisplayInv(2, "打开密码键盘错"); PubDisplay(3, "请接好密码键盘%d %d", ucRet, FV.bank.cPinpadUseInside); EA_vBeepMs(50); PubuiInkey(1); } while ((PubGetPinpadVer(phPinpad, &iPinpadVer)) == 3) { PubClearAll(); PubDisplayInv(2, "请接好密码键盘"); PubDisplay(4, "[%02x]", FV.bank.cPinpadUseInside); EA_vBeepMs(50); PubuiInkey(1); } #ifdef EPT56X0 // 2007-9-18 将pinpad安全级别设置成默认级别 if (iPinpadVer == 2) { EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &uiConfigInfo); if (uiConfigInfo != EM_pin_DEFAULTCONFIG) { EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG); } } #endif PubSetPinTimer(phPinpad, 50); // liudy 将密码键盘超时时间设置为120秒 while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS) { PubClearAll(); PubDisplayInv(2, "请接好密码键盘"); PubDisplay(3, "[%d][%02x]", ucRet, ucRet); EA_vBeepMs(50); PubuiInkey(1); } EA_ucCloseDevice(&phPinpad); //yinzc add below 2011-10-28 for compos #ifdef COMPOS //打开MISPOS的通讯接口 #ifdef EPT_A9L // ucRet = EA_ucOpenDevice("USBD", EM_io_PORT1, &gbhdCMDRS232); //debug // PubDisplay(2, "port[%s]", FV.szRecvPortName); // PubuiInkey(1); ucRet = EA_ucOpenDevice(FV.szRecvPortName, EM_io_PORT1, &gbhdCMDRS232); #else ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &gbhdCMDRS232); #endif if (ucRet != EM_SUCCESS) { EA_vCls(); PubDisplay(1,"无法打开通信端口!"); PubDisplay(2,"请重启设备"); EA_vBeepMs(1000); PubuiInkey(2); return EXCEPTION; } else { // ucRet = EA_ucInitRS232(gbhdCMDRS232,EM_232_9600BPS,EM_232_NOPAR ,EM_232_8DBS); ucRet = EA_ucInitRS232(gbhdCMDRS232,EM_232_115200BPS,EM_232_NOPAR ,EM_232_8DBS); ucRet = EA_ucCloseDevice(&gbhdCMDRS232); //gbhdCMDRS232 = EM_NULL; } #endif // end of above ////// #ifdef COMPOS if (FV.gbnComposType == 0)//yinzc add 2011-10-28 是否完全COMPOS模式 1--收银机通讯 0--POS通讯 PubInitComm(&CommInfo, AUTOCHECK); #endif PubRunBocccProc(CMD_IMPORTCARDBIN, NULL, 0);//091001 gbcPreState = 0; FV.gbNacInfo.cPreState = 0; // gbcPosState = NO_LOGON; //-zyf // gbcLoginState = NO_LOGON; nLoginFailCnt = 0; nSettleFailCnt = 0; cIsAutoVoid = 1; PubPreAutoVoid(); while (1) { EA_ucGetDateTime(&dtTmp); if (dtTmp.usYear != FV.gdtLastCheck.usYear || dtTmp.ucMonth != FV.gdtLastCheck.ucMonth || dtTmp.ucDay != FV.gdtLastCheck.ucDay) // 隔日重新签到,自动结算 { //linq del 20081203 中行规范未提及隔日签到的功能 // gbcPosState = NO_LOGON; // gbcLoginState = NO_LOGON; } FV.gdtLastCheck = dtTmp; if (FV.poscfg.cBatchState == YES) { EA_vCls(); PubDisplayInv(2, "请先结算再作交易"); ProAccumulate(); // 重新统计 PubuiInkey(0); } if (gbcPreState != 0) PubDialOff(&CommInfo); gbcPreState = 0; //mis不打印del by wangrm 2011-12-6 // PubJudePrintFinish(); //-zyfdel // if (gbcPosState == NO_LOGON) // { // // 重新获取菜单 // ProSetDefaultMenu(); // // if (PubLogin() != NORMAL) // continue; // else // EA_ucGetDateTime(&FV.gdtLastCheck); // } // [7/2/2013 zyf]del // // 签到失败5次则等待用户按键,防止无人值守时无谓的拨号,出现高额话费 // if (nLoginFailCnt >= 5) // { // EA_vCls(); // PubDisplay(2, "签到失败"); // PubDisplay(3, "请按任意键继续..."); // // ProucSetStopFlag(FV.bank.cDisableSave); // // PubuiInkey(0); // nLoginFailCnt = 0; // // ProucSetStopFlag(1); // // continue; // } // if (gbcLoginState == NO_LOGON) // { // if (PubBankLogin() != NORMAL) // { // nLoginFailCnt ++; // gbcPosState = NO_LOGON; // PubDialOff(&CommInfo); // PubClearAll(); // PubDisplay(3, "签到失败"); // PubuiInkey(TIPS_TIMEOUT); // continue; // } // // nLoginFailCnt = 0; // BUFCLR(szBuffer); // memcpy(szBuffer, gbszOper, OPER_NUM_LEN); // memcpy(szBuffer+OPER_NUM_LEN, gbszOperPwd, OPER_PWD_LEN); // PubRunBocccProc(CMD_SETCURRENTOPER, szBuffer, OPER_NUM_LEN + OPER_PWD_LEN); // } #ifdef COMPOS if ( nCmdLen != NULL && CMDBUF != NULL) { FV.CMDBUFLen = *nCmdLen; if (FV.CMDBUFLen >0 ) { memset(szCMDBuffer , 0 , sizeof(szCMDBuffer)); memcpy(szCMDBuffer , CMDBUF , FV.CMDBUFLen); FV.szGetCmdFlag = 15; } } #endif if (gbcPosState == LOCK) { PubLock(); continue; } switch (gbcPosCtrlCode) { case '1': // 在交易后下装参数 FV.gbcNeedDownParam = YES; gbcLoginState = NO_LOGON; gbcPosCtrlCode = 0; continue; case '2': // 强制结束批请求 保留 break; case '3': // 还有消息需要发送指示 下装参数时 终端批上送时不在此处 FV.gbcNeedDownParam = YES; gbcLoginState = NO_LOGON; continue; case '4': // 终端批号更新及签到标志 case '5': // 终端批号更新 #ifdef TMS PubTmsUpdate(2); // 在系统要求更新批次时,先做TMS更新处理 #endif PubUpdateBatchPorc(); if (strlen((char *)gbszBatchNum) > 0) { memcpy(FV.bankstate.szBatchNum, gbszBatchNum, 6); PubWriteMemFile(&FV.bankstate, sizeof(FV.bankstate)); } if (gbcPosCtrlCode == '4') gbcLoginState = NO_LOGON; gbcPosCtrlCode = 0; if (IsSupportBoccc() == YES && ( PubRunBocccProc(CMD_ISWATER_EDC,NULL,0) == NORMAL || PubRunBocccProc(CMD_ISWATER_DCC,NULL,0) == NORMAL ) )//090929卡司结账,有流水的情况才结算 { EA_vCls(); PubDisplayCen(1, "中行结账已完成"); PubDisplayCen(2, "将进行卡司结算"); PubDisplayCen(3, "请勿取消"); PubDisplayCen(4, "任意键继续"); PubuiInkey(10); PubRunBocccProc(CMD_DCCSETTLE, (char *)"\x00", 1); if (PubRunBocccProc(CMD_ISBJMODE, NULL, 0) != NORMAL) // 非北京模式 PubRunBocccProc(CMD_EDCSETTLE, (char *)"\x00", 1); } continue; case '6': // 要求终端签到标志 gbcLoginState = NO_LOGON; gbcPosCtrlCode = 0; continue; case '7': // POS终端应该提示终端操作员进行结帐动作 EA_vCls(); PubDisplay(2, "请先结算"); PubuiInkey(TIPS_TIMEOUT); break; default: break; } // 当POS上成功批准一笔基于EMV标准/基于PBOC电子现金IC卡离线消费交易后, // 如果此时POS上所保留的需要上送IST而未上送IST的交易笔数已经超过基本参数 // 中"POS中允许保存的未上送交易笔数"的值,则此时,POS必须主动拨号,将未上送交易全部上送到IST。 //add by liudy COMPOS不允许自主脱机上送 #ifndef COMPOS if ((FV.bank.nHasOfflineNum > 0) && (FV.bank.nHasOfflineNum >= FV.bank.nMaxOfflineNum)) { gbnTransType = OFFLINE_UPLOAD; PubSendOfflineTrans(); } #endif #ifdef TMS // 如果已TMS下载,进行更新处理 PubTmsUpdate(1); // 自动结账POS,若无流水,即可以进行程序更新 if (FV.gbcNeedDownloadTmsPara == YES) { // 下载TMS参数信息 if (PubDownTmsParam() == NORMAL) // 下载TMS参数 { FV.gbcNeedDownloadTms = YES; // 需要进行下载TMS FV.gbcNeedDownloadTmsPara = NO; // 不需要进行下载TMS参数 PubWriteMemFile(&FV.gbcNeedDownloadTms, sizeof(FV.gbcNeedDownloadTms)); PubWriteMemFile(&FV.gbcNeedDownloadTmsPara, sizeof(FV.gbcNeedDownloadTmsPara)); } } #endif // #ifdef EMVIC // if ((gbnNeedDownAIDParam == YES) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0)) // { // // 系统主动要求下载AID参数 // PubDownEmvPara(); // } // if ((gbnNeedDownCAPKey == YES) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0)) // { // // 系统主动要求下载认证中心公钥 // PubDownEmvCAPKey(); // } // #endif // 开机后自动发送一次冲正 // if (cIsAutoVoid == 1) // [7/2/2013 zyf]del mis不主动交易 // PubAutoVoid(); cIsAutoVoid = 0; #ifdef COMPOS FV.szCMDChangeAppFlag = 0x01; ClearCMD(); while (1) { FV.poscfg.cSettleEnd = 0; /* 设置结算结束标志 */ //EA_vCls(); // nScreen = 0 ; //chenjs20060725 add down memset(&gbTrkInfo, 0, sizeof(struct TrackInfo)); memset(&gbCardinfo, 0, sizeof(struct CardConfig)); gbTrkInfo.cDoneFlag = 0; //add by liudy 20140228增加显示余额的控制 if(iDisplayTimer == 1) { ulong passtime = 0; EA_ucGetPassTimer(gbhdlDisplayTimer,&passtime); if(passtime >= 3000) { if (iPinpadType == 1) { ClearPinpadDisp(gbPinpadHandle); if(gbPinpadHandle != NULL_HANDLE) { while (EA_ucCloseDevice(&gbPinpadHandle) != EM_SUCCESS) ; gbPinpadHandle = NULL_HANDLE; } } iDisplayTimer = 0; EA_ucCloseTimer(&gbhdlDisplayTimer); } } if (CMDCONT.Type == cmd_NONE) // CMD_NONE表示无命令 { nRet = GetCMD(); if (nRet != NORMAL) { PubDisplayInv(1, "中国银行"); PubDisplayCen(2, "等待接收数据-->"); PubDisplay(3, " "); PubDisplay(4, " "); EA_ucLKeySwitch(EM_key_ENLKEY); if (EA_ucKBHit_ped() == EM_key_HIT) { uiKey = PubuiInkey(5); if (uiKey == EM_key_FUNC) { EA_vCls(); PubDisplay (1, "1.签到2.重打印"); PubDisplay (2, "3.查询交易明细"); PubDisplay (3, "4.按流水号查询交易"); PubDisplay (4, "5.结算"); ucRet = PubuiInkey(10); switch (ucRet) { case '1': EA_vCls(); PubLogin(); break; case '2': EA_vCls(); ProPrintManageExt(1); break; case '3': EA_vCls(); PubCheckLsExt(4); break; case '4': EA_vCls(); PubCheckLsExt(2); break; case '5': EA_vCls(); ProSettle_POS(); break; default: break; } } } EA_ucLKeySwitch(EM_key_DISLKEY); continue; } } if (CMDCONT.Type != cmd_NONE) { break; } } // [6/8/2013 zyf] if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) == EM_SUCCESS) { uiCount = 0; EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount); uiValidRec = 0; EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec); EA_ucPFClose(ucFd); if (uiCount < 5 || uiValidRec >= 300) { // [6/7/2013 zyf] 存储满自动清流水 EA_vCls(); PubDisplayInv(1, "系统报告"); PubDisplay(2, "存储满,清流水中"); NAK_info(4, (char *)"XX",(char *)"交易失败"); PubuiInkey(1); ProDelWater2(); continue; } } if (PubProcess(CMDCONT.Type) != cmd_INTERRUPT) { ClearCMD(); } #else PubDialOff(&CommInfo); // 20130107 存储满判断从前面调整到这里,避免存储满自动结算,系统返回需要重新签到时无法进入签到的问题 // 自动结算5次则等待用户按键,防止无谓的拨号,出现高额话费 if (nSettleFailCnt >= 5) { EA_vCls(); PubDisplay(2, "结算失败"); PubDisplay(3, "请按任意键继续..."); ProucSetStopFlag(FV.bank.cDisableSave); PubuiInkey(0); nSettleFailCnt = 0; ProucSetStopFlag(1); continue; } if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) == EM_SUCCESS) { uiCount = 0; EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount); uiValidRec = 0; EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec); EA_ucPFClose(ucFd); #ifdef SGPL ///modify by kevin 20150423 if (EA_ucPFOpen((uchar *)YLSIGNWATER, &ucFd1) == EM_SUCCESS) { uiCount3 = 0; EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount3); //查询剩余笔数 } if (uiCount < 5 || uiValidRec >= 300 || uiCount3 >= FV.Other.gbnForceSettleSignNums) #else if (uiCount < 5 || uiValidRec >= 300) #endif //if (uiCount < 5 || uiValidRec >= 300) { EA_vCls(); PubDisplayInv(1, "系统报告"); PubDisplay(2, "存储满,请先结算"); PubDisplay(3, "自动结算..."); if (PubuiInkey(TIPS_TIMEOUT) != EM_key_FUNC1) { if (FV.poscfg.cBatchState == YES) // 自动结算支持披上送的断点续传 PubBatchUp(); else { if (PubSettle() == EXCEPTION) nSettleFailCnt++; else nSettleFailCnt = 0; // 结算成功的 PubRunBocccProc(CMD_DCCSETTLE, (char *)"\x00", 1); if (PubRunBocccProc(CMD_ISBJMODE, NULL, 0) != NORMAL) // 非北京模式 PubRunBocccProc(CMD_EDCSETTLE, (char *)"\x00", 1); } continue; } } #ifdef SGPL EA_ucPFClose(ucFd1); #endif } cMenuTime = FV.poscfg.cMenuTime; // linq add 20081117 重新获取菜单 ProSetDefaultMenu(); PubLoadMenu(gbszMenuResource, MenuResource); if (QUIT_APP == PubProcMenu(MenuResource, (char *)"中国银行")) { PubucUnloadAllMfVar(MODULE_FILE_NAME); return NORMAL; } #endif } }
// [4/25/2013 zyf] int PubReadPin_PlainText(int nMaxLen, int nDispMode,char *pcRetStr, unsigned char *pucRetLen) { uchar ucPinLen, ucRet; char szPinBuf[20 + 1], szBuffer[30]; char szPinCardFlag[1 + 1]; int nEncryptMode; int iPinpadType; DevHandle hdlPinpad; /* * 以下检查参数的合法性。 */ if ( pcRetStr == NULL) { PubWriteLog(EXCEPTION, __FILE__, __LINE__); return EXCEPTION; } if ( nDispMode != DISPOFF && nDispMode != DISPON) { PubWriteLog(EXCEPTION, __FILE__, __LINE__); return EXCEPTION; } /* * 检查在不加密的情况下,缓冲区的大小pucRetLen和要求输入最大长度nMaxLen的合法性 */ if (nMaxLen > 16) nMaxLen = 16; /* 以上是检查参数的合法性 */ nEncryptMode = 0; PubGetPinpadType( &iPinpadType ); ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad); if (ucRet != EM_SUCCESS) { PubClearAll(); PubDisplay(2, "打开密码键盘口错"); PubuiInkey(3); EA_ucCloseDevice(&hdlPinpad);//chenjs20060925 return (EXCEPTION); } PubSetPinTimer(hdlPinpad, 60);//wujianyuan modify 120改成60s 2012-03-03 memset(szPinCardFlag, 0, sizeof(szPinCardFlag)); while (1) { PubClearAll(); BUFCLR(szBuffer); PubDisplay(1, " "); PubDisplay(2, ""); if ( iPinpadType == 1 ) //外置PINPAD { PubDisplayCen(2, "请持卡人输入密码"); PubucDispPinpad(hdlPinpad, 1, "INPUT PIN:"); PubucDispPinpad(hdlPinpad, 2, " "); } else { PubDisplay(2, "请输入联机密码"); PubDisplay(5, "无密码按确认键"); } // 参数4,"0456" 仅仅对56X0 有用,5610中参数用不上,只能允许小于16位的密码输入。 if(nMaxLen <=6)//chenjs20060605 add ucRet = PubReadPinpad(hdlPinpad, 4, "\x00\x04\x05\x06", nDispMode, nEncryptMode, &ucPinLen, szPinBuf); else if(nMaxLen <= 8)//chenjs20060605 add ucRet = PubReadPinpad(hdlPinpad, 6, "\x00\x04\x05\x06\x07\x08", nDispMode, nEncryptMode, &ucPinLen, szPinBuf); else//chenjs20060605 add ucRet = PubReadPinpad(hdlPinpad, 10, "\x00\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c", nDispMode, nEncryptMode, &ucPinLen, szPinBuf); if (ucRet == EM_pin_ABOLISH || ucRet == EM_pin_CANCEL || ucRet == EM_TIMEOUT) { if ( iPinpadType == 1 ) // dfr add at 2006-04-11 { PubResetPinpad(hdlPinpad); // PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE"); // PubucDispPinpad(hdlPinpad, 2, "START PINPAD"); } EA_ucCloseDevice(&hdlPinpad); if(ucRet == EM_TIMEOUT)//chenjs20060712 add { return EXCEPTION; //chenjs20060712 add down } else { return CANCELED; } //chenjs20060712 add up } else if ( ucRet == EM_pin_NOPIN) { pcRetStr[0] = '\0'; *pucRetLen = 0; if ( iPinpadType == 1 ) // dfr add at 2006-04-11 { PubResetPinpad(hdlPinpad); // PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE"); // PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD"); } EA_ucCloseDevice(&hdlPinpad); return NORMAL; } else if (ucRet != EM_SUCCESS) { if ( iPinpadType == 1 ) // dfr add at 2006-04-11 { PubResetPinpad(hdlPinpad); // PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE"); // PubucDispPinpad(hdlPinpad, 2, "START PINPAD"); } PubDisplay(3, "密码键盘故障[%d]", ucRet); PubuiInkey(2); EA_ucCloseDevice(&hdlPinpad); return EXCEPTION; } break; } /* 组合一:密码明文返回 */ if (ucPinLen + 1 > *pucRetLen) { PubWriteLog(EXCEPTION, __FILE__, __LINE__); if ( iPinpadType == 1 ) // dfr add at 2006-04-11 { PubResetPinpad(hdlPinpad); // PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE"); // PubucDispPinpad(hdlPinpad, 2, "START PINPAD"); } EA_ucCloseDevice(&hdlPinpad); return EXCEPTION; } memcpy(pcRetStr, szPinBuf, ucPinLen); pcRetStr[ucPinLen] = 0; *pucRetLen = ucPinLen; if ( iPinpadType == 1 ) // dfr add at 2006-04-11 { PubResetPinpad(hdlPinpad); } EA_ucCloseDevice(&hdlPinpad); return NORMAL; }
/***************************************************************** 函数原型:Device_Handle_Init() 功能描述:设备所有句柄初始化 参数描述: 返回值: OK ? NOTOK 作 者: 刘及华 日 期: 2012-11-24 修改历史: 日期 修改人 修改描述 ------ --------- ------------- *****************************************************************/ INT8U Device_Handle_Init(void) { uchar ucRet; uint cap_sd; if (EA_ucOpenDevice("RFCARD", EM_mifs_TYPEA, &hMifsHandle) != EM_SUCCESS) { lcddisperr("读卡器初始化失败"); return notok; } if ( EA_ucOpenDevice("PRINT", EM_io_REALMODE, &hDprinterHandle) != EM_SUCCESS ) { lcddisperr("获得打印操作句柄失败!"); return notok; } if ( EA_ucOpenDevice("USBD", EM_io_REALMODE, &hUSBDHandle) != EM_SUCCESS ) { lcddisperr("获得打印操作句柄失败!"); return notok; } // if ( EA_ucOpenDevice("WLM", 0, &hWLMHandle) != EM_SUCCESS ) // { // lcddisperr("获得GPRS句柄失败!"); // return notok; // } ///////////////////////////////////////////////打印机设置参数 ucRet = EA_ucInitPrinter(hDprinterHandle); if ( ucRet != EM_SUCCESS ) { EA_vDisplay(2, "初始化打印机芯失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_XSPACE, 0); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印字符间距设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_YSPACE, 8); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印行距设置失败"); return notok; } // ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE, 578); ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE , 180); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印页长度设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_DOTTYPE, EM_prn_ASCIIDOT24X12); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印ASCII字符设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_PRNTYPE, EM_prn_ASCIIPRN1X1); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印ASCII字符大小失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_DOTTYPE, EM_prn_HZDOT24X24); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印汉字设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_PRNTYPE, EM_prn_HZPRN1X1); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印汉字大小设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PRNGRAY, 4); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印灰度设置失败"); return notok; } /////////////////////////////////////////////////////////////////////////////初始化时候只设置一次 if (EA_ucOpenDevice("SAM1CARD", 0, &hSam1Handle) != EM_SUCCESS) { lcddisperr("PSAM卡初始化失败"); return notok; } // if (EA_ucOpenDevice("USERCARD", 0, &hCpuHandle) != EM_SUCCESS) // { // lcddisperr("CPU卡初始化失败"); // return notok; // } // if (EA_ucICInitModule(hCpuHandle, EM_ic_VOLDEFAULT, EM_ic_TCRMODE) != EM_SUCCESS) // { // lcddisperr("设置CPU规范失败"); // return notok; // } ucRet = EA_ucOpenDevice("USBD", 0, &hRS232Handle); if ( ucRet != EM_SUCCESS ) { (void)EA_ucCloseDevice(&hRS232Handle); lcddisperr("COM口初始化失败!"); return notok; } ucRet = EA_ucInitRS232(hRS232Handle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS); if ( ucRet != EM_SUCCESS ) { (void)EA_ucCloseDevice(&hRS232Handle); lcddisperr("COM口设置失败!"); return notok; } //获取SD卡信息 ucRet = EA_ucGetDiskInfo(EM_DISK_SDCARD, &ptDiskInfo); if ( ucRet != EM_SUCCESS ) { lcddisperr("请插入SD卡!"); return notok; } cap_sd = ptDiskInfo.ullSize / 0x100000; EA_vDisplay(3, " SD卡可用容量%dM", cap_sd); SleepMs(2000); if(cap_sd < 1) { lcddisperr("请及时清理SD中数据!"); Beeperr(); } // // 分配空间来存储磁盘的分区列表 // ptPartList = EA_pvMalloc(ptDiskInfo.uiPartNum * sizeof(ptPartList)); // if (!ptPartList) // { // lcddisperr("分配SD卡缓存区失败!"); // return notok; // } // // 获取磁盘的分区列表 // ucRet = EA_ucGetPartList(EM_DISK_SDCARD, ptDiskInfo.uiPartNum, &uiRealPartNum, ptPartList); // if (ucRet != EM_SUCCESS) // { // EA_vFree(ptPartList); // lcddisperr("获取SD卡列表失败!"); // return notok; // } // // EA_vDisplay(1, "分区数目:%d", ptDiskInfo.uiPartNum); // SleepMs(3000); ucRet = EA_ucGetPartInfo(EM_DISK_SDCARD, 0, &ptPartInfo); if (ucRet != EM_SUCCESS) { lcddisperr("获取SD卡分区信息失败!"); return notok; } return ok; }
//chenjs20061127 add down for 应用切换 void close_all_dev(void) { DevHandle HandleNull; #ifdef EPT_A9L HandleNull = EM_INVALID_HANDLE; #else HandleNull = EM_NULL; #endif if(gbPrintHandle != HandleNull) EA_ucCloseDevice(&gbPrintHandle); if(gbhdlMagCard != HandleNull) EA_ucCloseDevice(&gbhdlMagCard); if(gbhdlUserCard != HandleNull) EA_ucCloseDevice(&gbhdlUserCard); if(gbhdlMasterCard != HandleNull) EA_ucCloseDevice(&gbhdlMasterCard); if(gbhdlSAM1Card != EM_NULL) EA_ucCloseDevice(&gbhdlSAM1Card); if(gbhdlSAM2Card != HandleNull) EA_ucCloseDevice(&gbhdlSAM2Card); if(gbhdlSAM3Card != HandleNull) EA_ucCloseDevice(&gbhdlSAM3Card); if(gbhdlSAM4Card != HandleNull) EA_ucCloseDevice(&gbhdlSAM4Card); if(gbMifCardHandle != HandleNull) EA_ucCloseDevice(&gbMifCardHandle); #ifdef EMVIC if(gbhdlPINPAD != HandleNull) EA_ucCloseDevice(&gbhdlPINPAD); if(gbhdlRS232 != HandleNull) { #ifdef EPT_A9L EA_ucCloseRfCardDevEI(&gbhdlRS232); #else EA_ucCloseDevice(&gbhdlRS232); #endif } if(gbMifCardHandle != HandleNull) EA_ucCloseDevice(&gbMifCardHandle); #endif }
int dlm_main(char *CMDBUF , int *nCmdLen) { char szGetBuffer[30],szTmpBuf[30]; char szBuffer[100]; // char cWaitRet; uint uiKey , uiRet,nRet; // uchar ucRetVal; // uchar ucFd; uchar ucRet; int nScreen = 0; char cMenuTime; // uint uiCount; uint uiOption; uint puiConfigInfo; // uchar i, ucIfExist, ucStatus; const char *pcModuleName = MODULE_FILE_NAME; // const char *pcCommModuleName = "applib"; DevHandle phPinpad; // DevHandle hVoiceHandle; #ifdef EPT_A9L // uint_64 llCnt = 0; // char szData[100]; #endif #ifdef EMVIC EA_EMV_vInit(); #endif //设备句柄清空 gbPrintHandle = EM_NULL; //清空所有全局设备句柄,add by zhuchentao 060831 gbhdlMagCard = EM_NULL;; //磁卡模块 gbhdlUserCard = EM_NULL; gbhdlMasterCard = EM_NULL; gbhdlSAM1Card = EM_NULL; gbhdlSAM2Card = EM_NULL; gbhdlSAM3Card = EM_NULL; gbhdlSAM4Card = EM_NULL; gbMifCardHandle = EM_NULL; #ifdef EMVIC gbhdlPINPAD = EM_NULL; gbhdlRS232 = EM_NULL; gbMifCardHandle = EM_NULL; #endif cRunState = 1; CommInfo.gbHdl = EM_NULL; memset(&iso, 0, sizeof(ISODataStru)); memset(&iso1, 0, sizeof(ISODataStru)); memset(&printiso, 0, sizeof(ISODataStru)); memset(&upiso, 0, sizeof(ISODataStru)); gbcECDefault = 0; #ifndef EPT_A9L #ifdef EPT_M3 if (EA_uiLoadAndExecuteModule("LibRFReader.dlm", "") != EM_SUCCESS) #endif #ifdef EPT56X0 if (EA_uiLoadAndExecuteModule("LibRFReader", "") != EM_SUCCESS) #endif { PubDisplay(3, "载入LibRFReader.dlm失败"); PubDisplay(4, "请下载LibRFReader.dlm文件"); PubuiInkey(0); return EXCEPTION; } #endif EA_vCls(); PubucLoadAllMfVar((char*)MODULE_FILE_NAME, &FV, sizeof(FV)); // #ifdef EPT56X0 // EA_ucSetStopFlag(EM_DISABLE_STOP); // #endif // #ifdef EPT_A9L // EA_ucSetStopFlag(EM_DISABLE_STOP); // #endif // 银商允许修改参数标志,提交程序的时候分别2种情况编译提交 // setup.c 中还有一个地方要设置,勿忘!!! #ifdef TMS cSetupModifyFlag = 0;// TMS服务器版 不允许修改参数 #else cSetupModifyFlag = 1;// 下载版 允许修改参数 #endif #ifndef EPT5610 EA_vSetLCDLightTimer(60); #endif EA_vCls(); if (PubucFirstRunPara(pcModuleName, "parafile") == EM_SUCCESS) { PubGetPinpadPara();// 先读取参数文件中密码键盘标签 FV.gbnParaFirstFlag = YES; WRITE_nVAR(FV.gbnParaFirstFlag); } PubUsePinpadInside(FV.Other.SetPinpadType); // PubUsePinpadInside(1); PubGetPrinterType(&iPrinterType); PubGetPinpadType(&iPinpadType); while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS) { PubGetPosType(); if (FV.gbnPosTypeFlag == YES) { FV.Other.SetPinpadType = 1; PubUsePinpadInside(1); WRITE_nVAR(FV.Other.SetPinpadType); } else { PubDisplayInv(2, "打开密码键盘错"); PubDisplay(3, "请接入密码键盘"); PubDisplay(4, "[%d][%02x][%d]", ucRet, ucRet,FV.gbnPosTypeFlag); EA_vBeepMs(50); uiRet = PubuiInkey(1); if (uiRet == EM_key_FUNC1) { PubSetUsePinpadType(); } if (uiRet == EM_key_FUNC9||EM_key_CANCEL) { return EM_ERROR; } } } while ((PubGetPinpadVer(phPinpad ,&iPinpadVer)) == 3) { PubDisplayInv(2, "请接好密码键盘"); EA_vBeepMs(50); PubuiInkey(1); } #ifndef EPT5610 //20070914 by wei 将安全级别设置成默认级别 if ( iPinpadVer == 2 ) { EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &puiConfigInfo); if ( puiConfigInfo != EM_pin_DEFAULTCONFIG) { EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG); } } #endif EA_ucCloseDevice(&phPinpad); nFirstSetupFlag = NO; if (PubucFirstRunProg(pcModuleName) == EM_SUCCESS) { FV.gbnFirstFlag = YES; WRITE_nVAR(FV.gbnFirstFlag); } // 注册headcommon /* if (PubLoadAndExecuteModule(pcCommModuleName, "F0506") != EM_SUCCESS) { EA_vCls(); PubDisplay(3, "装载公共模块失败!"); //因为PubDisplay是在applib中的,注册applib失败也就无法使用PubDisplay函数,只能用EA_vDisplay函数 PubuiInkey(0); return EXCEPTION; } */ // 导入def8583.h中的8583包定义 if (PubImport8583(YlIso8583Def) == EXCEPTION) { EA_vCls(); PubDisplay(3, "8583包导入出错"); PubDisplay(4, "请检查程序重新下装"); PubuiInkey(0); return EXCEPTION; } // 导入结束 PubGetMifsType(&iMifsType); //增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断 if (FV.gbnFirstFlag == YES) { PubGetPosType(); PubSetupFirst(); #ifdef EMVIC setup_first (); #endif WRITE_nVAR(FV); //这里把setupfirst里面的内容统一写入一次 nFirstSetupFlag = YES; FV.gbnFirstFlag = NO; WRITE_nVAR(FV.gbnFirstFlag); FV.gbnParaFirstFlag = YES; WRITE_nVAR(FV.gbnParaFirstFlag); if (FV.gbnParaFirstFlag == YES) { PubReadPara() ; } FV.gbnParaFirstFlag = NO; WRITE_nVAR(FV.gbnParaFirstFlag); } if (FV.gbnParaFirstFlag == YES) { PubReadPara(); } if (nFirstSetupFlag == YES) { PubInitGlobal(); PubSetup(10); nFirstSetupFlag = NO; } else { PubInitGlobal(); } #ifdef TMS //读取主控应用参数 ProReadBasePara(); #endif // by wei 每次进入应用不需要重新操作员签到 modify by baijz 20110723 BCTC要求每次开机操作员签到 BUFCLR(szGetBuffer); // VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); // if (szGetBuffer[0] == LOGON) // PubSetPoscfgcPosState(NO_LOGON); EA_vCls(); PubKeyOn(); #ifdef BZ /*标准版*/ PubDisplayInv( 1, "中国银联"); #endif #ifdef Largevalue /*大额支付*/ PubDisplayInv( 1, "中国银联-大额"); #endif #ifdef NMLS /*内蒙移动零售*/ PubDisplayInv( 1, "内蒙移动零售"); #endif #ifdef NMJF /*内蒙移动缴费*/ PubDisplayInv( 1, "内蒙移动缴费"); #endif PubDisplayCen(2, "CUP2.0"); PubDisplayCen(3, "自检..."); szGetCmdFlag = 0 ; szCMDChangeAppFlag = 0 ; //ucRet = EA_ucOpenDevice("PINPAD",EM_io_IPP, &phPinpad); while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS) { PubDisplayInv(2, "打开密码键盘错"); PubDisplay(3, "[%d][%02x]", ucRet, ucRet); EA_vBeepMs(50); PubuiInkey(1); } while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS) { PubDisplayInv(2, "请接好密码键盘"); PubDisplay(3, "[%d][%02x]", ucRet, ucRet); EA_vBeepMs(50); PubuiInkey(1); } // 为多应用,怕其他应用使用和银联相同的mackey workkey的ID号,这里重新load一次。 PubucSelectKey(phPinpad, EM_pin_MASTERKEY, FV.bank.nMKeyIndex); if(FV.Other.gbMacKeyLen) PubucLoadKey(phPinpad,EM_pin_DEFAULTMODE ,EM_pin_MACKEY, 0, FV.Other.gbMacKeyLen, FV.Other.gbszMacKey); if(FV.Other.gbWorkKeyLen) PubucLoadKey(phPinpad, EM_pin_DEFAULTMODE ,EM_pin_WORKKEY, 0, FV.Other.gbWorkKeyLen, FV.Other.gbszWorkKey); EA_ucCloseDevice(&phPinpad); if (PubuiInkeyMs(500) == EM_key_CANCEL) PubLogin(); PubGetMifsType(&iMifsType); //增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断 PubInitComm(&CommInfo, AUTOCHECK); BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcBatchState(szGetBuffer)); if (szGetBuffer[0] == YES) { EA_vCls(); PubDisplayInv(2, "请先结算再作交易"); PubuiInkey(1); } //打开MISPOS的通讯接口 #ifdef EPT_A9L ucRet = EA_ucOpenDevice(FV.Other.gbcMISPort,0, &gbhdCMDRS232); if (ucRet != EM_SUCCESS) { ucRet = EA_ucOpenDevice("COM3",0, &gbhdCMDRS232); if (ucRet == EM_SUCCESS) { memcpy(FV.Other.gbcMISPort,"COM3",4); WRITE_nVAR(FV.Other.gbcMISPort); } } if (ucRet != EM_SUCCESS) { EA_vCls(); PubDisplay(1,"请先设置COMPOS 端口"); EA_vBeepMs(1000); PubuiInkey(0); return ProFuncBankszComPos(); /*memcpy(FV.Other.gbcMISPort,"COM2",4); WRITE_nVAR(FV.Other.gbcMISPort); EA_vCls(); PubDisplay(1,"无法打开通信端口!"); PubDisplay(2,"请重启设备"); EA_vBeepMs(1000); PubuiInkey(2); return EXCEPTION;*/ } else { ucRet = EA_ucInitRS232(gbhdCMDRS232,FV.gbRSInfo.ucBps,EM_232_NOPAR ,EM_232_8DBS); //ucRet = EA_ucCloseDevice(&gbhdCMDRS232); //gbhdCMDRS232 = EM_NULL; } #endif if ( nCmdLen != NULL && CMDBUF != NULL) { CMDBUFLen = *nCmdLen; if (CMDBUFLen >0 ) { memset(szCMDBuffer , 0 , sizeof(szCMDBuffer)); memcpy(szCMDBuffer , CMDBUF , CMDBUFLen); memset(&TlvSendValue,0,sizeof(struct TLVVALUE)); CMDProcess(szCMDBuffer, (char*)&TlvSendValue, &gbctlvflag); szGetCmdFlag = 15; } } BUFCLR(szGetBuffer); BUFCLR(gbPosTags); gbTags = 0; gbnDisplayTime = 0; #ifdef EMVIC PubSetExeReader(1); #endif while (1) { PubDispIcon();//显示一下5650电池电量和信号 #ifdef TMS if (ProJudgeBaseDlaVer() == EM_SUCCESS) { ProGetBaseDialFix(); ucRet = PubReturnUpdate() ; if (ucRet != EM_ERROR) { PubDelAllBit(&iso); close_all_dev(); return ucRet; } if (PubCheckRunState() == EM_SUCCESS) { PubDelAllBit(&iso); close_all_dev(); return EM_ERROR; } } #endif memset(&gbTrkInfo, 0, sizeof(struct TrackInfo)); memset(&gbCardinfo, 0, sizeof(struct CardConfig)); // PubDisplay(4 , "%d %d %d %d",EM_VOC_LEVEL0,EM_VOC_LEVEL1,EM_VOC_LEVEL2,EM_VOC_LEVEL3); // PubuiInkey(60); // FV.Other.POSSTATFLAG = 6;//chenjs20060915 ls add for test TMS // EA_ucAudioSetVolume(FV.Other.ucNewVolume); // EA_ucAudioPlay("qing.wav"); // EA_ucAudioPlay("shuaka.wav"); #if 0 ucRet = EA_ucOpenDevice("EVOICE", 0, &hVoiceHandle); //打开外置语音设备 if(ucRet != EM_SUCCESS) { EA_vDisplays(2,1, "Test Open Err:%02x", ucRet); EA_uiInkey(0); return EM_ERROR; } else { EA_vDisplays(2,1, "Open OK"); EA_uiInkey(2); } ucRet = EA_ucIfVoiceExist(hVoiceHandle, &ucIfExist); if(ucRet != EM_SUCCESS) { EA_vDisplays(2,1, "Test IfExist Err:%02x", ucRet); EA_ucCloseDevice(&hVoiceHandle); EA_uiInkey(0); return EM_ERROR; } else { if(ucIfExist == 1) //If Exist { for(i = 0; i < 8; i++) { ucRet = EA_ucPlayVoice(hVoiceHandle, i); if(ucRet != EM_SUCCESS) { EA_vDisplays(2,1, "Test play%d Err:%02x",i, ucRet); EA_uiInkey(0); } else { EA_vDisplays(2,1, "Test play%d OK", i); } do { EA_ucGetPlayStatus(hVoiceHandle, &ucStatus); }while(ucStatus == EM_VOICE_PLAYING); } } else { EA_vDisplays(2,1, "No voice module exists"); EA_uiInkey(0); } EA_ucCloseDevice(&hVoiceHandle); } #endif #if 0 switch (FV.Other.POSSTATFLAG) { case 0: break; case 1: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求下载参数"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); if ( PubDownPara() == NORMAL) { ACK(4,"00"); } else { NAK_info(4,"XX","交易失败"); } continue; case 2: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求上传状态"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); if (PubUploadState() == NORMAL) { ACK(4,"00"); } else { NAK_info(4,"XX","交易失败"); } continue; case 3: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求重新签到"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); if (PubBankLogin() == NORMAL) { ACK(4,"00"); } else { NAK_info(4,"XX","交易失败"); } continue; #ifdef EMVIC case 4: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求公钥下载"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); //if(PubYlConnect(&CommInfo)!=NORMAL) // continue; if (PubQueryPubilcKey () == 1) { PubDownPubilcKey (); } ACK(4, "00"); //PubDialOff (&CommInfo); continue; case 5: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "系统要求更新参数"); PubDisplay(2, "请按确认键继续"); PubuiInkey(0); if(PubYlConnect(&CommInfo)!=NORMAL) continue; //add by baijz 20110906 下载过程断电,需要删除EMV参数文件,否则会重复下载 EA_ucPFDel (FEmvPara); EA_ucPFCreate (FEmvPara, (sizeof (struct EMVPARA))); //add end PubDownEmvPara (); PubDialOff (&CommInfo); continue; #endif #ifdef TMS case 6: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "要求下载TMS参数"); PubDisplay(2, "请按确认键继续"); PubuiInkey(60); TmsDownPara(); continue; #endif case 7: if (ProCheckPOSSTATFLAG()!= NORMAL) { break; } EA_vCls(); PubDisplay(1, "要求下载卡BIN黑名单"); PubDisplay(2, "请按确认键继续"); PubuiInkey(60); PubDownCardBin(); continue; //JP add default: break; } FV.Other.POSSTATFLAG = 0;//chenjs20070104 add防止不小心死循环 CheckPOSSTATFLAGTimes = 0; WRITE_nVAR(FV.Other.POSSTATFLAG); #endif EA_ucGetDateTime(&datetime); sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay); PubDialOff(&CommInfo); // 判断打印是否完成 PubJudePrintFinish(1); // 如果隔日了,就要求POS的操作员签到。 if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 )) PubSetPoscfgcPosState(NO_LOGON); BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); /* if (szGetBuffer[0] == NO_LOGON) { #ifdef TMS EA_vCls(); PubDisplayInv(1,"银联EMV应用"); PubDisplayCen(3,"按任意键签到"); PubDisplayCen(4,"按取消键切换应用"); uiRet = PubuiInkey(10); if (uiRet == EM_key_FUNC9|| uiRet == EM_key_CANCEL) { EA_vCls(); PubDisplayCen(2, "应用切换"); PubuiInkeyMs(500); PubDelAllBit(&iso); close_all_dev(); EA_vCls(); return EM_ERROR; } #endif if (PubLogin() != NORMAL) continue; } */ // 20060119 //for test dudj /* PubDisplay(3, "是否联机签到?"); if (PubuiInkey(2)!=EM_key_ENTER) sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf); PubDisplay(3, ""); */ // 测试的时候打开。发布的封掉 /*sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf); if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 )) { if (PubBankLogin() != NORMAL) { PubSetPoscfgcPosState(NO_LOGON); } else { EA_ucGetDateTime(&datetime); sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay); sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf); WRITE_nVAR(FV.Other.gbLoginDate); } continue; }*/ BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); if (szGetBuffer[0] == LOCK) { PubLock(); continue; } PubGetPoscfgcMenuTime(&cMenuTime); PubGetTermCapSet(); //add by chenjis 20130311 while (1) { if (szCMDChangeAppFlag == 2)//强制切换到应用2 { PubDelAllBit(&iso); close_all_dev(); return 2; } // PubSetExeReader(0); gbcECDefault = 0; PubDispIcon(); #ifdef TMS if (ProJudgeBaseDlaVer() == EM_SUCCESS) { // for 主控应用更新,添加一个新返回值2 ucRet = PubReturnUpdate() ; if (ucRet != EM_ERROR) { PubDelAllBit(&iso); close_all_dev(); return ucRet; } if (PubCheckRunState() == EM_SUCCESS) { PubDelAllBit(&iso); close_all_dev(); return EM_ERROR; } } #endif PubSetPoscfgcSettleEnd(1); /*设置结算未结束标志 */ EA_vCls(); nScreen = 0 ; //chenjs20060725 add down memset(&gbTrkInfo, 0, sizeof(struct TrackInfo)); memset(&gbCardinfo, 0, sizeof(struct CardConfig)); gbTrkInfo.cDoneFlag = 0; PubSetBankcMacChk(MAC_ECB); #ifdef EMVIC //ecash by wei gblTranAmt = 0l; BUFCLR(gbszTermData); gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes #endif strcpy(gbszErrCode, ""); while (1) { gbnComposFlag =1; gbnSettleFlag=0; if (szCMDChangeAppFlag == 2)//强制切换到应用2 { PubDelAllBit(&iso); close_all_dev(); return 2; } PubSetPoscfgcSettleEnd(1); /*设置结算未结束标志 */ //EA_vCls(); nScreen = 0 ; //chenjs20060725 add down memset(&gbTrkInfo, 0, sizeof(struct TrackInfo)); memset(&gbCardinfo, 0, sizeof(struct CardConfig)); gbTrkInfo.cDoneFlag = 0; if (CMDCONT.Type == CMD_NONE) // CMD_NONE表示无命令 { nRet = GetCMD(); if (szCMDChangeAppFlag == 15) { PubDelAllBit(&iso); close_all_dev(); EA_ucCloseDevice(&gbhdCMDRS232); memcpy(CMDBUF , szCMDBuffer , CMDBUFLen); CMDBUF[CMDBUFLen] = 0 ; *nCmdLen = CMDBUFLen; return 15; } if (nRet != NORMAL) { //PubDisdoter(); PubDispLogo(); if( EA_ucKBHit_ped() == EM_key_HIT ) { uiKey = PubuiInkeyMs(500); #ifdef BZ /*标准版*/ if (uiKey == ENTER) #endif #ifdef Largevalue /*大额支付*/ if (uiKey == ENTER) #endif #ifdef NMLS /*内蒙移动零售*/ if (uiKey == EM_key_F1) /*应内蒙银商要求F1进入查询菜单wujianyuan modify 20130712*/ #endif #ifdef NMJF /*内蒙移动缴费*/ if (uiKey == EM_key_F1) /*应内蒙银商要求F1进入查询菜单wujianyuan modify 20130712*/ #endif { EA_vCls(); PubDisplay(2, "请输入安全密码:"); BUFCLR(szGetBuffer); PubGetSAFEPWD(szGetBuffer, sizeof(szGetBuffer)); PubKeyOff(); BUFCLR(szBuffer); if (PubGetNStr(3, BIGFONT, szBuffer, 6) == NORMAL && memcmp(szGetBuffer, szBuffer, 6) == 0) { PubKeyOn(); EA_ucCloseDevice(&gbhdCMDRS232); gbhdCMDRS232 = EM_NULL; PubSetupNew(); EA_vCls(); } EA_vCls(); PubKeyOn(); } if(uiKey==EM_key_9) { if (PubuiInkey(1) == '5') if (PubuiInkey(1) == '9') { EA_vSystemManage(EM_RESET);//add by wujy 20111020 实现重启 } } if (uiKey == EM_key_FUNC9) //多应用切换 { EA_ucCloseDevice(&gbhdCMDRS232); gbhdCMDRS232 = EM_NULL; PubDelAllBit(&iso); close_all_dev(); EA_vCls(); return EM_SUCCESS; } if (uiKey == EM_key_FUNC) { gbnComposFlag =0; memset(&TlvSendValue,0,sizeof(struct TLVVALUE)); PubGetBankszTerminal(TlvSendValue.szTerminal, 8); PubGetBankszCust(TlvSendValue.szCust, 15); BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer)); if (szGetBuffer[0] == NO_LOGON) { if(PubLogin()!=NORMAL) { EA_vCls(); continue; } } BUFCLR(szGetBuffer); VERIFY_NORMAL(PubGetPoscfgcLoginState(szGetBuffer)); if (szGetBuffer[0] == NO_LOGON) { VERIFY_NORMAL(PubSetPoscfgcPosState(NO_LOGON)); if(PubBankLogin()== NORMAL) { VERIFY_NORMAL(PubSetPoscfgcPosState(LOGON)); VERIFY_NORMAL(PubSetPoscfgcLoginState(LOGON)); EA_ucGetDateTime(&datetime); BUFCLR(FV.Other.gbLoginDate); sprintf(FV.Other.gbLoginDate , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay); WRITE_nVAR(FV.Other.gbLoginDate); } else { PubDialOff (&CommInfo); EA_vCls(); continue; } } EA_vCls(); PubDisplay (1, "1.消 费 2.撤 销"); PubDisplay (2, "3.退 货 4.预授权"); PubDisplay (3, "5.离 线 6.打 印"); PubDisplay (4, "7.管 理 8.其 它"); uiKey = PubuiInkey((char) cMenuTime); if(uiKey>='1'&&uiKey<='8') uiOption=uiKey-'0'; else { EA_vCls(); continue; } PubUpYLDataOld(); PubProcessOld(uiOption); EA_vCls(); continue; } } continue; } } if (CMDCONT.Type != CMD_NONE) { break; } } if (PubProcess(CMDCONT.Type) != CMD_INTERRUPT) { ClearCMD(); } EA_vLCDLightOff(); } return EM_SUCCESS; } }
//chenjs20061127 add down for 应用切换 void close_all_dev(void) { if(gbPrintHandle != EM_NULL) EA_ucCloseDevice(&gbPrintHandle); if(gbhdlMagCard != EM_NULL) EA_ucCloseDevice(&gbhdlMagCard); if(gbhdlUserCard != EM_NULL) EA_ucCloseDevice(&gbhdlUserCard); if(gbhdlMasterCard != EM_NULL) EA_ucCloseDevice(&gbhdlMasterCard); if(gbhdlSAM1Card != EM_NULL) EA_ucCloseDevice(&gbhdlSAM1Card); if(gbhdlSAM2Card != EM_NULL) EA_ucCloseDevice(&gbhdlSAM2Card); if(gbhdlSAM3Card != EM_NULL) EA_ucCloseDevice(&gbhdlSAM3Card); if(gbhdlSAM4Card != EM_NULL) EA_ucCloseDevice(&gbhdlSAM4Card); if(gbMifCardHandle != EM_NULL) EA_ucCloseDevice(&gbMifCardHandle); #ifdef EMVIC if(gbhdlPINPAD != EM_NULL) EA_ucCloseDevice(&gbhdlPINPAD); if(gbhdlRS232 != EM_NULL) { #ifdef EPT_A9L EA_ucCloseRfCardDevEI(&gbhdlRS232); #else EA_ucCloseDevice(&gbhdlRS232); #endif } if(gbMifCardHandle != EM_NULL) EA_ucCloseDevice(&gbMifCardHandle); #endif }
int ProReadMobileNo(char *szMobileNo) { char szGetBuf[20]; char cRet; int nTmpLen = 0; DevHandle hdlPinpad; uchar ucRet; uint uiTimeOut = FV.Other.gbnSignTimeout; if (FV.Other.gbcIsEnterMbOnPinpad && iPinpadType == 1) { #ifdef EMVIC if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); //先关闭串口,然后下面打开串口 } #endif ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad); if (ucRet != EM_SUCCESS) { PubClearAll(); PubDisplay(2, "打开密码键盘口错"); PubuiInkey(3); EA_ucCloseDevice(&hdlPinpad); return (EXCEPTION); } EA_vCls(); PubDisplayCen(2, "请在键盘输入"); PubDisplayCen(3, "手机号码"); if ( iPinpadType == 1 ) // dfr add at 2006-04-11 { PubResetPinpad(hdlPinpad); PubucDispPinpad(hdlPinpad, 1, "Cellphone No:"); PubucDispPinpad(hdlPinpad, 2, ""); } if ( iPinpadVer == 2 ) EA_pci_ucSetPinTimer(hdlPinpad , EM_pin_KEYWAITTIME , uiTimeOut); BUFCLR(szGetBuf); ucRet = EA_pci_ucNonPinRead(hdlPinpad, 1, "\x0b",&nTmpLen,szGetBuf); if (ucRet != EM_SUCCESS) { PubResetPinpad(hdlPinpad); EA_ucCloseDevice(&hdlPinpad); return EXCEPTION; } PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE"); PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD"); EA_ucCloseDevice(&hdlPinpad); } else { EA_vCls(); PubDisplay(2, "请输入持卡人手机号码:"); while(1) { BUFCLR(szGetBuf); //cRet = PubGetNStr(3, 0, szGetBuf, 11); cRet = PubGetLimitNStr(3,BIGFONT,szGetBuf,0,11,uiTimeOut); nTmpLen = strlen(szGetBuf); if(cRet == NORMAL && nTmpLen == 11) { break; } else if(cRet == CANCELED) //此种情况要如何处理? { break; } else { PubDisplay(3, ""); PubDisplay(4, "位数不足,请重输:"); } } } if(nTmpLen == 11) { sprintf(szMobileNo, "%-11.11s", szGetBuf); return NORMAL; } return EXCEPTION; }
/* * 函数功能: 联机签到 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL--成功 * EXCEPTION--失败 */ int PubBankLogin(void) { int i; uchar szBatch[7], szBuffer[50], szBuf[20]; uchar szDateTimeBuf[3], szTmpBuffer[30], szWorkKey[25], szMacKey[25], szWorkKeyChk[5], szMacKeyChk[5]; struct FileRecStru LoginPos; int nSendLen, nLen , nWorkKeyLen=8,nMacKeyLen=8; ET_DATETIME DateTime; //#ifndef PRG_TST uchar szTmp1[20]; int nKeyIndex; DevHandle phPinpad; //#endif /*获得当前操作员号 */ LoginPos.cTransType = LOGIN; gbnTransType = LOGIN; PubGetBankcDesType(&cDesType); /*获得批次号 */ ASSERT_NORMAL(PubGetBankstateszBatchNum((char *)szBatch, sizeof(szBatch))); sprintf(LoginPos.szBatchNum, "%s", szBatch); /*设置mac方式 */ PubSetBankcMacChk(MAC_NO); /* 8583打包 */ ASSERT_NORMAL(PubPacketFix(&LoginPos)); BUFCLR(szTmpBuffer); //[06/15/2015 shizd]modify down /*** modified by gud 20060124 ***/ if (cDesType == 1) sprintf((char *)szTmpBuffer, "00%6.6s001", LoginPos.szBatchNum); else { sprintf((char*)szTmpBuffer, "00%6.6s003", LoginPos.szBatchNum); } /*** modified by gud 20060124 ***/ ASSERT_NORMAL(PubSetBit(&iso, 60, (char *)szTmpBuffer, 14)); // 终端设备信息 nLen = 0; i = 0; BUFCLR(szBuffer); if(EA_ucGetSerial(EM_SERIAL_MAIN_BOARD, (char*)szBuffer) == EM_SUCCESS) { i++; //公司标识 nLen = szBuffer[i]-0x30; i++; //产品类别长度 i+=nLen; //产品类别 nLen = szBuffer[i]-0x30; i++; //版本型号长度 i+=nLen; //版本型号 nLen = szBuffer[i]-0x30; i++; //序列号长度 BUFCLR(szBuf); if(nLen > 32) nLen = 32; memcpy(szBuf, szBuffer+i, nLen); } else { strcpy((char*)szBuf, "00000000"); nLen = 8; } BUFCLR(szTmpBuffer); PubGetPosYlCode((char*)szTmpBuffer); sprintf((char*)szBuffer, "Sequence No%02d%4.4s%s", nLen+4, szTmpBuffer, szBuf);//证书编号+序列号 ASSERT_NORMAL(PubSetBit(&iso, 62, (char*)szBuffer, strlen((char*)szBuffer))); //add end BUFCLR(szBuf); sprintf((char*)szBuf, "%2.2s ", FV.OPER.gbszOper); ASSERT_NORMAL(PubSetBit(&iso, 63, (char*)szBuf, 3)); //[06/15/2015 shizd]modify up /*iso到字符串 */ BUFCLR(gbszSendStr); nSendLen = sizeof(gbszSendStr); ASSERT_NORMAL(PubIsoToStr(gbszSendStr, &iso, &nSendLen)); gbnSendLen = nSendLen; /*发送数据 */ ASSERT_NORMAL(PubCommu(&CommInfo, gbszSendStr, gbnSendLen, gbszReadStr, &gbnReadLen, DIALOFF_YES)); /*接收返回 */ ASSERT_NORMAL(PubDispRetMsg(&LoginPos)); /*返回的密钥处理 */ //#ifndef PRG_TST /*模拟前置测试,不需下载密钥*/ BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit (&iso1, 60, (char *)szBuffer, &nLen)); if (nLen > 0) { BUFCLR (szTmp1); memcpy (szTmp1, szBuffer + 8, 3); if (cDesType == 1) { if (memcmp (szTmp1, "001", 3) != 0) { PubClearAll (); PubDisplay (3, "密钥算法有误"); PubuiInkey (30); return EXCEPTION; } } else if (cDesType == 0) { if (memcmp (szTmp1, "003", 3) != 0) { PubClearAll (); PubDisplay (3, "密钥算法有误"); PubuiInkey (30); return EXCEPTION; } } } BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, 62, (char *)szBuffer, &nLen)); if ((nLen != 24) && (cDesType == 1)) { PubDisplay(3, "下载参数密钥失败"); PubDisplayCen (4, "使用单DES"); PubuiInkey(30); return EXCEPTION; }else if ((nLen != 40) && (cDesType == 0)) { PubDisplay(3, "下载参数密钥失败"); PubDisplayCen (4, "使用 3DES"); PubuiInkey(30); return EXCEPTION; } /*选择主密钥 */ ASSERT_NORMAL(PubGetBanknMKeyIndex(&nKeyIndex)); if (PubOpenDevice("PINPAD", EM_io_EPP, &phPinpad) != EM_SUCCESS) { EA_vCls(); PubDisplay(2, "无法打开密码键盘"); PubDisplay(3, "按任意键返回"); PubuiInkey(3); return EXCEPTION; } ASSERT_NORMAL(PubSelectKey(phPinpad, EM_pin_MASTERKEY, nKeyIndex)); if (cDesType == 1) { memset(szWorkKey, 0, sizeof(szWorkKey)); memset(szMacKey, 0, sizeof(szMacKey)); memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk)); memset(szMacKeyChk, 0, sizeof(szMacKeyChk)); memcpy(szWorkKey, szBuffer, 8); memcpy(szWorkKeyChk, szBuffer + 8, 4); memcpy(szMacKey, szBuffer + 12, 8); memcpy(szMacKeyChk, szBuffer + 20, 4); nWorkKeyLen = 8 ; nMacKeyLen = 8 ; } else if ( cDesType == 0) { memset(szWorkKey, 0, sizeof(szWorkKey)); memset(szMacKey, 0, sizeof(szMacKey)); memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk)); memset(szMacKeyChk, 0, sizeof(szMacKeyChk)); memcpy(szWorkKey, szBuffer, 16); memcpy(szWorkKeyChk, szBuffer + 16, 4); memcpy(szMacKey, szBuffer + 20, 8); // mackey 银联预留了16位,目前只用了8位 memcpy(szMacKeyChk, szBuffer + 36, 4); nWorkKeyLen = 16 ; nMacKeyLen = 8 ; } /*判断密钥是否正确 */ ASSERT_NORMAL(PubLoadKey(phPinpad, EM_pin_WORKKEY, FV.Other.gbMacWorkKeyIndex, nWorkKeyLen, szWorkKey)); ASSERT_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex, nWorkKeyLen, szWorkKey)); ASSERT_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex)); BUFCLR(szTmpBuffer); memset(szTmp1, 0, sizeof(szTmp1)); ASSERT_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer)); if (memcmp(szTmpBuffer, szWorkKeyChk, 4)) { PubClearAll(); PubDisplay(3, "校验workkey错"); PubuiInkey(10); EA_ucCloseDevice(&phPinpad); return EXCEPTION; } ASSERT_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex, nMacKeyLen, szMacKey)); ASSERT_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex)); BUFCLR(szTmpBuffer); memset(szTmp1, 0, sizeof(szTmp1)); ASSERT_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer)); if (memcmp(szTmpBuffer, szMacKeyChk, 4)) { PubClearAll(); PubDisplay(3, "校验mackey错"); PubuiInkey(10); EA_ucCloseDevice(&phPinpad); return EXCEPTION; } EA_ucCloseDevice(&phPinpad); BUFCLR(FV.Other.gbszWorkKey); BUFCLR(FV.Other.gbszMacKey); memcpy(FV.Other.gbszWorkKey, szWorkKey, nWorkKeyLen); FV.Other.gbWorkKeyLen = nWorkKeyLen; WRITE_nVAR(FV.Other.gbszWorkKey); WRITE_nVAR(FV.Other.gbWorkKeyLen); memcpy(FV.Other.gbszMacKey, szMacKey , nMacKeyLen); WRITE_nVAR(FV.Other.gbszMacKey); WRITE_nVAR(FV.Other.gbMacKeyLen); /* * 设置批次号 */ BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, 60, (char *)szBuffer, &nLen); if (nLen > 0) { BUFCLR(szTmpBuffer); memcpy(szTmpBuffer, szBuffer + 2, 6); // 测试, 不从主机返回批次号来判断。 PubSetBankstateszBatchNum((char *)szTmpBuffer); } EA_ucGetDateTime(&DateTime); BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_DATE, (char *)szBuffer, &nLen); if (nLen > 0) { BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer, 2); DateTime.ucMonth = atoi((char *)szDateTimeBuf); BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer + 2, 2); DateTime.ucDay = atoi((char *)szDateTimeBuf); EA_ucSetDateTime(&DateTime, EM_SYSTEM_DATE); } BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_TIME, (char *)szBuffer, &nLen); if (nLen > 0) { BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer, 2); DateTime.ucHour = atoi((char *)szDateTimeBuf); BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer + 2, 2); DateTime.ucMinute = atoi((char *)szDateTimeBuf); BUFCLR(szDateTimeBuf); memcpy(szDateTimeBuf, szBuffer + 4, 2); DateTime.ucSecond = atoi((char *)szDateTimeBuf); EA_ucSetDateTime(&DateTime, EM_SYSTEM_TIME); } //BCTST strcpy(FV.OPER.gbszLoginOper, FV.OPER.gbszOper); //已向主机签到的操作员不能删除 // return NORMAL; }
/************************************** *功能: 基于EMV整个流程交易结果显示 *注意: 卡片批准后显示查询余额 *参数意义: * pos.transresult:0x00--交易批准 * 0x01--交易拒绝 ***************************************/ void PubEMVResult(struct FileRecStru *TmpPos) { char szBuffer[50]; char szRetAmt[15]; unsigned char ucRet; int i, nLen; DevHandle hdlPinpad; char szBuf[50];//chenjs20070125 add struct FileRecStru errrec; i = 0; while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2)) i ++; PubClearAll(); if (err_mess [ i ][ 0 ] == '\0') /* Unknow Error*/ sprintf(szBuffer, "交易失败[%2.2s]",gbszErrCode); else strcpy(szBuffer, err_mess[i]); /*Defined Error*/ if (memcmp(gbszErrCode, "00", 2)&&TmpPos->transresult == 0x00 ) { if (gbnTransType != LOGIN && gbnTransType !=LOGOUT) { if (strlen(szBuffer) > 20) { //chenjs20060712 del PubDisplayCen(2, "交易失败"); PubDisplay(2, "%20.20s", szBuffer);//chenjs20060712 3->2 PubDisplayCen(3, szBuffer + 20);//chenjs20060712 4->3 } else { PubDisplayCen(2, "交易失败"); if (gbszErrCode[0] != '\0') PubDisplayCen(3, szBuffer); } PubuiInkey(60); //modify by chenjis 20140108 BCTC } } if (!memcmp(gbszErrCode, "00", 2) && TmpPos->transresult == 0x01) { /*del by baijz 20111207 BCTC要求 BUFCLR(szBuf); PubHexToAsc(szBuf,TmpPos->tvr,10,0); PubDisplays(1,1,"95:%s",szBuf); PubDisplays(2,1, "9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]); strcpy (szBuffer, "交易拒绝"); PubDisplayCen(3, szBuffer); PubDisplayCen(4, "请拔卡"); PubuiInkey(5); */ //add by baijz 20111207 memset((char *) &errrec, 0, sizeof(struct FileRecStru)); errrec = *TmpPos; memcpy(errrec.tTAC_Denial,TermInitData.tTAC_Denial, 5); memcpy(errrec.tTAC_Online,TermInitData.tTAC_Online, 5); memcpy(errrec.tTAC_Default,TermInitData.tTAC_Default, 5); EMV_ErrDisplay(&errrec); //add end EA_vCls(); //add by chenjis 20130304 for BCTC if(TmpPos->cTransType == PURCHASE || TmpPos->cTransType == PRE_AUTH) { PubClearAll(); PubDisplayCen(3,"请联系发卡行!"); PubuiInkey(5); } //end chenjis 20130304 } //add by wei bctc debug 拒绝交易也显示tvr if ((strlen(gbszErrCode)==0) && TmpPos->transresult == 0x01) { /* BUFCLR(szBuf); PubHexToAsc(szBuf,TmpPos->tvr,10,0); PubDisplays(1,1,"95:%s",szBuf); PubDisplays(2,1, "TSI9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]); strcpy (szBuffer, "交易拒绝"); PubDisplayCen(3, szBuffer); PubDisplayCen(4, "请拔卡"); PubuiInkey(5); */ //add by baijz 20111207 memset((char *) &errrec, 0, sizeof(struct FileRecStru)); errrec = *TmpPos; memcpy(errrec.tTAC_Denial,TermInitData.tTAC_Denial, 5); memcpy(errrec.tTAC_Online,TermInitData.tTAC_Online, 5); memcpy(errrec.tTAC_Default,TermInitData.tTAC_Default, 5); EMV_ErrDisplay(&errrec); //add end EA_vCls(); } if (memcmp(gbszErrCode, "00", 2)&&(strlen(gbszErrCode)>0))//bctc add by wei { //chenjs20070125 add down 解决研发测试组提的显示不完整 if (strlen(szBuffer) > 20) { BUFCLR(szBuf); memcpy(szBuf, szBuffer, 20); PubDisplayCen(2, szBuf); PubDisplayCen(3, szBuffer + 20); } else PubDisplayCen(2, szBuffer); if(gnCardType != MIF_CARD) //add by baijz 20120326 检测中心要求 { PubDisplayCen(4, "请拔卡"); //change by wei bctc } else { PubDisplayCen(4, "请移卡"); } //PubuiInkey(3); PubuiInkey(60); //modify by chenjis 20140108 BCTC } //chenjs20070125 add up if (!memcmp(gbszErrCode, "00", 2) && (gbnTransType == INQUERY || gbnTransType == YLJF_INQUERY || gbnTransType == CDT_OPEN || gbnTransType == CDT_QUERY) && TmpPos->transresult == 0x00) { nLen = sizeof(szBuffer); PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen); if (nLen == 0) { PubClearAll(); PubDisplayInv(2, "未返回余额"); EA_vBeepMs(1000); PubuiInkey(10); return; } memcpy(szRetAmt, szBuffer + 7, 13); szRetAmt[13] = '\0'; if (szRetAmt[0] == 'C') szRetAmt [ 0 ] = ' '; else szRetAmt [ 0 ] = '-'; i = 1; while (1) { if (i == 13)//chenjs20061115 12->13 break; if (szRetAmt[i] !='0' && szRetAmt[i] != ' ') break; //chenjs20061115研发测试if (szRetAmt[i] == '0') if (szRetAmt[i] == '0' && i < 10) //chenjs20061115 add szRetAmt[i] = ' '; //chenjs20061115 add down if( i >= 10 && szRetAmt[i] == ' ') szRetAmt[i] = '0'; //chenjs20061115 add up i ++; } if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); } ucRet = PubOpenDevice((char*)"PINPAD", EM_io_EPP, &hdlPinpad); if (ucRet != EM_io_SUCCESS) { //PubuiInkey(3); PubClearAll(); if (ucRet == EM_io_OPENED) PubDisplay(2, "密码键盘已经打开"); else { PubDisplay(2, "无法打开密码键盘"); PubuiInkey(3); return ; } PubuiInkey(3); } sprintf(szBuffer, "%11.11s.%2.2s", szRetAmt, szRetAmt + 11); if ( iPinpadType == 1 ) //外置PINPAD { EA_vCls(); PubDisplayCen (2, "查询成功"); PubDisplayCen (3, "请查看密码键盘"); if(gnCardType != MIF_CARD) //add by baijz 20120326 检测中心要求 { PubDisplayCen(4, "并拔卡"); } else { PubDisplayCen(4, "并移卡"); } PubucDispPinpad(hdlPinpad, 1, (char*)"Balance:"); PubucDispPinpad(hdlPinpad, 2, szBuffer); } else { PubDisplay(3, "余额:%s元", szBuffer); sprintf(szBuf , " %14.14s" , szBuffer); EA_vCls(); PubDisplayCen (1, "查询成功"); PubDisplay (2, "可用余额:"); PubDisplay(3, "%s", szBuf); if(gnCardType != MIF_CARD) //add by baijz 20120326 检测中心要求 { PubDisplayCen(4, "请拔卡"); //change by wei bctc } else { PubDisplayCen(4, "请移卡"); } } while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS); PubuiInkey (FV.EmvStru.gbcQueryResultDispDelay); //add by baijz 20120524 RemoveIccTimeOut(10); if ( iPinpadType == 1 ) //外置PINPAD { if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); } ucRet = PubOpenDevice((char*)"PINPAD", EM_io_EPP, &hdlPinpad); PubClearAll(); PubucDispPinpad(hdlPinpad, 1, (char*)"WELCOME TO USE "); PubucDispPinpad(hdlPinpad, 2, (char*)" LANDI PINPAD"); while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS); } } EA_vCls(); return; }