uchar EI_ucSendTermMsg(TMS_AppScript * ptTMSHead, ET_TermProgMsg **pptPkgInfoRet, uint *puiPkgSizeRet) { ET_TermProgMsg *ptPkgInfo = NULL; uint uiTermProgSize=0; uchar ucRet; uchar *pFileInfo = NULL; void *tempbuf = NULL; /*生成终端信息包*/ EA_face_vSetInfo("获取终端现有程序包..."); EA_TMS_vLog("\r\n获取终端现有程序包..."); /*获取终端信息*/ ucRet = EA_ucTMSGetTermInfo(sizeof(ET_PACK_HEAD), &tempbuf,&uiTermProgSize); if (EM_SUCCESS != ucRet) { EA_face_vSetInfo("获取终端信息包错误"); EA_vBeepMs(500); EA_TMS_vLog("EI_ucMakeTermMsg:Get Term Info Fail[%d]\r\n", ucRet); return ucRet; } ptPkgInfo = tempbuf; pFileInfo = ptPkgInfo->pFilesInfo; #ifdef PLAT_M3 //M3不需要发送终端信息包 *pptPkgInfoRet = ptPkgInfo; *puiPkgSizeRet = uiTermProgSize+sizeof(ET_PACK_HEAD); return EM_SUCCESS; #else ET_TermMsg tTermMsg; char cBuffer[50]; memset(&tTermMsg, 0x00, sizeof(ET_TermMsg)); memcpy(tTermMsg.tPackhead.acProCtrl, EM_CTRL_TERM_MSG, strlen(EM_CTRL_TERM_MSG)); tTermMsg.tPackhead.cAck = EM_HOST_ACK; tTermMsg.uiTermProgSize = uiTermProgSize; //终端现有程序包的长度 EA_ucGetSerial(EM_SERIAL_MAIN_BOARD, cBuffer); memcpy(tTermMsg.aucSerial, cBuffer, sizeof(tTermMsg.aucSerial)); strncpy(tTermMsg.acType, EM_APP_PLATTYPE, strlen(EM_APP_PLATTYPE)); EG_ucStepFlag =TMS_STEP_TERM_MSG; /* 发送终端信息包*/ EA_face_vSetInfo("发送终端信息包..."); EA_TMS_vLog("发送终端信息包..."); ucRet = EI_ucSendPacket(sizeof(ET_TermMsg), &tTermMsg, EG_uiFrameLen); if(EM_SUCCESS != ucRet) { EA_TMS_vLog("EI_ucSendTermMsg:send term Msg fail[%d]\r\n", ucRet); return EM_ERROR; } *pptPkgInfoRet = ptPkgInfo; *puiPkgSizeRet = uiTermProgSize+sizeof(ET_PACK_HEAD); EA_TMS_vLog("\r\n# Term ProgMessage:0x%x, size:%d+%d", (long)ptPkgInfo, tTermMsg.uiTermProgSize, sizeof(ET_PACK_HEAD)); return ucRet; #endif }
uchar TA_BT_ucSetBTPINCodeMode(uchar ucMode) { uchar ucRet = 0, ucCmd = 0, ucData = 0; if (0x00 == ucMode) // SPP 无需PIN配对 { ucCmd = EM_BT_PARE_MODE; ucData = EM_BT_PARE_SSP_JUST; } else { ucCmd = EM_BT_PARE_MODE; ucData = EM_BT_PARE_FIXED; } ucRet = EA_ucSetBTParamConfig(ucCmd, &ucData); if (EM_SUCCESS != ucRet) { ucCmd = 20; EA_vCls(); TA_vDisplayLine(DISP_LINE_M1, DISP_POS_MID, "设置蓝牙配对模式错%02X", ucRet); while (ucCmd--) { EA_vLCDLightOff(); EA_vDelayMs(500); EA_vLCDLightOn(); EA_vDelayMs(500); EA_vBeepMs(500); TA_vDisplayLine(DISP_LINE_M2, DISP_POS_MID, "请联系厂商客服!"); EA_uiInkey(3); } EA_uiInkey(30); EA_vSystemManage(EM_SHUTDOWN); } return ucRet; }
/* * 函数功能:检查返回的报文是否串包 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubCheckPack(struct FileRecStru *pos) { char szGetBuffer[30]; char szRetTerminal[9], szRetCustom[16], szRetTrace[7]; char szRetAmt[15], szAmt[15], szRetProcCode[7]; int nLen; int i; // 这里不写内存文件了。减少写次数 默认冲正码 // FV.Void.gbnVoidReason = OTHER; // WRITE_nVAR(FV.Void.gbnVoidReason); BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubDelAllBit(&iso1)); //ASSERT_NORMAL(PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, NULL)); if (PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, &i) != NORMAL) { PubDisplay(4, "通讯转换错!"); PubDisplay(3, "i=%d", i); PubuiInkey(5); return EXCEPTION; } nLen = sizeof(szRetTerminal); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetTerminal, szGetBuffer) != 0) { PubDisplayInv(2, "返回终端号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } nLen = sizeof(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, CUSTOM_ID, szRetCustom, &nLen)); ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetCustom, szGetBuffer) != 0) { PubDisplayInv(2, "返回商户号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } BUFCLR(szRetTrace); nLen = sizeof(szRetTrace); PubGetBit(&iso1, TRACE, szRetTrace, &nLen); if (nLen > 0) { if ((strcmp(szRetTrace, pos->szTrace) != 0) && pos->cTransType != LOGIN) { PubDisplayInv(2, "返回流水号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetProcCode); nLen = sizeof(szRetProcCode); PubGetBit(&iso1, PROC_CODE, szRetProcCode, &nLen); if (nLen > 0) { if (strcmp(szRetProcCode, pos->szProcCode) != 0) { PubDisplayInv(2, "返回处理码错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szGetBuffer); BUFCLR(gbszErrCode); nLen = sizeof(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szGetBuffer, &nLen)); memcpy(gbszErrCode, szGetBuffer, 2); //BCTST nLen = sizeof(szGetBuffer); PubGetBit(&iso1, 49, szGetBuffer, &nLen); if (nLen == 3) { if (strcmp(szGetBuffer, "156") != 0) { PubDisplayInv(2, "货币代码不一致!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetAmt); nLen = sizeof(szRetAmt); PubGetBit(&iso1, AMOUNT, szRetAmt, &nLen); // 2009-7-27 10部分承兑处理 if (memcmp(gbszErrCode, "10", 2) == 0 && (gbnTransType == PURCHASE || gbnTransType == YLJF_PURCHASE)) { BUFCLR(szAmt); nLen = sizeof(szAmt); PubGetBit(&iso, AMOUNT, szAmt, &nLen); strcpy(gbszErrCode, "00"); strcpy(pos->szReturnCode, "10"); PubStrDec(szAmt, szRetAmt, pos->szUnpaidAmount); //自付金额 modify by baijz 20120220 szJFPayAmount->szUnpaidAmount sprintf(pos->szAmount, "%012ld", atol(szRetAmt)); } if (nLen > 0) { if (atol(szRetAmt) != atol(pos->szAmount)) { PubDisplayInv(2, "返回金额错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } // 这里不写内存文件了。减少写次数 默认冲正码 // FV.Void.gbnVoidReason = NORMAL; // WRITE_nVAR(FV.Void.gbnVoidReason); // return NORMAL; }
int TmsDownPara(void) { char szBuffer[500],szGetBuf[30],szBuffer1[30]; int nLen,nFlag,nRetLen; int i; char *pTmp; struct BASE_FILE BaseRec; uint uiRecBeginID , unfd , unRec_num; uchar ucRet; memset(szBuffer,0,sizeof(szBuffer)); memset(szGetBuf,0,sizeof(szGetBuf)); memset(szBuffer1,0,sizeof(szBuffer1)); gbnTransType = TMSMANA;//tms下载 PubSetBankcMacChk(MAC_NO); PubClearAll(); PubDelAllBit(&iso); PubSetBitYL(&iso, MSG_ID, "0800", 4); BUFCLR(szGetBuf); nLen = sizeof(szGetBuf); PubGetBankszTerminal(szGetBuf, nLen); PubSetBitYL(&iso, POS_ID, szGetBuf, 8); BUFCLR(szGetBuf); PubGetBankszCust(szGetBuf, nLen); PubSetBitYL(&iso, CUSTOM_ID, szGetBuf, 15); BUFCLR(szGetBuf); PubGetBankstateszBatchNum(szGetBuf, nLen); BUFCLR(szBuffer); sprintf(szBuffer, "00%6.6s364", szGetBuf); PubSetBitYL(&iso, 60, szBuffer, 11); nLen = sizeof(gbszSendStr); ASSERT_NORMAL(PubIsoToStr(gbszSendStr, &iso, &nLen)); gbnSendLen = nLen; ASSURE_NORMAL(PubYlConnect(&CommInfo)); PubSetPoscfgcPreState(1); EA_vCls(); PubDisplayInv(1, "管理系统"); PubDisplay(2, "已联通参数中心"); PubDisplay(3, "正在参数传递"); //chenjs20061231 ASSERT_NORMAL(PubCommu(&CommInfo, gbszSendStr, gbnSendLen, gbszReadStr, &gbnReadLen, DIALOFF_YES)); ASSERT_NORMAL(PubCommu(&CommInfo, gbszSendStr, gbnSendLen, gbszReadStr, &gbnReadLen, DIALOFF_NO));//chenjs20061231 add PubDelAllBit(&iso1); if (PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, &i) != NORMAL) { PubDisplay(4, "通讯转换错!"); PubDisplay(3, "i=%d", i); PubuiInkey(5); return EXCEPTION; } nLen = sizeof(szBuffer); PubGetBit(&iso1, RET_CODE, szBuffer, &nLen); if (memcmp(szBuffer, "00", 2)) { PubDialOff(&CommInfo); PubDisplay(2, "下载TMS参数失败!"); PubuiInkey(2); return EXCEPTION; } nLen = sizeof(szBuffer); PubGetBit(&iso1, POS_ID, szBuffer, &nLen); PubGetBankszTerminal(szGetBuf, sizeof(szGetBuf)); if (memcmp(szBuffer, szGetBuf, 8)) { PubDialOff(&CommInfo); PubDisplay(2, "返回终端号不符!"); PubuiInkey(2); return EXCEPTION; } nLen = sizeof(szBuffer); PubGetBit(&iso1, CUSTOM_ID, szBuffer, &nLen); PubGetBankszCust(szGetBuf, sizeof(szGetBuf)); if (memcmp(szBuffer, szGetBuf, 15)) { PubDialOff(&CommInfo); PubDisplay(2, "返回商户号不符!"); PubuiInkey(2); return EXCEPTION; } nLen = sizeof(szBuffer); ASSURE_NORMAL(PubGetBit(&iso1, 62, szBuffer, &nLen)); if (nLen < 292)// 银商TMS格式,内容必须要292个。 { PubDialOff(&CommInfo);//chenjs20061231add EA_vCls(); PubDisplay(2, "下载TMS参数失败!"); PubDisplay(3, "TMS参数太短(%d)" , nLen); PubuiInkey(5); return EXCEPTION; } BUFCLR(szDateBegin); BUFCLR(szDateEnd); nRetLen = 0; pTmp = szBuffer; while (1) { BUFCLR(szBuffer1); memcpy(szBuffer1, pTmp, 2); pTmp += 2; nLen -= 2; nFlag = atoi(szBuffer1); if (ProGetPara(nFlag, &nRetLen, pTmp) == EXCEPTION) { EA_vCls(); PubDisplay(2 , "有无法识别的标签"); PubDisplay(3 , "[%d]" , nFlag); PubuiInkey(10); break; } pTmp += nRetLen; nLen -= nRetLen; if (nLen <= 0) break; } if (!memcmp(ucDownTransType , "7001" , 4))// 银商认为只有7001才发起银商tms { ucRet = EA_ucEfsOpen("BaseFile01", &unfd); if ( ucRet != EM_SUCCESS ) { PubClearAll(); PubDisplay( 2 , "打开主控应用文件错%d", ucRet ) ; EA_vBeepMs( 100 ) ; PubuiInkey( 30 ) ; return EXCEPTION; } uiRecBeginID = 1; while(1) { memset ( (char *)&BaseRec , 0 , sizeof(struct BASE_FILE)); ucRet = EA_ucEfsRead(unfd ,uiRecBeginID , 1 , (char *)&BaseRec , &unRec_num); if ( ucRet != EM_SUCCESS || (uiRecBeginID >20)) { EA_ucEfsClose(unfd); PubDisplay(2 , "找不到POSP报道记录"); PubDisplay(3 , "主控应用版本不对"); PubDisplay(4 , "请更新主控应用版本"); PubuiInkey(60); return EXCEPTION; } if ( !memcmp(BaseRec.Prog_Id , "PospTask" , 8)) { break; } uiRecBeginID ++ ; } memcpy(BaseRec.Prog_OnlineOperTask,szDateBegin , 14); memcpy(BaseRec.Prog_UpdateFlag,szDateEnd , 14); // strcpy(BaseRec.Prog_Name ,szReConnectTime ); // BaseRec.Prog_Name[10] = szResendTimes; ucRet = EA_ucEfsModify(unfd , uiRecBeginID ,(char *)&BaseRec ); if (ucRet != EM_SUCCESS) { PubClearAll(); PubDisplay( 2 , "更新主控报道文件%d", ucRet ) ; EA_vBeepMs( 100 ) ; PubuiInkey( 10 ) ; EA_ucEfsClose(unfd); return EXCEPTION; } EA_ucEfsClose(unfd); PubDisplay(2, "TMS参数传递成功"); PubDisplay(3 , "开始时间%s" ,szDateBegin ); PubDisplay(4 , "截止时间%s" ,szDateEnd ); PubuiInkey(2); } ProTmsDownParaEnd(3); PubDialOff(&CommInfo);//chenjs20061231add PubClearAll(); //add by baijz 20110718 BCTC检测要求,参数下载成功,清除标志 if(FV.Other.POSSTATFLAG == 6) { FV.Other.POSSTATFLAG = 0; WRITE_nVAR(FV.Other.POSSTATFLAG); } //add end return NORMAL; }
/* * 函数功能:检查返回的报文是否串包 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int ProCheckUploadPack(struct FileRecStru *pos) { char szGetBuffer[30]; char szRetTerminal[9], szRetCustom[16], szRetTrace[7]; char szRetAmt[15], szRetProcCode[7]; int nLen; int i; BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szGetBuffer); BUFCLR(szErrCode); strcpy(szErrCode, " "); ASSERT_NORMAL(PubDelAllBit(&iso1)); if (PubStrToIso(szReadStr + 5, nReadLen - 5, &iso1, &i) != NORMAL) { PubDisplay(4, "通讯转换错!"); PubDisplay(3, "i=%d", i); PubuiInkey(5); return EXCEPTION; } nLen = sizeof(szRetTerminal); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); BUFCLR(szGetBuffer); if(FV.gbcGetTermType==0) memcpy(szGetBuffer,TlvSendValue.szTerminal,8); else ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer, 8)); if (strcmp(szRetTerminal, szGetBuffer) != 0) { PubDisplayInv(2, "返回终端号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } nLen = sizeof(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, CUSTOM_ID, szRetCustom, &nLen)); if(FV.gbcGetTermType==0) memcpy(szGetBuffer,TlvSendValue.szCust,15); else ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, 15)); if (strcmp(szRetCustom, szGetBuffer) != 0) { PubDisplayInv(2, "返回商户号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } BUFCLR(szRetTrace); nLen = sizeof(szRetTrace); PubGetBit(&iso1, TRACE, szRetTrace, &nLen); if (nLen > 0) { if ((strcmp(szRetTrace, pos->szTrace) != 0) && pos->cTransType != LOGIN) { PubDisplayInv(2, "返回流水号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetProcCode); nLen = sizeof(szRetProcCode); PubGetBit(&iso1, PROC_CODE, szRetProcCode, &nLen); if (nLen > 0) { if (strcmp(szRetProcCode, pos->szProcCode) != 0) { PubDisplayInv(2, "返回处理码错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetAmt); nLen = sizeof(szRetAmt); PubGetBit(&iso1, AMOUNT, szRetAmt, &nLen); if (nLen > 0) { if (atol(szRetAmt) != atol(pos->szAmount)) { PubDisplayInv(2, "返回金额错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szGetBuffer); nLen = sizeof(szGetBuffer); PubGetBit(&iso1, 49, szGetBuffer, &nLen); if (nLen == 3) { if (strcmp(szGetBuffer, "156") != 0) { PubDisplayInv(2, "货币代码不一致!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szGetBuffer); nLen = sizeof(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szGetBuffer, &nLen)); memcpy(szErrCode, szGetBuffer, 2); return NORMAL; }
/* * 函数功能:冲正交易处理 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL--成功 * 非NORMAL--失败 */ int PubAutoVoid(void) { char szBuffer[100]; char szDispInfo[100], cSign; int nLen; ISODataStru isotmp; AUTOVOID_BEGIN: PubDelAllBit(&isotmp); if (FV.AutoVoid.cAutoVoidFlag != 1 || !memcmp(FV.AutoVoid.gbszVoidStr, "\x00\x00\x00\x00\x00\x00\x00\x00", 8)) { return NORMAL; } PubStrToIso(FV.AutoVoid.gbszVoidStr, FV.AutoVoid.gbnVoidLen, &isotmp, NULL); nLen = sizeof(szBuffer); BUFCLR(szBuffer); PubGetBit(&isotmp, TRACE, szBuffer, &nLen); if (nLen >= 6) { // 冲正报文流水号应该与被冲正的交易不同。重复发送的冲正报文,流水号与原冲正报文的一致。 // 所以流水号只需要增加一次,报文中的流水号在PubPreVoidStr时已经预先增加了。 // 如果POS流水号与冲正流水号相同,POS流水号就加1 if (memcmp(szBuffer, FV.bankstate.szTrace, 6) == 0) { PubIncNum(FV.bankstate.szTrace); PubWriteMemFile(FV.bankstate.szTrace, sizeof(FV.bankstate.szTrace)); } } PubDisplay(4, "自动冲正中..."); BUFCLR(szDispInfo); ProGetTranName(gbnTransType, szDispInfo, &cSign, NO); if (ProSendVoidStr() == EXCEPTION || ProDispVoidMsg() == EXCEPTION) { FV.AutoVoid.gbnAutoVoidNum--; PubWriteMemFile(&FV.AutoVoid.gbnAutoVoidNum, sizeof(FV.AutoVoid.gbnAutoVoidNum)); if (FV.AutoVoid.gbnAutoVoidNum <= 0) { VERIFY_NORMAL(EXCEPTION); PubDelAllBit(&isotmp); PubStrToIso(FV.AutoVoid.gbszVoidStr, FV.AutoVoid.gbnVoidLen, &isotmp, NULL); PubDisplay(1, ""); PubDisplayCen(2, "自动冲正不成功"); PubDisplayCen(3, "请拨打以下电话"); PubDisplay(4, "%s", FV.bank.szInqTelNo); EA_vBeepMs(100); PubClearVoid(); FV.AutoVoid.gbnAutoVoidNum = FV.poscfg.nAutoVoidNum; PubWriteMemFile(&FV.AutoVoid.gbnAutoVoidNum, sizeof(FV.AutoVoid.gbnAutoVoidNum)); PubuiInkey(TIPS_TIMEOUT); // PubDisplayInv(1, szDispInfo); PubClearAll(); return NORMAL; } PubDialOff(&CommInfo); PubClearAll(); PubDisplayCen(3, "自动冲正不成功"); EA_vBeepMs(100); PubuiInkey(10); PubClearAll(); ASSERT_NORMAL(EXCEPTION); } FV.AutoVoid.gbnAutoVoidNum = FV.poscfg.nAutoVoidNum; PubClearVoid(); if (FV.gbnVoidLen2 > 0) { ProSetAutoVoid2(); goto AUTOVOID_BEGIN; } PubClearAll(); PubDisplayCen(2, "自动冲正成功"); PubuiInkey(1); if( gbcPosCtrlCode != '0') ASSERT_NORMAL(EXCEPTION); // PubDisplayInv(1, szDispInfo); PubClearAll(); return NORMAL; }
int PubPurchaseIcc (struct CardConfig *pcard,struct TrackInfo* pcTrackInfo) { char szAmtBuf[15], szTmpBuf[30], szBatch[7], szGetBuffer[10]; BYTE Ret; struct FileRecStru PurPos; char TermCap; uchar RetRF; TransDt TransDataStru; int cFlg ,i; int nLenField48; char szBuffer[500]; char cRet1 ,cRet3; //uchar szGetBufferTLV[200],szTLVlen[9]; int nTmpLen ; memset((char *) &PurPos, 0, sizeof(struct FileRecStru)); PurPos.cTransType = gbnTransType; //PubSetBankcMacChk(MAC_ECB); PubSetBankcMacChk(MAC_X99); /* * 数据采集(打基本包,输金额) */ PubDisplayInv (1, "消费"); ASSERT_NORMAL(PubPacketFix(&PurPos)); PurPos.cAidLen = pcard->cAidLen; memcpy (PurPos.aid,pcard->aid,PurPos.cAidLen); sprintf ((char*)PurPos.tAPN,"%s",gbctAPN); sprintf ((char*)PurPos.tAppLabel,"%s",gbctAppLabel); memcpy (PurPos.szMode , pcTrackInfo->szServerCodeBuf , 4); PurPos.cIC_Condition_Code = pcard->cIC_Condition_Code; if (PurPos.cTransType == EP_PURCHASE) { PubICProcess (&PurPos); gbnTransType = 0; return NORMAL; } //modify by chenjis 20130221 /* PubClearAll(); PubDisplay(2, "请输入金额:"); PubDisplay(4, "输错请按[清除]键"); BUFCLR(szAmtBuf); ASSURE_NORMAL(PubReadAmt(3, szAmtBuf, 3)); */ sprintf(szAmtBuf, "%012ld", gblTranAmt); //只修改此处,其他不用变. //end 20130221 sprintf (PurPos.szAmount, "%s", szAmtBuf); if( PurPos.szMode[1] == '7' ) { TermCap = '6'; } else { TermCap = '5'; } //应用初始化,读应用数据 if( TermCap == '6' ) Ret = StartEmvRFApp (&PurPos); else Ret = StartEmvApp (&PurPos); if (Ret == 99) { PubWriteLog(EXCEPTION, (char*)__FILE__, __LINE__); return NORMAL; } RetRF = Ret; if ((Ret != 0 && TermCap=='5') || (Ret != RFPBOC && Ret != 0 && Ret != RFARQC && Ret!= RFMSD1 && Ret!=RFMSD2 && TermCap=='6')) { if (Ret == EMVPANDIFFTRACK2) //v1.0.2 return EXCEPTION; /*chenjs20060626 del if (szTrack2.ucTrkFlag == EM_mag_SUCCESS && szTrack2.ucTrkLength > 10)*/ if(pcTrackInfo->nTrack2BufLen >10 )//chenjs20060626 add //在trackstru有初始化的前期下,从读卡函数看,这个条件成立已经包括szTrack2.ucTrkFlag == EM_mag_SUCCESS { //EM_mag_SUCCESS=0x00 所以不能只判断szTrack2.ucTrkFlag的值 PurPos.szMode[0] = '0'; PurPos.szMode[1] = '2'; PurPos.szMode[2] = '2'; PurPos.szMode[3] = 0x00; // 读取磁道方式 PurPos.cIC_Condition_Code = 2; TermCap = '5'; } else { gbcICWrongFlag = YES; if (PubRead_Card((char*)"消费",YES,NO,NO,NO,YES, pcard , pcTrackInfo) != NORMAL) return EXCEPTION; } PubPurchase(pcTrackInfo); //fallback return (EXCEPTION); } PubDisplayInv (1, "消费"); if( TermCap == '6' ) { if( Ret == RFPBOC ) { PurPos.szMode[0] = '9'; PurPos.szMode[1] = '8'; } else if (Ret == 0||Ret == RFARQC) { PurPos.szMode[0] = '0'; PurPos.szMode[1] = '7'; } else { PurPos.szMode[0] = '9'; PurPos.szMode[1] = '1'; } } //打包 BUFCLR (szGetBuffer); PubGetCurOper (szGetBuffer, 3); sprintf (PurPos.szOperNo, "%s", szGetBuffer); PubSetBitYL (&iso, PAN, PurPos.szCardNo, strlen (PurPos.szCardNo)); if (PurPos.pansn_flag == '#') { BUFCLR (szTmpBuf); szTmpBuf[0] = '0'; PubHexToAsc((uchar*)szTmpBuf + 1, (uchar*)&PurPos.pansn, 2, 0); PubSetBitYL (&iso, 23, szTmpBuf, 3); // PAN顺序号 } PubSetBitYL (&iso, AMOUNT, PurPos.szAmount, 12); // 交易金额 PubSetBitYL (&iso, SERVEMODE, PurPos.szMode, 3); PubSetBitYL (&iso, 11, PurPos.szTrace, 6); PubSetBitYL (&iso, 25, (char*)"81", 2); PubSetBitYL (&iso, 49, (char*)"156", 3); BUFCLR (szBatch); PubGetBankstateszBatchNum (szBatch, sizeof (szBatch)); sprintf (PurPos.szBatchNum, "%s", szBatch); //v1.0.2 if (FV.Other.gbcICCard == YES) { BUFCLR (szTmpBuf); sprintf (szTmpBuf, "22%6.6s000%d%d1", PurPos.szBatchNum, gbcTermCapSet, PurPos.cIC_Condition_Code); ASSURE_NORMAL (PubSetBitYL (&iso, 60, szTmpBuf, 14));//modify by baijz 20120109 支持返回余额 } else { BUFCLR (szTmpBuf); sprintf (szTmpBuf, "22%6.6s000%d01", PurPos.szBatchNum,gbcTermCapSet); PubSetBitYL (&iso, 60, szTmpBuf, 14);//modify by baijz 20120109 支持返回余额 } //end PubSetBitYL (&iso, 14, PurPos.szExpDate, 4); sprintf(PurPos.szUserNo, "%s", gbszUserNo);//用户号码 // [12/25/2014 modify]过滤用户号中的 ‘-’ 为‘|’ // for (i=0; i<strlen(gbszUserNo);i++) // { // if (gbszUserNo[i] == '-') // gbszUserNo[i] = '|'; // } //48域 nLenField48 = 0; BUFCLR(szBuffer); memset(szBuffer, 0x20, 72); memcpy(szBuffer, "U0", 2); memcpy(szBuffer + 2, "v2", 2); memcpy(szBuffer + 4, "A4", 2); memcpy(szBuffer + 6, "30", 2); memcpy(szBuffer + 8, "3000", 4); memcpy(szBuffer + 12, "0000", 4); nLenField48 += 16; //刷卡业务编号 memcpy(szBuffer + nLenField48 , gbszUserNo, strlen(gbszUserNo)) ; nLenField48 += 50; //缴费月份 memcpy(szBuffer + nLenField48, "000000", 6); nLenField48 += 6; nTmpLen = 0; nTmpLen = 4 + 2 + 4 + 1; sprintf(szBuffer + nLenField48, "%03d",nTmpLen); nLenField48 += 3; // 传统POS发起的: 0003 // 交易类型 AN 1 1F11 1.扫码支付2.会员号支付3.手机号支付 AppendTLV(szBuffer , &nLenField48 , (char*)"\x1F\x50" , 2 , (char*)"0003" , 4 ); AppendTLV(szBuffer , &nLenField48 , (char*)"\x1F\x11" , 2 , (char*)&nPayType , 1 ); szBuffer[nLenField48] = '#' ; nLenField48++; ASSURE_NORMAL (PubSetBit (&iso, 48, szBuffer, nLenField48)); ////////////////////////////////////////////////////////////////////////// if( RetRF != RFPBOC && TermCap == '6')//MSD1 MSD2 ARQC { if( gbszTermData[1] & 0x40 ) { // debug_print("调用ReadOnLinePin 5", "",0); if( ReadOnlinePin(&PurPos) == 2 ) return EXCEPTION; } if( RetRF == RFQPBOC || RetRF == RFARQC ) { EA_EMV_GetTransDt(&TransDataStru); ConverTransToPos(&TransDataStru,&PurPos); PurPos.dial_response = 0x01; } else if(RetRF == RFMSD2 ) { EA_EMV_GetTransDt(&TransDataStru); ConverTransToPos(&TransDataStru,&PurPos); PurPos.dial_response = 0x01; } else if( RetRF == RFMSD1 )//Need to Read Record { PurPos.cF55Flag = 0x01;//无55域 } strcpy(gbszErrCode, ""); cFlg = CommuWithHost(&PurPos); // 与Host进行通信 if(cFlg != NORMAL || memcmp(gbszErrCode,"00",2) != 0 ) { PubClearAll(); PubDisplay(3," 主机返回[%2.2s]", gbszErrCode ); PubDialOff(&CommInfo); PubuiInkey(3); return EXCEPTION; } if(gbcdial_response == 0 ) PurPos.dial_response = 0x00; if (cFlg == NORMAL && !memcmp(gbszErrCode,"00",2)) { PurPos.transresult = 0x00; PurPos.cOfflineFlag = ' '; PurPos.cUploadFlag = ' '; PubEMVWater(&PurPos); PubSaveDetail(&PurPos); //PubIncTrace(); //流水号递加,没有联机就在此对流水号加一 PubSetPoscfgcAutoVoidFlag(0); PubClearAutoVoidBuf(); // 先判断有没有脱机流水要上送,如果没有,则立刻挂断 if(PubUploadOffline(CHECKUPLOAD)!= EM_SUCCESS) PubDialOff(&CommInfo); PubSetPoscfgcPrintEndFlag(1); PubPrint(0 , iPrinterType); //add by baijz 20110623 先上送当前联机交易,再进行离线上送 PubUploadOffline(RUNUPLOAD); PubDialOff(&CommInfo); } return NORMAL; } if( TermCap == '6' ) Ret = EmvRFAppProcess (&PurPos); else Ret = EmvAppProcess (&PurPos); if (Ret != NORMAL) { //chenjs20060711 add down if(Ret == FALLBACK) { memset(pcard,0,sizeof(pcard)); memset(pcTrackInfo,0,sizeof(pcTrackInfo)); gbcICWrongFlag = YES; if (PubRead_Card((char*)"消费",YES,NO,NO,NO,YES, pcard , pcTrackInfo) != NORMAL) { return EXCEPTION; } PubPurchase(pcTrackInfo); } //chenjs20060711 add up return EXCEPTION; } if (!(PurPos.dial_response == 0x00 && PurPos.cOfflineFlag == '*')) { PubSetPoscfgcAutoVoidFlag(0); PubClearAutoVoidBuf(); } // debug_print("pur",PurPos.szCardNo,strlen(PurPos.szCardNo)); PubUpConfirm(&PurPos); //counttt = 1;//zyfdebug // [8/28/2014 modify]连机前发送上笔IC明细 /* EM_SUCCESS 成功 EM_ERROR 继续送 EXCEPTION 失败 也不继续送了 */ FV.gbnTcUpTimes = 1; if (gbICFlag == 1) { //PubSetBatchCount(); while(1) { if (FV.gbnTcUpTimes > 3) { PubDisplay(1, ""); PubDisplayCen(2, "上送3次TC交易失败"); EA_vBeepMs(100); PubuiInkey(10); break; } cRet1 = ICCTransBatchup1(0); cRet3 = ICCTransBatchup3(0); if (cRet1 == EM_ERROR || cRet3 == EM_ERROR) { continue; } if ( (cRet1 == EXCEPTION || cRet1 == EM_SUCCESS) && (cRet3 == EXCEPTION || cRet3 == EM_SUCCESS)) { gbICFlag = 0; break; } } } //add by baijz 20110623 先上送当前联机交易,再进行离线上送 PubUploadOffline(RUNUPLOAD); PubDialOff(&CommInfo); return NORMAL; }
/* * 函数功能:检查返回的报文是否串包 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubCheckPack(struct FileRecStru *pos) { char szBuf[50]; char szBuffer[50]; char szGetBuffer[30]; char szPAN[20]; char szRetTerminal[9], szRetCustom[16], szRetTrace[7]; char szRetAmt[15], szRetProcCode[7]; int nLen; int i; FV.Void.gbnVoidReason = OTHER; BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubDelAllBit(&iso1)); //ASSERT_NORMAL(PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, NULL)); if (PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, &i) != NORMAL) { PubDisplay(4, "通讯转换错!"); PubDisplay(3, "i=%d", i); PubuiInkey(5); return EXCEPTION; } nLen = sizeof(szPAN); BUFCLR(szPAN); ASSERT_NORMAL(PubGetBit(&iso1, PAN, szPAN, &nLen)); if (nLen > 0) { strcpy(pos->szCardNo, szPAN); } nLen = sizeof(szRetTerminal); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer, sizeof(szGetBuffer))); //BCTST // gbnVoidReason = NORMAL; // if (strcmp(szRetTerminal, szGetBuffer) != 0) { PubDisplayInv(2, "返回终端号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } nLen = sizeof(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, CUSTOM_ID, szRetCustom, &nLen)); ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetCustom, szGetBuffer) != 0) { PubDisplayInv(2, "返回商户号错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } BUFCLR(szRetTrace); nLen = sizeof(szRetTrace); PubGetBit(&iso1, TRACE, szRetTrace, &nLen); if (nLen > 0) { if ((strcmp(szRetTrace, pos->szTrace) != 0) && pos->cTransType != LOGIN) { PubDisplayInv(2, "返回流水号错误!"); //PubDisplay(1, "[%s]",FV.bankstate.szTrace); //PubDisplay(3, "[%s]",szRetTrace); //PubDisplay(4, "[%s]",pos->szTrace); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetProcCode); nLen = sizeof(szRetProcCode); PubGetBit(&iso1, PROC_CODE, szRetProcCode, &nLen); if (nLen > 0) { if (strcmp(szRetProcCode, pos->szProcCode) != 0) { PubDisplayInv(2, "返回处理码错误!"); PubDisplay( 3 , "[%s]" , szRetProcCode); PubDisplay( 4 , "[%s]",pos->szProcCode ); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetAmt); nLen = sizeof(szRetAmt); PubGetBit(&iso1, AMOUNT, szRetAmt, &nLen); if (nLen > 0) { if (atol(szRetAmt) != atol(pos->szAmount)) { PubDisplayInv(2, "返回金额错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szGetBuffer); BUFCLR(gbszErrCode); nLen = sizeof(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szGetBuffer, &nLen)); memcpy(gbszErrCode, szGetBuffer, 2); //BCTST nLen = sizeof(szGetBuffer); PubGetBit(&iso1, 49, szGetBuffer, &nLen); if (nLen == 3) { if (strcmp(szGetBuffer, "156") != 0) { PubDisplayInv(2, "货币代码不一致!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } FV.Void.gbnVoidReason = NORMAL; //[07/02/2015 shizd]add down for在这里提示错误返回码对应的信息 // if (memcmp(gbszErrCode, "00", 2)) // { // i = 0; // while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2)) // { // i++; // } // // BUFCLR(szBuffer); // if (err_mess[i][0] == '\0') // { /* Unknow Error */ // sprintf(szBuffer, "交易失败"); // } // else // { // strcpy(szBuffer, err_mess[i]); /*Defined Error */ // } // // if (strlen(szBuffer) > 20) // { // BUFCLR(szBuf); // memcpy(szBuf, szBuffer, 20); // if(memcmp(szBuffer,"交易失败",8) != 0) // PubDisplayCen(1, "交易失败"); // PubDisplayCen(2, szBuffer); // PubDisplayCen(3, szBuffer + 20); // } // else // { // if(memcmp(szBuffer,"交易失败",8) != 0) // PubDisplayCen(2, "交易失败"); // PubDisplayCen(3, szBuffer); // } // PubuiInkey(30); // } //[07/02/2015 shizd]add up return NORMAL; }
unsigned char RFICC_Process_AppGpo_SK(struct FileRecStru *TmpPos) { BYTE cLen; StartAppDt startappstru; BYTE cCommu[1024 + 1]; WORD nCommuLen; BYTE cGetApn[20]; WORD nGetApnLen; uchar ucRet; uchar gbctAPN[16+1]; gblTranAmt = atol(TmpPos->szAmount); memset(&startappstru, 0, sizeof(startappstru)); EMV_InitData(&startappstru,TmpPos); ucRet = EA_EMV_GetProcOption(gbcAidNumSelected, &startappstru, cCommu, &nCommuLen); if(ucRet == 0x75) { PubClearAll(); PubDisplayCen(3,"读卡失败"); PubuiInkey(3); return 1; } PubWriteLog(ucRet, (char*)__FILE__, __LINE__); if (ucRet == EMV_ERR_PADDING)// 这种情况要重新选择应用 { return 1; } //add by wei 特殊卡必须如此操作才能读到应用首选名 BUFCLR(cGetApn); if (EA_EMV_GetAppData((uchar*)"\x9F\x12", 2, cGetApn, &nGetApnLen) == EM_SUCCESS) //应用首选名 { BUFCLR(gbctAPN); cLen =((nGetApnLen < 16) ? nGetApnLen : 16); memcpy(gbctAPN,cGetApn,cLen); sprintf ((char*)TmpPos->tAPN,"%s",gbctAPN); } if ((TmpPos ->cECFlag == 2) && (gbnTransType == PURCHASE) && (ucRet != EMV_QPBOC_TC) && (memcmp(gbCandListStru[gbcAidNumSelected - 1].tAID, "\xA0\x00\x00\x03\x33\x01\x01\x06",8) == 0)) { //非接闪灯20140108:红灯(只有红灯)常亮 #ifndef C_RFLED if(FV.EmvStru.gbcExeReader != YES) //内置非接 { EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_BLUE, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_GREEN, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_RED, EM_LED_ON,100,EM_BLINK_STOP); } else //外置非接 { ;//暂无机器测试 } #endif //PubClearAll(); EA_vCls(); PubDisplayCen(2 , "纯电子现金卡"); PubDisplayCen(3 , "交易拒绝"); PubuiInkey(10); return 3; } if (ucRet == EM_SUCCESS) // 返回成功,则退出循环, 返回PAN和PAN Sn数据 {//RF PBOC return RFPBOC; } else if(ucRet == EMV_QPBOC_AAC ) { if ( FV.EmvStru.gbcExeReader != YES) EA_ucMIFCardDeactivate(gbMifCardHandle); else { //EA_ucMIFDeactivate(0); } PubClearAll(); //增加现实余额 RFDispBalance(TmpPos , 1); //PubDisplay(2, " 卡片拒绝交易"); PubDisplay(3, " 请取卡!"); PubDisplay(4, " 卡片拒绝交易"); EA_vBeepMs (1000); PubuiInkey(50); return(4); } else if(ucRet == EMV_QPBOC_TC )// { return RFQPBOC; } else if(ucRet == EMV_QPBOC_ARQC )// { return RFARQC; } //如果是撤销,初始化应用数据出错,无法进行再次选择 if ( FV.EmvStru.gbcExeReader != YES) EA_ucMIFCardDeactivate(gbMifCardHandle); else //EA_ucMIFDeactivate(0); PubClearAll(); PubDisplay(2, " 读IC卡错误"); PubDisplay(3, " 请取卡!"); PubDisplay(4," %02x %02x", ucRet,gbcAidNumSelected); EA_vBeepMs (1000); PubuiInkey(0); return(4); // 其它错误,交易失败 }
/* 闪卡流程处理,无GPO */ unsigned char RFICC_Process_AppSel_SK(struct FileRecStru *TmpPos) { BYTE szDate[9],szTime[7],szPan[21],szGetBuffer[51]; BYTE cLen,cRet; BYTE cCandListNum; // 存放ICC支持的AID列表数目 int nBufSize,nRet,i; // StartAppDt startappstru; BYTE cCommu[1024 + 1]; WORD nCommuLen; uchar ucRet; uchar szData[256]; ushort usDataLen; gblTranAmt = atol(TmpPos->szAmount); BUFCLR(szDate); BUFCLR(szTime); BUFCLR(szPan); BUFCLR(TmpPos->aid); BUFCLR(szGetBuffer); nBufSize = sizeof(szGetBuffer); while (1) { cLen = gbCandListStru[gbcAidNumSelected - 1].cLenAID; if (cLen > 16) cLen = 16; PubHexToAsc(TmpPos->aid, gbCandListStru[gbcAidNumSelected - 1].tAID, cLen * 2, 0); TmpPos->cAidLen = cLen * 2; //比较AID列表 nRet = EMV_Compara_aid(gbCandListStru[gbcAidNumSelected - 1].tAID, gbCandListStru[gbcAidNumSelected - 1].cLenAID, TmpPos); if (nRet == EXCEPTION) { //PubClearIcon();//相当于清图标行 EA_vCls(); PubDisplayCen(2, "无对应的AID列表"); PubuiInkey(3); return (3); } cRet = SendEmvRFDataToPad(); if (cRet != 0x00) { PubWriteLog(cRet, (char*)__FILE__, __LINE__); } //应用数据初始化 //memset(&startappstru, 0, sizeof(startappstru)); //EMV_InitData(&startappstru,TmpPos); //070904 if(EMV_RFSetTerm(gblTranAmt) != NORMAL)//设置终端属性9F66 { EA_vBeepMs(500); PubuiInkey(4); return(5); } ucRet = EA_EMV_FinalSelect(gbcAidNumSelected,cCommu ,&nCommuLen,szData, &usDataLen); PubWriteLog(ucRet, (char*)__FILE__, __LINE__); if (ucRet != EM_SUCCESS) { EA_vBeepMs(500); if (ucRet == EMV_SPECIAL_PROC || ucRet == EMV_ERR_SWDIFF || ucRet == EMV_ERR_FCI_FMT || ucRet == EMV_ERR_CARD_BLOCKED || ucRet == EMV_ERR_NUM_EXCEED) { cCandListNum =((cCommu[0] < CAND_LIST_MAX_NUM) ? cCommu[0] : CAND_LIST_MAX_NUM); if (cCandListNum == 0) { return(1); // 卡片无应用 } PubClearAll(); if (cCandListNum != 1) { PubDisplayCen(4, "请重新选择应用"); PubuiInkey(1); } else { return(1); } gbCandListStru = (DCandList *)(cCommu + 1); gbcAidNumSelected = SelectCandListNum((BYTE *)gbCandListStru, cCandListNum ); if (gbcAidNumSelected > cCandListNum) // 选择有误或没有正确选择 { return(1); } continue; } else { return(1); // 应用选择失败 } } for (TmpPos->cECFlag = 0, i = 0; i < usDataLen; i++) { if (memcmp(szData + i, "\x9F\x66", 2) == 0) { TmpPos->cECFlag = 2; break; } } if (TmpPos ->cECFlag == 0 && (gbnTransType == EC_INQUERY || gbnTransType == EC_PURCHASE || gbnTransType == EC_LOAD || gbnTransType == EC_LOGINQ || gbnTransType == EC_LOAD_CASH || gbnTransType == EC_REFUND)) { //非接闪灯20140108:红灯(只有红灯)常亮 #ifndef C_RFLED if(FV.EmvStru.gbcExeReader != YES) //内置非接 { EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_BLUE, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_GREEN, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_RED, EM_LED_ON,100,EM_BLINK_STOP); } else //外置非接 { ;//暂无机器测试 } #endif //PubClearAll(); EA_vCls(); PubDisplay(2,"非电子现金卡"); PubDisplay(3, "交易拒绝"); PubuiInkey(2); return 3; } if (TmpPos->cECFlag != 2 && TmpPos->cTransType == PURCHASE) { PubClearAll(); PubDisplay(2,"该卡不支持非接触消费"); PubDisplay(3, " 请使用其他方式"); PubuiInkey(2); return 4; } return(0); } return(0); }
//当笔闪卡处理 int PubCurSkProcess (char *pcFlg, struct FileRecStru *TmpPos) { uchar ucRet, option; DevHandle hdlClock; char cSetTime; unsigned long ulSetTime = 0; unsigned long ulPassTime = 0; char cRet1; char szTitle[100],szDispCardNo[30]; struct CardConfig card; char CanDisplay; #ifdef _ECASH_ uint mbuiRespLen; char mbpvResp[512]; #endif cSetTime = FV.Other.gbnCurrSKTime; if (EA_ucCreateTimer(&hdlClock) != EM_SUCCESS) { PubWriteLog(EXCEPTION, (char*)__FILE__, __LINE__); return EXCEPTION; } if (EA_ucResetTimer(hdlClock) != EM_SUCCESS) { EA_ucCloseTimer(&hdlClock); PubWriteLog(EXCEPTION, (char*)__FILE__, __LINE__); return EXCEPTION; } // cSetTime = FV.bank.cSKReadCardTime; EInitOpenMifCard (); //非接闪灯20140108:红灯(只有红灯)常亮 #ifndef C_RFLED if(FV.EmvStru.gbcExeReader != YES) //内置非接 { EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_BLUE, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_GREEN, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_RED, EM_LED_ON,100,EM_BLINK_STOP); } else //外置非接 { ;//暂无机器测试 } #endif CanDisplay = YES; RFPreProcess(); //非接交易,移到此处。 while (1) { if(CanDisplay) { BUFCLR(szTitle); BUFCLR(szDispCardNo); sprintf(szTitle,"(交易类型:消费%ld.%02ld)",gblTranAmt/100 , gblTranAmt%100); sprintf(szDispCardNo,"卡号%6.6s******%4.4s",TmpPos->szCardNo,TmpPos->szCardNo+(strlen(TmpPos->szCardNo)-4)); EA_vCls(); PubDisplayInv (1, szTitle); PubDisplay(2,szDispCardNo); PubDisplayCen(3,"请重新挥卡"); PubDisplayCen(4, "退出请按取消键"); EA_vBeepMs(1500); CanDisplay = NO; } if (EA_ucGetPassTimer(hdlClock, &ulPassTime) == EM_SUCCESS) { ulSetTime = cSetTime; if (ulPassTime > ulSetTime * 1000) { EA_ucCloseTimer(&hdlClock); return EM_TIMEOUT; } } ucRet = EM_FAILED; // 20110617 2张卡寻卡冲突增加 if (FV.EmvStru.gbcExeReader != YES) EA_ucMIFSetParamConfig( gbMifCardHandle, EM_mifs_PARAM_RXTHRESHOLD_A, FV.bank.nRxThresHold); else EA_ucSetRFParamLib(gbMifCardHandle, 0x20, 1); //EA_ucSetRFParamLib(gbMifCardHandle, 0, FV.bank.nRxThresHold); ucRet = PubucMIFCardActivate(gbMifCardHandle, &mbuiRespLen,mbpvResp); if (ucRet == 55)// 读卡器没有初始化好 { EA_vCls(); EA_ucCloseTimer(&hdlClock); return EM_key_FUNC; } if (ucRet == EM_SUCCESS) { //非接闪灯20140108:蓝灯黄灯常用亮 #ifndef C_RFLED if(FV.EmvStru.gbcExeReader != YES) //内置非接 { EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_ON,100,EM_BLINK_STOP); } else //外置非接 { ;//暂无机器测试 } #endif ucRet = ProcessRFIcc (&card); if (ucRet != 0) { if (FV.EmvStru.gbcExeReader != YES ) { if(ucRet==EM_ERRHANDLE) EInitOpenMifCard (); EA_ucMIFCardDeactivate(gbMifCardHandle); } else { //外置读卡器处理 2009.6.7 } CanDisplay = YES; continue; } gnCardType = MIF_CARD; if (RFICC_Process_AppSel_SK(TmpPos) != 0) { CanDisplay = YES; continue; } ucRet = EA_EMV_ucQFailRedo(); if (ucRet != 0)//返回值1 为未扣款情况下的闪卡,再次挥卡直接按正常流程处理 hejf 20151008 { switch(ucRet) { case 0xE1: EA_vBeepMs(500); /* //非接闪灯20140108:红灯(只有红灯)常亮 #ifndef C_RFLED if(FV.EmvStru.gbcExeReader != YES) //内置非接 { EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_BLUE, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_GREEN, EM_LED_OFF,100,EM_BLINK_STOP); EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_RED, EM_LED_ON,100,EM_BLINK_STOP); } else //外置非接 { ;//暂无机器测试 } #endif */ PubClearAll(); //PubDisplayInv(1,"闪卡异常"); //PubDisplayCen(3,"读数据错误"); //PubDisplayCen(3,"交易拒绝"); PubDisplayCen(2,"卡号不一致"); PubDisplayCen(3,"请使用原卡片"); PubuiInkey(2); //return EXCEPTION; CanDisplay = YES; continue; case 0xE2: EA_vBeepMs(500); PubClearAll(); //PubDisplayInv(1,"闪卡异常"); PubDisplayCen(2,"卡号不一致"); PubDisplayCen(3,"请使用原卡片"); PubuiInkey(2); CanDisplay = YES; continue; case 0xE6: //0xE1: 读数据错误, 重新回到重刷界面 //0xE2: 数据不匹配,重新回到重刷界面 //0xE6: 找不到匹配的闪卡记录 PubClearAll(); PubDisplayInv(1,"闪卡异常"); PubDisplayCen(3,"找不到匹配的闪卡记录"); PubuiInkey(3); CanDisplay = YES; continue; break; case 0xE3: //0xE3: 数据异常,需要删除失败交易记录,进入正常交易 EA_ucCloseTimer(&hdlClock); PubClearAll(); PubDisplayInv(1,"闪卡异常"); PubDisplayCen(3,"闪卡读数据异常"); PubuiInkey(3); return EXCEPTION; case 0xE4: //0xE4: 数据异常,需要保留失败交易记录,提示交易失败 EA_ucCloseTimer(&hdlClock); PubClearAll(); PubDisplayInv(1,"交易失败"); PubDisplayCen(2,"ATC异常,卡片ATC大于当"); PubDisplayCen(3,"前记录ATC."); PubuiInkey(3); return EXCEPTION; case 0xE5: //0xE4: 数据异常,需要保留失败交易记录,提示交易失败 EA_ucCloseTimer(&hdlClock); PubClearAll(); PubDisplayInv(1,"交易失败"); PubDisplayCen(3,"余额异常, 提示交易失败."); PubuiInkey(3); return EXCEPTION; case 1: //交易金额已经回滚,直接GPO开始新交易 PubDelSkFailRec(TmpPos->szCardNo,(char*)TmpPos->atc); //删除失败的闪卡流水 cRet1 = 0; cRet1 = RFICC_Process_AppGpo_SK(TmpPos); if (cRet1 == RFARQC || cRet1 == RFPBOC || cRet1 == RFQPBOC) *pcFlg = cRet1; else return EXCEPTION; break; default: EA_ucCloseTimer(&hdlClock); PubClearAll(); PubDisplayInv(1,"闪卡异常"); PubDisplay(3,"闪卡返回异常%d",ucRet); PubuiInkey(3); return EXCEPTION; } } EA_ucCloseTimer(&hdlClock); return NORMAL; } option = 0; if (EA_ucKBHit() == EM_key_HIT) { //有按键 option = PubuiInkey(1); if (option == CANCEL) { EA_ucCloseTimer(&hdlClock); return CANCEL; //按取消键 } } //sfh120509 读卡延迟100毫秒 EA_vDelayMs(100); } return EXCEPTION; }
/* * 函数功能: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; }
// 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 } }
/************************************** *功能: 基于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; }
int PubGenerateSignData(void) { uchar ucRet, szComPort[11], ucDeviceStatus, szBuf[33]; uchar szTradeID[13]; DevHandle phSignPanel; uint uiSeqNum, uiSignInfoLen, uiSignDataLen, uiTimeOut; uchar szSignInfo[10240]; uchar szSignData[1000]; char cStorageMode = 0; int i; int nTryTimes,nTimes; char cRet = 0; int nIfchecksigned; uiTimeOut = FV.Other.gbnSignTimeout; if(FV.Other.gbcSignPanel == 0) { return EXCEPTION; } else { if(FV.Other.gbcSignPanel == 1) //内置非接时,会导致签名无响应。 { ECloseMifCard(); strcpy(szComPort, "INSPAD"); } else { strcpy(szComPort, FV.Other.gbszSignPanelPort); } ucRet = EA_ucSignOpenDevice(szComPort, &phSignPanel); } if(ucRet != EM_SUCCESS || phSignPanel == EM_INVALID_HANDLE) { PubDisplay(3, "打开签字板失败%02x", ucRet); PubuiInkey(5); return EXCEPTION; } ucRet = EA_ucSignConnectDevice(phSignPanel, 3, &ucDeviceStatus); if(ucRet != EM_SUCCESS) { PubDisplay(3, "没有正常的签字板%02x", ucRet); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif PubuiInkey(5); return EXCEPTION; } if(ucDeviceStatus != EM_ISOK) { PubDisplay(3, "没有正常的签字板%02x", ucDeviceStatus); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif PubuiInkey(5); return EXCEPTION; } //获取签名板存储状态 cStorageMode = 0; ucRet = EA_ucGetSignParam(phSignPanel,EM_SIGN_STORAGE,(void*)&cStorageMode); if(ucRet != EM_SUCCESS) { PubDisplay(3, "获取存储功能失败%02x", ucRet); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif PubuiInkey(5); return EXCEPTION; } //带存储功能时 if(cStorageMode == 1) { cStorageMode = 0; //设置成不带存储 ucRet = EA_ucSetSignParam(phSignPanel,EM_SIGN_STORAGE,(void*)&cStorageMode); if(ucRet != EM_SUCCESS) { PubDisplay(3, "设置存储功能失败%02x", ucRet); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif PubuiInkey(5); return EXCEPTION; } } nIfchecksigned = 1; EA_ucSetSignParam(phSignPanel,EM_SIGN_CHECKSIGNED,&nIfchecksigned); //设置成不签名不返回。 #ifdef EPT_A9L if(FV.Other.gbcSignPanel == 1) //内置签名板时,设置签名板模式。 { EA_ucSetSignFaceMode(phSignPanel,FV.Other.gbcSignLcdMode); //设置屏幕类型 } #endif //特征码处理 if(FV.gbPrintDetail.cOfflineFlag == '*') //离线交易 { sprintf(szBuf, "%6.6s%6.6s0000", FV.gbPrintDetail.szBatchNum, FV.gbPrintDetail.szTrace); } else { if(strlen(FV.gbPrintDetail.szSettleDate) > 0) { sprintf(szBuf, "%4.4s%12.12s", FV.gbPrintDetail.szSettleDate, FV.gbPrintDetail.szReferenceNum); } else { sprintf(szBuf, "0000%12.12s", FV.gbPrintDetail.szReferenceNum); } } PubAscToHex(szTradeID, szBuf, 16, 0); for(i= 0; i < 4; i++) { szTradeID[i] ^= szTradeID[i+4]; } PubHexToAsc(szBuf, szTradeID, 8, 0); memset(szTradeID,0,sizeof(szTradeID)); memcpy(szTradeID, szBuf, 8); nTryTimes = 1; nTimes = 1; nTimes = FV.Other.gbnSignTryTimes; while(1) { if (nTryTimes > nTimes) { PubClearAll(); PubDisplay(3, "超过重签次数"); PubuiInkey(5); EA_ucSignEnd(phSignPanel); EA_ucSignCloseDevice (phSignPanel); return EXCEPTION; } nTryTimes ++; uiSignInfoLen = 0; uiSignDataLen = 0; BUFCLR(szSignInfo); PubClearAll(); PubDisplayCen(2, "交易成功"); PubDisplay(3, "请在签字板上签字"); EA_vBeepMs(1000); ucRet = EA_ucSignStart(phSignPanel, szTradeID, uiTimeOut, &uiSeqNum, &uiSignInfoLen, szSignInfo); if(ucRet == EM_SIGN_CANCEL) { PubClearAll(); PubDisplayCen(3,"是否取消退出?"); PubDisplayCen(4,"1 继续 其他键退出"); if(PubuiInkey(30)=='1') continue; else { EA_ucSignEnd(phSignPanel); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif return CANCELED; } } else if(ucRet == 0X8a) //超时退出 { PubClearAll(); PubDisplayCen(3, "电子签字超时!"); PubuiInkey(5); EA_ucSignEnd(phSignPanel); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif return EXCEPTION; } if(ucRet != EM_SUCCESS) { PubClearAll(); PubDisplayCen(3, "电子签字失败!"); PubuiInkey(5); EA_ucSignEnd(phSignPanel); EA_ucSignCloseDevice (phSignPanel); #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif return EXCEPTION; } #ifdef EPT_A9L if(memcmp(szComPort, "COM3", 4) == 0) { EA_ucCloseRfCardDevEI(&phSignPanel); } #endif if(uiSignInfoLen == 0) { PubClearAll(); PubDisplayCen(3, "电子签字失败"); PubDisplayCen(4, "请重签!"); PubuiInkey(5); continue; } //if(uiSignInfoLen > 999) if(uiSignInfoLen > 799) //为保证整个上送包不超过1024,签名信息数据大小不能超过799 { PubClearAll(); PubDisplayCen(3, "签名文件太复杂,"); PubDisplayCen(4, "请重签!"); PubuiInkey(5); continue; } //增加确认是否使用电子签名 确认、取消 cRet = ProSignInfoComfrin(szSignInfo,&uiSignInfoLen); if(cRet == NORMAL) { BUFCLR(szSignData); memcpy(szSignData, szSignInfo, uiSignInfoLen); uiSignDataLen = uiSignInfoLen; break; } else if(cRet == EXCEPTION) { EA_ucSignEnd(phSignPanel); EA_ucSignCloseDevice (phSignPanel); return EXCEPTION; } else if(cRet == CANCELED) continue; } // PubDebugInfo("拷贝签名数据成功"); EA_ucSignEnd(phSignPanel); EA_ucSignCloseDevice (phSignPanel); gbuiSignSeqNum = uiSeqNum; memcpy(gbszSignTradeID, szTradeID, 8); memcpy(gbszSignData, szSignData, uiSignDataLen); gbiSignDataLen = uiSignDataLen; //PubClearAll(); EA_vCls(); //PubDisplayCen(3, "电子签字成功"); //PubuiInkey(1); EA_vBeepMs(200); return NORMAL; }
int PubReadCardInfo(struct TrackInfo *TrackStru) { //for test dudj time // uchar ucRet; uchar ucBankCardID; uchar szTmpBuf[30], szTrackBuf[110]; uchar szExpDate[5]; int i, iLen; if (EA_uiSelect_AID()!=NORMAL) return EXCEPTION; if (EA_uiRead_SerNo(&EG_CardInfo)!=NORMAL) return EXCEPTION; if (EA_Get_BankCard_ID(&ucBankCardID)!=NORMAL) return EXCEPTION; if (EA_Get_BankCard_Info(&EG_BankCardInfo)!=NORMAL) return EXCEPTION; //for test dudj time /* ucRet=EA_ucGetPassTimer(ghTimerHandle,&gulTimeMs); if (ucRet!=EM_SUCCESS) { PubClearAll(); PubDisplay(3, "获取时钟计数错"); PubuiInkey(3); EA_ucCloseTimer(&ghTimerHandle); } EA_ucCloseTimer(&ghTimerHandle); PubClearAll(); PubDisplay(3, "时间:%lu %03lums", gulTimeMs/1000, gulTimeMs%1000); PubuiInkey(5); // 600/ *///end if (FV.EmvStru.gbcExeReader==YES) EA_ucControlReaderBeep(EM_BEAPTIME, 1); else EA_vBeepMs(500); //add by baijz 20111026 EA_vBeepMs(30); memset(szTmpBuf, 0, sizeof(szTmpBuf)); PubHexToAsc(szTmpBuf, EG_BankCardInfo.acCardNo, 20, 0); for (i=0; i<20; i++) { if (szTmpBuf[i]<'0' || szTmpBuf[i]>'9') szTmpBuf[i]=0x00; } if (i>=20) { szTmpBuf[19]=0x00; } strcpy(TrackStru->szPanBuf,szTmpBuf); TrackStru->nPanBufLen = strlen(szTmpBuf); memset(szTrackBuf, 0, sizeof(szTrackBuf)); PubHexToAsc(szTrackBuf, EG_BankCardInfo.acTrack2, 40, 0); memset(szTmpBuf, 0, sizeof(szTmpBuf)); memcpy(szTmpBuf, szTrackBuf, 2); for (i=0; i<2; i++) { if (szTmpBuf[i]<'0' || szTmpBuf[i]>'9') { //PubDisplay(3, "无2磁道"); PubWriteLog(EXCEPTION, __FILE__, __LINE__); } } iLen=atoi(szTmpBuf); if (iLen<=37) { szTrackBuf[iLen+2]=0x00; TrackStru->nTrack2BufLen = iLen; memcpy(TrackStru->szTrack2Buf, szTrackBuf+2, iLen); } memset(szTrackBuf, 0, sizeof(szTrackBuf)); PubHexToAsc(szTrackBuf, EG_BankCardInfo.acTrack3, 108, 0); memset(szTmpBuf, 0, sizeof(szTmpBuf)); memcpy(szTmpBuf, szTrackBuf, 4); for (i=0; i<4; i++) { if (szTmpBuf[i]<'0' || szTmpBuf[i]>'9') { //PubDisplay(3, "无3磁道"); PubWriteLog(EXCEPTION, __FILE__, __LINE__); } } iLen=atoi(szTmpBuf); if (iLen<=104) { szTrackBuf[iLen+4]=0x00; TrackStru->nTrack3BufLen = iLen; memcpy(TrackStru->szTrack3Buf, szTrackBuf+4, iLen); } //有效期 //add by chenjis 20121217 for BCTC 要求上送有效期 BUFCLR(szExpDate); PubHexToAsc(szExpDate, EG_BankCardInfo.acExpDate, 4, 0); memset(szTmpBuf, 0, sizeof(szTmpBuf)); for (i=0; i<4; i++) { if (szExpDate[i]<'0' || szExpDate[i]>'9') szExpDate[i]=0x00; } if (i>=4) { szExpDate[4]=0x00; memcpy(TrackStru->szExpBuf, szExpDate, 4); TrackStru->nExpBufLen = 4; TrackStru->szExpBuf[4] = 0x00; } memcpy(TrackStru->szServerCodeBuf, "962", 3); return NORMAL; }
/* * 函数功能:提示冲正信息 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL ―― 成功 * 非NORMAL ―― 失败 */ int ProDispVoidMsg(void) { char szBuffer[20], szGetBuffer[30]; char szRetTerminal[9], szRetCustom[16]; int nLen; ISODataStru voidiso; char szRetAmt[15], szRetProcCode[7], szRetTrace[7]; char szAmt[15], szProcCode[7], szTrace[7]; BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szBuffer); memset(&voidiso, 0, sizeof(ISODataStru)); PubClearAll(); strcpy(gbszErrCode, ""); FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); ASSERT_NORMAL(PubDelAllBit(&iso1)); ASSERT_NORMAL(PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, NULL)); BUFCLR(szBuffer); BUFCLR(szGetBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, RET_CODE, szBuffer, &nLen); nLen = sizeof(szRetTerminal); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetTerminal, szGetBuffer) != 0) { PubDisplayInv(2, "返回终端号错误!"); FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); EA_vBeepMs(1000); return EXCEPTION; } nLen = sizeof(szRetCustom); ASSERT_NORMAL(PubGetBit(&iso1, CUSTOM_ID, szRetCustom, &nLen)); ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetCustom, szGetBuffer) != 0) { PubDisplayInv(2, "返回商户号错误!"); FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); EA_vBeepMs(1000); return EXCEPTION; } PubDelAllBit(&voidiso); PubStrToIso(FV.Void.gbszVoidStr, FV.Void.gbnVoidLen, &voidiso, NULL); nLen = sizeof(szRetTrace); PubGetBit(&iso1, TRACE, szRetTrace, &nLen); if (nLen > 0) { nLen = sizeof(szTrace); PubGetBit(&voidiso, TRACE, szTrace, &nLen); if (strcmp(szRetTrace, szTrace) != 0) { PubDisplayInv(2, "返回流水号错误!"); FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } nLen = sizeof(szRetProcCode); PubGetBit(&iso1, PROC_CODE, szRetProcCode, &nLen); if (nLen > 0) { nLen = sizeof(szProcCode); PubGetBit(&voidiso, PROC_CODE, szProcCode, &nLen); if (strcmp(szRetProcCode, szProcCode) != 0) { PubDisplayInv(2, "返回处理码错误!"); FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } nLen = sizeof(szRetAmt); PubGetBit(&iso1, AMOUNT, szRetAmt, &nLen); if (nLen > 0) { nLen = sizeof(szAmt); PubGetBit(&voidiso, AMOUNT, szAmt, &nLen); if (strcmp(szRetAmt, szAmt) != 0) { PubDisplayInv(2, "返回金额错误!"); FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szBuffer, &nLen)); memcpy(gbszErrCode, szBuffer, 2); if ((memcmp(gbszErrCode, "25", 2) == 0) || (memcmp(gbszErrCode, "12", 2) == 0)) { memcpy(gbszErrCode, "00", 2); } if (memcmp(gbszErrCode, "00", 2) != 0) { FV.Void.gbnVoidReason = OTHER; WRITE_nVAR(FV.Void.gbnVoidReason); return EXCEPTION; } else { FV.Void.gbnVoidReason = NORMAL; WRITE_nVAR(FV.Void.gbnVoidReason); return NORMAL; } }
/* 系统检查,此函数为检测不过只有按取消键跳越 */ 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; }
/* * 函数功能:冲正交易处理 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL--成功 * 非NORMAL--失败 */ int PubAutoVoid(void) { char szGetBuf[30]; ISODataStru isotmp; int nRet;//chenjs20061226 add memset(&isotmp, 0, sizeof(ISODataStru)); /* * 取自动冲正标志 */ BUFCLR(szGetBuf); ASSERT_NORMAL(PubGetPoscfgcAutoVoidFlag(szGetBuf)); if (szGetBuf[0] == 0) return NORMAL; //BCTST while (1) { BUFCLR(szGetBuf); ASSERT_NORMAL(PubGetPoscfgcAutoVoidFlag(szGetBuf)); if (szGetBuf[0] == 0) return NORMAL; FV.Void.gbnVoidReasonSet = FV.Void.gbnVoidReason; WRITE_nVAR(FV.Void.gbnVoidReasonSet); //chenjs20061124 根据研发测试组建议修改为共冲正次数 = 重发次数加1 if (FV.Void.gbnVoidNum >= FV.Void.gbnAutoVoidNum ) if (FV.Void.gbnVoidNum > FV.Void.gbnAutoVoidNum )//chenjs20061124 add { PubDelAllBit(&isotmp); PubStrToIso(FV.Void.gbszVoidStr, FV.Void.gbnVoidLen, &isotmp, NULL); PubSetPoscfgcVoidPrintEndFlag(1); memcpy(&printiso, &isotmp, sizeof(ISODataStru)); PubPrintVoidChk(&isotmp, 0, iPrinterType); PubDisplay(1, ""); PubDisplayCen(2, "自动冲正不成功"); PubDisplayCen(3, "请拨打以下电话"); PubGetBankszInqTelNo(szGetBuf, sizeof(szGetBuf)); PubDisplayCen(4, szGetBuf); EA_vBeepMs(100); break; } //chenjs20061226 if (ProSendVoidStr() == EXCEPTION) nRet = ProSendVoidStr();//chenjs20061226 add测试组反馈取消无法退出 if(nRet == EXCEPTION)//chenjs20061226 add { continue; } //chenjs20061226 add down if(nRet == CANCELED) { return CANCELED; } if (ProDispVoidMsg() == EXCEPTION) { continue; } break; } PubClearAll(); // PubuiInkey(2); PubSetPoscfgcAutoVoidFlag(0); PubClearAutoVoidBuf(); //END return NORMAL; }
/* * 函数功能:提示冲正信息 * 入口参数:无 * 出口参数:无 * 返 回 值:NORMAL ―― 成功 * 非NORMAL ―― 失败 */ int ProDispVoidMsg(void) { char szBuffer[120], szBuffer1[130]; char szRetTerminal[9], szRetCustom[16]; int nLen; ISODataStru isotmp1; char szRetTrace[7], szTrace[7]; BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szBuffer); PubClearAll(); strcpy(gbszErrCode, ""); ASSERT_NORMAL(PubDelAllBit(&iso1)); ASSERT_NORMAL(PubStrToIso(gbszReadStr, gbnReadLen, &iso1, NULL)); if (FV.bank.cMacChk != MAC_NO) { if (PubChkMac(gbszReadStr + gbnReadLen - 8, gbszReadStr, gbnReadLen) == EXCEPTION) { ASSERT_NORMAL(EXCEPTION); } } //取请求包终端号 PubDelAllBit(&isotmp1); PubStrToIso(FV.AutoVoid.gbszVoidStr, FV.AutoVoid.gbnVoidLen, &isotmp1, NULL); BUFCLR(szBuffer1); nLen = sizeof(szBuffer1); ASSERT_NORMAL(PubGetBit(&isotmp1, POS_ID, szBuffer1, &nLen)); //取应答包终端号 nLen = sizeof(szRetTerminal); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); if (strcmp(szRetTerminal, szBuffer1) != 0) { PubClearAll(); PubDisplayInv(1, "自动冲正"); PubDisplay(2, "返回终端号错误"); PubDisplay(3, "%s %s", szRetTerminal, szBuffer1); EA_vBeepMs(50); ASSERT_NORMAL(EXCEPTION); } nLen = sizeof(szRetTrace); PubGetBit(&iso1, TRACE, szRetTrace, &nLen); if (nLen > 0) { nLen = sizeof(szTrace); PubGetBit(&isotmp1, TRACE, szTrace, &nLen); if (strcmp(szRetTrace, szTrace) != 0) { PubClearAll(); PubDisplayInv(1, "自动冲正"); PubDisplayInv(2, "返回流水号错!"); PubDisplay(3, "%s %s", szRetTrace, szTrace); EA_vBeepMs(50); ASSERT_NORMAL(EXCEPTION); } } nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, PROC_CODE, szBuffer, &nLen)); gbcPosCtrlCode = szBuffer[5]; // 收到应答就表示成功 return NORMAL; }
/* * 函数功能:检查返回的报文是否串包 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubCheckPack(struct FileRecStru *pos) { char szGetBuffer[30],cSetType; char szRetTerminal[9], szRetCustom[16], szRetTrace[7]; char szRetAmt[15], szAmt[15], szRetProcCode[7]; int nLen; int i; // 这里不写内存文件了。减少写次数 默认冲正码 // FV.Void.gbnVoidReason = OTHER; // WRITE_nVAR(FV.Void.gbnVoidReason); BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubDelAllBit(&iso1)); //ASSERT_NORMAL(PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, NULL)); if (PubStrToIso(gbszReadStr + 5, gbnReadLen - 5, &iso1, &i) != NORMAL) { PubDisplay(4, "通讯转换错!"); PubDisplay(3, "i=%d", i); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"MD"); sprintf(szCMDRetMsg,"通讯转换错%d",i); PubuiInkey(5); return EXCEPTION; } cSetType=FV.gbcGetTermType; nLen = sizeof(szRetTerminal); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); BUFCLR(szGetBuffer); if(cSetType==0&&strlen(TlvSendValue.szTerminal)) memcpy(szGetBuffer,TlvSendValue.szTerminal,8); else ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer, 8)); //ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetTerminal, szGetBuffer) != 0) { PubDisplayInv(2, "返回终端号错误!"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"MC"); sprintf(szCMDRetMsg,"终端号错%8.8s",szRetTerminal); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } nLen = sizeof(szRetCustom); BUFCLR(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, CUSTOM_ID, szRetCustom, &nLen)); BUFCLR(szGetBuffer); if(cSetType==0&&strlen(TlvSendValue.szCust)) memcpy(szGetBuffer,TlvSendValue.szCust,15); else ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, 15)); //ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, sizeof(szGetBuffer))); if (strcmp(szRetCustom, szGetBuffer) != 0) { PubDisplayInv(2, "返回商户号错误!"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"MN"); sprintf(szCMDRetMsg,"商户号错%15.15s",szRetCustom); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } BUFCLR(szRetTrace); nLen = sizeof(szRetTrace); PubGetBit(&iso1, TRACE, szRetTrace, &nLen); if (nLen > 0) { if ((strcmp(szRetTrace, pos->szTrace) != 0) && pos->cTransType != LOGIN) { PubDisplayInv(2, "返回流水号错误!"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"MC"); sprintf(szCMDRetMsg,"流水号错%6.6s %6.6s",pos->szTrace,szRetTrace); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetProcCode); nLen = sizeof(szRetProcCode); PubGetBit(&iso1, PROC_CODE, szRetProcCode, &nLen); if (nLen > 0) { if (strcmp(szRetProcCode, pos->szProcCode) != 0) { PubDisplayInv(2, "返回处理码错误!"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"MR"); sprintf(szCMDRetMsg,"处理码错%6.6s %6.6s",pos->szProcCode,szRetProcCode); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szGetBuffer); BUFCLR(gbszErrCode); nLen = sizeof(szGetBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szGetBuffer, &nLen)); memcpy(gbszErrCode, szGetBuffer, 2); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); memcpy(szCMDRetCode,gbszErrCode, 2); if (memcmp(szCMDRetCode,"55",2) == 0) strcpy(szCMDRetMsg,"密码错"); //BCTST nLen = sizeof(szGetBuffer); PubGetBit(&iso1, 49, szGetBuffer, &nLen); if (nLen == 3) { if (strcmp(szGetBuffer, "156") != 0) { PubDisplayInv(2, "货币代码不一致!"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"XI"); strcpy(szCMDRetMsg,"货币代码不一致"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } BUFCLR(szRetAmt); nLen = sizeof(szRetAmt); PubGetBit(&iso1, AMOUNT, szRetAmt, &nLen); // 2009-7-27 10部分承兑处理 if (memcmp(gbszErrCode, "10", 2) == 0 && (gbnTransType == PURCHASE || gbnTransType == YLJF_PURCHASE)) { BUFCLR(szAmt); nLen = sizeof(szAmt); PubGetBit(&iso, AMOUNT, szAmt, &nLen); strcpy(gbszErrCode, "00"); strcpy(pos->szReturnCode, "10"); PubStrDec(szAmt, szRetAmt, pos->szJFPayAmount); //自付金额,复用积分的 sprintf(pos->szAmount, "%012ld", atol(szRetAmt)); } if (nLen > 0) { if (atol(szRetAmt) != atol(pos->szAmount)) { PubDisplayInv(2, "返回金额错误!"); BUFCLR(szCMDRetCode); BUFCLR(szCMDRetMsg); strcpy(szCMDRetCode,"XB"); strcpy(szCMDRetMsg,"返回金额错误!"); EA_vBeepMs(1000); PubuiInkey(10); return EXCEPTION; } } // 这里不写内存文件了。减少写次数 默认冲正码 // FV.Void.gbnVoidReason = NORMAL; // WRITE_nVAR(FV.Void.gbnVoidReason); // return NORMAL; }
/* * 函数功能:检查返回的报文是否串包 * 入口参数:pos--用于检验的POS结构 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int PubCheckPack(struct FileRecStru *pos) { char szBuffer[1024], szField[232]; char szRetTerminal[9], szRetCustom[16], szRetTrace[7]; int nLen; uint i; ET_DATETIME dtLocal; char szDateTime[3]; uint nOffset; BUFCLR(szRetTerminal); BUFCLR(szRetCustom); BUFCLR(szBuffer); PubClearAll(); strcpy(gbszErrCode, ""); // 解包处理 ASSERT_NORMAL(PubDelAllBit(&iso1)); if (NORMAL != PubStrToIso(gbszReadStr, gbnReadLen, &iso1, NULL)) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplayInv(2, "解析返回报文出错"); EA_vBeepMs(1000); PubuiInkey(5); ASSERT_NORMAL(EXCEPTION); } // 取返回码 BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szBuffer, &nLen)); memcpy(gbszErrCode, szBuffer, 2); memcpy(pos->szReturnCode, szBuffer, 2); // 校验MAC, linq modify 应答码为00,需要校验MAC if ((FV.bank.cMacChk != MAC_NO) && (memcmp(gbszErrCode, "00", 2) == 0)) { if (PubChkMac(gbszReadStr + gbnReadLen - 8, gbszReadStr, gbnReadLen) == EXCEPTION) { VERIFY_NORMAL(COMM_MAC_ERR); return COMM_MAC_ERR; } } // 检查报文类型 BUFCLR(szField); BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, MSG_ID, szBuffer, &nLen)); strncpy(szField, szBuffer, 4); if (szBuffer[2] % 2 == 1) szBuffer[2]--; if (memcmp(szBuffer, pos->szMsgID, 4) && memcmp(szBuffer, "0000", 4)) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplayInv(2, "返回报文类型错误"); PubDisplay(3, "%s, %s", szField, pos->szMsgID); EA_vBeepMs(1000); PubuiInkey(5); return COMM_PACKET_ERR; } // 检查终端号 nLen = sizeof(szRetTerminal); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szRetTerminal, &nLen)); if (strncmp(szRetTerminal, FV.bank.szTerminal, strlen(FV.bank.szTerminal))) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplay(2, "返回终端号错误"); PubDisplay(3, "%s, %s", szRetTerminal, FV.bank.szTerminal); EA_vBeepMs(1000); PubuiInkey(5); return COMM_PACKET_ERR; } // 检查流水号 nLen = sizeof(szRetTrace); ASSERT_NORMAL(PubGetBit(&iso1, TRACE, szRetTrace, &nLen)); if ((strncmp(szRetTrace, pos->szTrace, strlen(pos->szTrace)) != 0) && (pos->cTransType != LOGIN)) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplay(2, "返回流水号错误"); PubDisplay(3, "%s, %s", szRetTrace, pos->szTrace); EA_vBeepMs(1000); PubuiInkey(5); return COMM_PACKET_ERR; } // linq 将清冲正动作放在检查串包后处理,保证串包不论应答是否00都能冲正 // 清冲正 if ((pos->cTransType != LOGIN) && (pos->cTransType != DOWN_PARAM) && (memcmp(gbszErrCode, "00", 2) != 0)) PubClearVoid(); // 取处理码 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, PROC_CODE, szBuffer, &nLen); gbcPosCtrlCode = szBuffer[5]; // 更新时间 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); memcpy(szDateTime, szBuffer + 2, 2); dtLocal.ucMinute = atoi(szDateTime); memcpy(szDateTime, szBuffer + 4, 2); dtLocal.ucSecond = atoi(szDateTime); } // 更新日期 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen); if (nLen > 0) { sprintf(pos->szDate + 4, "%4.4s", szBuffer); BUFCLR(szDateTime); memcpy(szDateTime, szBuffer, 2); if ((dtLocal.ucMonth == 12) && (atoi(szDateTime) == 1)) dtLocal.usYear++; else if ((dtLocal.ucMonth == 1) && (atoi(szDateTime) == 12)) dtLocal.usYear--; sprintf(szField, "%04d", dtLocal.usYear); memcpy(pos->szDate, szField, 4); dtLocal.ucMonth = atoi(szDateTime); memcpy(szDateTime, szBuffer + 2, 2); dtLocal.ucDay = atoi(szDateTime); EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE | EM_SYSTEM_TIME); } // POS必须将发卡行返回的信息原样显示在屏幕上(对拒绝交易而言)及打印在签购单上(对成功交易而言) BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, ADDI_RESPONSE, szBuffer, &nLen); if (nLen > 0) strncpy(pos->AddiResponse, szBuffer, sizeof(pos->AddiResponse) - 1); // 取授权码 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, AUTH_ID, szBuffer, &nLen); if (nLen > 0) { BUFCLR(pos->szAuthID); for (i = 0; i < 6; i++) { if (szBuffer[i] == ' ' && i > 1) szBuffer[i] = '\0'; } sprintf(pos->szAuthID, "%-6.6s", szBuffer); } // 取系统参考号 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, RETR_NUM, szBuffer, &nLen); if (nLen > 0) { sprintf(pos->szReferenceNum, "%12.12s", szBuffer); } // 取卡号 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, PAN, szBuffer, &nLen); if (nLen > 0 && pos->cTransType != EC_LOAD_U) // 非指定账户圈存这里是转出卡号,不改写卡号变量 { BUFCLR(pos->szCardNo); strcpy(pos->szCardNo, szBuffer); } // 取卡类别、发卡行信息 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, SPECIAL_DATA, szBuffer, &nLen); if (nLen >= 6) { memcpy(gbszBatchNum, szBuffer, 6); memcpy(pos->szBatchNum, gbszBatchNum, 6); // 使用系统下传的批次号,与系统保持一致 } if (nLen >= 15) sprintf(pos->szCardId, "%2.2s", szBuffer + 15); if (nLen >= 17) sprintf(pos->szIssuerID, "%10.10s", szBuffer + 17); // 对预授权完成交易,如果IST发现原始预授权交易为EMV交易,将返回原始预授权交易的DE55到POS。 if(pos->cTransType == CONFIRM || pos->cTransType == CONFIRM_NOTICE) { pos->nConfirmDE55Len = sizeof(pos->szConfirmDE55); PubGetBit(&iso1, ICC_INFO, pos->szConfirmDE55, &(pos->nConfirmDE55Len)); } i = sizeof(szBuffer); PubGetBit(&iso1, ICC_INFO_EX, szBuffer, (int *)&i); if ((memcmp(gbszErrCode, "00", 2)==0) && (i > 0)) { nOffset = 0; while (nOffset < i) { #ifdef EMVIC if ((memcmp(szBuffer+nOffset, "\xDF\x26", 2) == 0) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0)) { nLenAidCapkList = min(i, sizeof(szAidCapkList)); memcpy(szAidCapkList, szBuffer, nLenAidCapkList); gbnNeedDownAIDParam = YES; // 系统主动下发AID列表,要求下载AID参数 } if ((memcmp(szBuffer+nOffset, "\xDF\x24", 2) == 0) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0)) { nLenAidCapkList2 = min(i, sizeof(szAidCapkList2)); memcpy(szAidCapkList2, szBuffer, nLenAidCapkList2); gbnNeedDownCAPKey = YES; // 系统主动下发RID列表,要求下载认证中心公钥 } #endif #ifdef TMS if ((FV.bank.cCanTMS == YES) && (memcmp(szBuffer+nOffset, "\xDF\x25\x08\x02", 4) == 0)) { ProGetPosTmsVer(szField); if ((memcmp(szField, szBuffer+nOffset+3, 8) != 0) && (memcmp("\x02\x20\x08\x01\x01\x00\x00\x00", szBuffer+nOffset+3, 8) != 0)) // 与本机版本号不同且不为0220080101000000需要下载 { memcpy(FV.gbTmsStru.szTmsDownVer, szBuffer+nOffset+3, 8); // 版本信息予以保存 FV.gbcNeedDownloadTmsPara = YES; // 系统主动下发程序版本,要求进行TMS下载 PubWriteMemFile(&FV.gbTmsStru, sizeof(FV.gbTmsStru)); PubWriteMemFile(&FV.gbcNeedDownloadTmsPara, sizeof(FV.gbcNeedDownloadTmsPara)); } } #endif if (PubSkipTLVData(szBuffer, (int *)&nOffset) != NORMAL) break; } } // 20110310 返回Z7,设置Z7标志 if ((pos->cTransType != SETTLE) && (pos->cTransType != SETTLE_2) && (pos->cTransType != LOGIN) && (pos->cTransType != DOWN_PARAM)) { if (memcmp(gbszErrCode, "Z7", 2)==0 ) gbcHostRetZ7 = 1; else gbcHostRetZ7 = 0; } 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 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 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; }
/* * 函数功能:检查返回的报文 * 入口参数: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 PubPurchaseRFIcc (struct CardConfig *pcard,struct TrackInfo* pcTrackInfo) { char szTmpBuf[50], szBatch[7], szGetBuffer[50]; BYTE szData[100] , cLen; BYTE Ret,RetRF; BYTE cRet; char cIsBlackCard; struct FileRecStru PurPos; TransDt TransDataStru; int cFlg; WORD nLen; memset((char *) &PurPos, 0, sizeof(struct FileRecStru)); PurPos.cTransType = gbnTransType; PubSetBankcMacChk(MAC_ECB); /* * 数据采集(打基本包,输金额) */ //PubDisplayInv (1, "快速"); ASSERT_NORMAL(PubPacketFix(&PurPos)); PurPos.cAidLen = pcard->cAidLen; memcpy (PurPos.aid,pcard->aid,PurPos.cAidLen); sprintf (PurPos.tAPN,"%s",gbctAPN); sprintf (PurPos.tAppLabel,"%s",gbctAppLabel); memcpy (PurPos.szMode , pcTrackInfo->szServerCodeBuf , 4); PurPos.cIC_Condition_Code = pcard->cIC_Condition_Code; if (PurPos.cTransType == EP_PURCHASE) { PubICProcess (&PurPos); gbnTransType = 0; return NORMAL; } PurPos.cECFlag = 2;// 电子现金标志 //应用初始化,读应用数据 PurPos.cECFlag = 2; //折扣 sprintf (PurPos.szAmount, "%012ld", gblTranAmt); RetRF = StartEmvRFApp (&PurPos); if(gbnGetCardNoFromINQUERY == 1) { sprintf(pcTrackInfo->szPanBuf,"%s",PurPos.szCardNo); return NORMAL; } PubWriteLog(RetRF, __FILE__, __LINE__); if (RetRF == 99) { return NORMAL; } if (RetRF == RFARQC) { if (memcmp (gbCandListStru[gbcAidNumSelected - 1].tAID, "\xA0\x00\x00\x03\x33\x01\x01\x06", 8) == 0) { EA_vCls(); PubDisplayCen( 2, "余额不足"); PubDisplayCen( 3, "交易拒绝"); PubuiInkey(15); return EXCEPTION; } } if( RetRF == 0 || RetRF == RFARQC ) { ; } else if( RetRF == RFQPBOC || RetRF == RFPBOC) { ; } else if(RetRF == RFMSD1 || RetRF == RFMSD2 ) { PurPos.szMode[0] = '9'; PurPos.szMode[1] = '1'; } else if (RetRF != 0) { if (RetRF == EMVPANDIFFTRACK2) //v1.0.2 { return EXCEPTION; } /*chenjs20060626 del if (szTrack2.ucTrkFlag == EM_mag_SUCCESS && szTrack2.ucTrkLength > 10)*/ if(pcTrackInfo->nTrack2BufLen >10 )//chenjs20060626 add //在trackstru有初始化的前期下,从读卡函数看,这个条件成立已经包括szTrack2.ucTrkFlag == EM_mag_SUCCESS { //EM_mag_SUCCESS=0x00 所以不能只判断szTrack2.ucTrkFlag的值 PurPos.szMode[0] = '0'; PurPos.szMode[1] = '2'; PurPos.szMode[2] = '2'; PurPos.szMode[3] = 0x00; // 读取磁道方式 PurPos.cIC_Condition_Code = 2; } else { gbcICWrongFlag = YES; if (PubRead_Card("消费",YES,NO,NO,NO,YES, pcard , pcTrackInfo) != NORMAL) return EXCEPTION; } PubPurchase(pcTrackInfo); //fallback return (EXCEPTION); } //打包 BUFCLR (szGetBuffer); PubGetCurOper (szGetBuffer, 3); sprintf (PurPos.szOperNo, "%s", szGetBuffer); if(strlen (PurPos.szCardNo) > 0 ) PubSetBitYL (&iso, PAN, PurPos.szCardNo, strlen (PurPos.szCardNo)); if (PurPos.pansn_flag == '#') { BUFCLR (szTmpBuf); szTmpBuf[0] = '0'; PubHexToAsc(szTmpBuf + 1, &PurPos.pansn, 2, 0); PubSetBitYL (&iso, 23, szTmpBuf, 3); // PAN顺序号 } PubSetBitYL (&iso, AMOUNT, PurPos.szAmount, 12); // 交易金额 PubSetBitYL (&iso, SERVEMODE, PurPos.szMode, 3); PubSetBitYL (&iso, 11, PurPos.szTrace, 6); PubSetBitYL (&iso, 25, "00", 2); PubSetBitYL (&iso, 49, "156", 3); BUFCLR (szBatch); PubGetBankstateszBatchNum (szBatch, sizeof (szBatch)); sprintf (PurPos.szBatchNum, "%s", szBatch); //v1.0.2 //add BUFCLR (szTmpBuf); sprintf (szTmpBuf, "22%6.6s0006%d1", PurPos.szBatchNum,PurPos.cIC_Condition_Code); ASSURE_NORMAL (PubSetBitYL (&iso, 60, szTmpBuf, 14));//modify by baijz 20120109 支持返回余额 if (PurPos.szExpDate[0]) { PubSetBitYL (&iso, 14, PurPos.szExpDate, 4); } if( RetRF == 0 ) { memset(&TransDataStru, 0 , sizeof(TransDataStru )); EA_EMV_GetTransDt(&TransDataStru); ConverTransToPos(&TransDataStru,&PurPos); //JP add BUFCLR (szGetBuffer); if ( EA_EMV_GetAppData("\x9f\x74", 2, szGetBuffer, &nLen) == 0 ) { memcpy(PurPos.szVLPAuth,szGetBuffer,6); // PubDisplay(3, "1111111"); // PubDisplay(4 , "[%s][%2.2x]" , szGetBuffer,szGetBuffer[0]); // PubuiInkey(0); } BUFCLR (szGetBuffer); // if ( EA_EMV_GetAppData("\x9f\x10", 2, szGetBuffer, &nLen) == 0 ) if ( EA_EMV_ucGetTranCVR(szGetBuffer, &cLen) == EM_SUCCESS ) { BUFCLR(PurPos.szCVR); memcpy(PurPos.szCVR,szGetBuffer ,4); } // // PurPos.cAidLen = pcard->cAidLen; // memcpy (PurPos.aid,pcard->aid,PurPos.cAidLen); // sprintf (PurPos.tAPN,"%s",gbctAPN); // sprintf (PurPos.tAppLabel,"%s",gbctAppLabel); // PubDisplay(3, "[%d][%s]" ,PurPos.cAidLen , PurPos.aid ); // PubuiInkey(0); //add by baijz 20110629 cIsBlackCard = 0; cIsBlackCard = EQueryBlackRecord (PurPos.szCardNo); if(cIsBlackCard == 1) { /*del by baijz 20110812 BCTC不要求记录流水 strcpy(PurPos.arc , "Z1"); PurPos.transresult = 0x01; //不成功的脱机交易 PurPos.cOfflineFlag = '*'; PurPos.cUploadFlag = ' '; PubEMVWater(&PurPos); PubIncTrace(); */ PubClearAll(); PubDisplayCen(3, "该卡被列入黑名单"); PubDisplayCen(4, "交易失败"); PubuiInkey(3); return EXCEPTION; } PurPos.transresult = 0x00; // 交易结果为批准 PurPos.cOfflineFlag = '*'; PurPos.cUploadFlag = ' '; strcpy(PurPos.arc, "Y1");//脱机核准 //add by baijz 20110622 FV.Other.gbnOfflineNums++; WRITE_nVAR(FV.Other.gbnOfflineNums); PubEMVWater(&PurPos); PubSaveDetail(&PurPos); PubIncTrace(); //流水号递加,没有联机就在此对流水号加一 //add by baijz 20110725 EA_vDelayMs(500); //人耳能区分开,只能延时了。 EA_vBeepMs(500); PubClearAll(); if(ifVoidDeviceAppear == 1) EA_ucPlayVoice(gbVoiseHandle,3); PubDisplayCen(2, "交易成功"); PubDisplayCen (3, "现金余额为"); PubDisplay (4, "%ld.%02ld",atol(PurPos.szAmount2)/100 , atol(PurPos.szAmount2) %100); // PubuiInkey (FV.EmvStru.gbcQueryResultDispDelay); //add by ldy 售饭POS,显示2秒钟就可以了 // 清屏 PubSubdisplayClear(); // 显示交易成功金额和余额 add by feiq 2013/06/13 PubSubdisplayAmount(atol(PurPos.szAmount)*0.01, atol(PurPos.szAmount2)*0.01, SUBDISPLAY_MONEY_TYPE_BOTH); PubuiInkey(2); //end //add end //---------------delete by ldy 售饭POS,不打单了,直接刷卡消费 //PubSetPoscfgcPrintEndFlag(1); //PubPrint(0 , iPrinterType); //---------------end return NORMAL; } if( RetRF != RFPBOC)//MSD1 MSD2 ARQC { if( RetRF == RFQPBOC || RetRF == RFARQC ) { EA_EMV_GetTransDt(&TransDataStru); ConverTransToPos(&TransDataStru,&PurPos); memcpy(PurPos.cvmr , "\x02\x00\x00" , 3); PurPos.dial_response = 0x01; } else if(RetRF == RFMSD2 ) { EA_EMV_GetTransDt(&TransDataStru); ConverTransToPos(&TransDataStru,&PurPos); PurPos.dial_response = 0x01; } else if( RetRF == RFMSD1 )//Need to Read Record { PurPos.cF55Flag = 0x01; } cRet = EA_EMV_GetAppData("\x9F\x6C", 2, szData, &nLen); if (cRet == EM_SUCCESS) { /*del by baijz 20111219 if (((szData[0] & 0x80) == 0x80) || (( szData[0] & 0x20) == 0x20)) //联机都输入密码 { if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); //先关闭串口,然后下面打开串口 } if( ReadOnlinePin(&PurPos) == 2 ) return EXCEPTION; } else if ((szData[0] & 0x60) == 0x60) //需要签名 { if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); //先关闭串口,然后下面打开串口 } if( ReadOnlinePin(&PurPos) == 2 ) return EXCEPTION; } else { return EXCEPTION; //交易拒绝 } */ //add by baijz 20111219 if ( FV.EmvStru.gbcExeReader == YES) { EA_ucCloseComm(); //先关闭串口,然后下面打开串口 } if( ReadOnlinePin(&PurPos) == 2 ) return EXCEPTION; //add end } strcpy(gbszErrCode, ""); cFlg = CommuWithHost(&PurPos); // 与Host进行通信 if(cFlg != NORMAL || memcmp(gbszErrCode,"00",2)) { PubClearAll(); PubDisplay(3," 主机返回[%2.2s]", gbszErrCode ); PubDialOff(&CommInfo); PubuiInkey(3); return EXCEPTION; } if(gbcdial_response == 0 ) PurPos.dial_response = 0x00; if (cFlg == NORMAL && !memcmp(gbszErrCode,"00",2)) { PurPos.transresult = 0x00; PurPos.cOfflineFlag = ' '; PurPos.cUploadFlag = ' '; PubEMVWater(&PurPos); PubSaveDetail(&PurPos); //PubIncTrace(); //流水号递加,没有联机就在此对流水号加一 PubSetPoscfgcAutoVoidFlag(0); PubClearAutoVoidBuf(); // 先判断有没有脱机流水要上送,如果没有,则立刻挂断 if(PubUploadOffline(CHECKUPLOAD)!= EM_SUCCESS) PubDialOff(&CommInfo); PubSetPoscfgcPrintEndFlag(1); PubPrint(0 , iPrinterType); // PubDialOff(&CommInfo); //add by baijz 20110623 先上送当前联机交易,再进行离线上送 PubUploadOffline(RUNUPLOAD); PubDialOff(&CommInfo); } return NORMAL; } PurPos.szMode[0] = '9'; PurPos.szMode[1] = '8'; PubSetBitYL (&iso, SERVEMODE, PurPos.szMode, 3); Ret = EmvRFAppProcess (&PurPos); // EA_EMV_SetDebugShow(0x00); if (Ret != NORMAL) { if(Ret == FALLBACK) { memset(pcard,0,sizeof(pcard)); memset(pcTrackInfo,0,sizeof(pcTrackInfo)); gbcICWrongFlag = YES; if (PubRead_Card("消费",YES,NO,NO,NO,YES, pcard , pcTrackInfo) != NORMAL) { return EXCEPTION; } PubPurchase(pcTrackInfo); } //chenjs20060711 add up return EXCEPTION; } PubSetPoscfgcAutoVoidFlag(0); PubClearAutoVoidBuf(); //add by baijz 20110623 先上送当前联机交易,再进行离线上送 PubUploadOffline(RUNUPLOAD); PubDialOff(&CommInfo); return NORMAL; }
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; } }
/* * 函数功能:获得返回的错误码 * 入口参数:无 * 出口参数:无 * 返 回:NORMAL ―― 成功 * EXCEPTION ―― 失败 */ int ProGetRetCode(void) { char szBuffer[130], szData[200]; int nLen; // EA_vCls(); BUFCLR(szErrCode); strcpy(szErrCode, ""); ASSERT_NORMAL(PubDelAllBit(&iso1)); ASSERT_NORMAL(PubStrToIso(szReadStr, nReadLen, &iso1, NULL)); // 检查报文类型 BUFCLR(szBuffer); nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, MSG_ID, szBuffer, &nLen)); strcpy(szData, szBuffer); if (szBuffer[2] % 2 == 1) szBuffer[2]--; if (memcmp(szBuffer, UploadFileRec.szMsgID, 4) && memcmp(szBuffer, "0000", 4)) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplayInv(2, "返回报文类型错误"); PubDisplay(3, "%s, %s", szData, UploadFileRec.szMsgID); EA_vBeepMs(1000); PubuiInkey(TIPS_TIMEOUT); return COMM_PACKET_ERR; } // 检查终端号 nLen = sizeof(szBuffer); BUFCLR(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, POS_ID, szBuffer, &nLen)); if (strncmp(szBuffer, FV.bank.szTerminal, strlen(FV.bank.szTerminal))) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplay(2, "返回终端号错误"); PubDisplay(3, "%s, %s", szBuffer, FV.bank.szTerminal); EA_vBeepMs(1000); PubuiInkey(TIPS_TIMEOUT); return COMM_PACKET_ERR; } // 检查流水号 nLen = sizeof(szBuffer); BUFCLR(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, TRACE, szBuffer, &nLen)); if (strncmp(szBuffer, UploadFileRec.szTrace, strlen(UploadFileRec.szTrace)) != 0) { PubDialOffIfNoAutovoid(); PubClearAll(); PubDisplay(2, "返回流水号错误"); PubDisplay(3, "%s, %s", szBuffer, UploadFileRec.szTrace); EA_vBeepMs(1000); PubuiInkey(TIPS_TIMEOUT); return COMM_PACKET_ERR; } nLen = sizeof(szBuffer); ASSERT_NORMAL(PubGetBit(&iso1, RET_CODE, szBuffer, &nLen)); memcpy(szErrCode, szBuffer, 2); memcpy(gbszErrCode, szBuffer, 2); // 取处理码 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, PROC_CODE, szBuffer, &nLen); gbcPosCtrlCode = szBuffer[5]; // 取批次号 BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, SPECIAL_DATA, szBuffer, &nLen); if (nLen >= 6) memcpy(gbszBatchNum, szBuffer, 6); // POS必须将发卡行返回的信息原样显示在屏幕上(对拒绝交易而言)及打印在签购单上(对成功交易而言) BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&iso1, ADDI_RESPONSE, szBuffer, &nLen); if (nLen > 0) strncpy(UploadFileRec.AddiResponse, szBuffer, sizeof(UploadFileRec.AddiResponse) - 1); return NORMAL; }
/* * 查芯片余额 */ int ProECBalance (struct FileRecStru *TmpPos) { int nBufSize; char szGetBuffer[20]; BYTE cRet1; BYTE cCommu[30 + 1]; WORD nCommuLen; long lAmt; // DWORD wBal; BUFCLR(szGetBuffer); nBufSize = sizeof(szGetBuffer); PubClearAll(); PubDisplayCen(3,"处理中"); if(gnCardType != MIF_CARD) //add by baijz 20120326 检测中心要求 { PubDisplayCen(4, "请勿拔卡"); //change by wei bctc } else { PubDisplayCen(4, "请勿移卡"); } PubGetBankstateszTrace(szGetBuffer, nBufSize); //获取流水号 sprintf(TmpPos->szTrace, "%6.6s", szGetBuffer); cRet1 = ICC_Process_AppSelection(TmpPos); if (cRet1 != 0) { // PubDisplay(2, "ICC_Process_AppSelection"); // PubDisplay(3, "cRet1 = %d", cRet1); // PubuiInkey(3); return EXCEPTION; } nCommuLen = 0; BUFCLR(cCommu); // EA_EMV_ReadAppData(cCommu, &nCommuLen); // 接触式读取方式,内核是在读应用数据过程中获取余额的。 nCommuLen = 0; BUFCLR(cCommu); if(EA_EMV_GetDataCmd(0x9F, 0x79, cCommu, &nCommuLen) == EM_SUCCESS ) { PubHexToAsc(szGetBuffer, cCommu, nCommuLen*2,0 ); lAmt = atol(szGetBuffer); BUFCLR (szGetBuffer); if (lAmt > 99l) sprintf (szGetBuffer, "%ld.%02ld", lAmt / 100, lAmt % 100); else sprintf (szGetBuffer, "0.%02ld", lAmt); } else { //add by baijz 20120326 if(gnCardType == MIF_CARD) { if (FV.EmvStru.gbcExeReader==YES) EA_ucControlReaderBeep(EM_BEAPTIME, 1); else EA_vBeepMs(500); } //add end PubClearAll(); PubDisplay(3,"无现金余额"); PubuiInkey(3); return EXCEPTION; } //add by baijz 20120326 if(gnCardType == MIF_CARD) { if (FV.EmvStru.gbcExeReader==YES) EA_ucControlReaderBeep(EM_BEAPTIME, 1); else EA_vBeepMs(500); } //add end if (EOpenPINPad () != NORMAL) return EXCEPTION; PubDisplayCen (2, "查询成功"); PubDisplayCen (3, "请查看密码键盘"); if(gnCardType != MIF_CARD) //add by baijz 20120326 检测中心要求 { PubDisplayCen(4, "请拔卡"); //change by wei bctc } else { PubDisplayCen(4, "请移卡"); } PubucDispPinpad (gbhdlPINPAD, 2, szGetBuffer); PubuiInkey (FV.EmvStru.gbcQueryResultDispDelay); if ( iPinpadType == 1 ) //外置PINPAD { PubucDispPinpad(gbhdlPINPAD, 1, "WELCOME TO USE "); PubucDispPinpad(gbhdlPINPAD, 2, " LANDI PINPAD"); } EClosePINPad (); return NORMAL; }