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; }
/****************************************************************************** * 函数名称: vCallEnd * 功能描述: * 挂机处理 ******************************************************************************/ void vCallEnd(void) { UINT8 cTempNo[DIALNOLEN]; memset(cTempNo,0x00,DIALNOLEN); EA_ucOffHook(TELEPHONEOFF); vGetCallNo(cTempNo); if(cTempNo[0] != 0) { vSetDialCall(cTempNo, 1); } EA_vDelayMs(500); EA_modem_setlisten(1); EA_ucModemSwitch(MODEMON); cls(); }
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; }
/****************************************************************************** * 函数名称: vDialDialRecord * 功能描述: * 从通话记录进行回拨 ******************************************************************************/ void vDialDialRecord(char* cCallNo,UINT8 ucCallLen,UINT8* pucCancelFlag,UINT8* pucNextPage) { UINT8 ucAct,ucKeyValue,i; uchar ucReDialTabel=0; //UINT8 ucReDialFlag=0; //ucReDialFlag UINT8 ucReFlag = 0; while(1) { ucAct=ucGetActAndKey(&ucKeyValue); switch(ucAct) { case KEYHIT: if(ucKeyValue == KEY_CANCEL) { *pucCancelFlag=1; return ; } else if(ucKeyValue == KEY_REDIAL) { ucReDialTabel=1; } else { *pucNextPage = ucKeyValue; return; } case CALLON_SET: case CALLON_FREE: if(gtTermPara1.bEnableCall == 0) { cls(); TPA_vDisplayInv(3, DISP_CENTER, "请开通终端通话功能"); while(1) { ucKeyValue = ucReadInput(); //挂机 if(ucKeyValue == KEY_HANGUP|| ucKeyValue == KEY_CANCEL) { *pucCancelFlag = 1; return; } } } EA_ucModemSwitch(MODEMOFF); //关闭振铃 EA_modem_setlisten(0);//停止监听 EA_ucOffHook(TELEPHONEON); if(ucAct == CALLON_SET) { vSwitchHandSet(); } else { vSwitchHandFree(); } cls(); EA_vDisplay(2, "%s", cCallNo); TPA_vDisplayInv(1, DISP_CENTER, "回拨电话"); vClearCallNo(); if(ucCallLen == 0) { vHaveNoDialNum(); *pucCancelFlag = 1; return; } while(1) { ucAct = ucGetActAndKey(&ucKeyValue); if((ucAct == KEYHIT && ucKeyValue == KEY_REDIAL) || ucReDialTabel == 1) { if(ucReFlag == 0) { if (ucReDialTabel == 1) { EA_vDelayMs(2000); } EA_vDelayMs(40); ucTempNo[0] = 0; strcpy(ucTempNo,cCallNo); EA_ucTeleDialStr(ucTempNo); ucReDialTabel=0; for(i = 0 ; i < strlen(ucTempNo); i ++) { vSetCallNo(ucTempNo[i]); } ucReFlag = 1; } vGetReDialNo(ucTempNo); cls(); display(3,ucTempNo); while(1) { ucAct = ucGetActAndKey(&ucKeyValue); if(ucAct == KEYHIT) { switch(ucKeyValue) { case KEY_REDIAL: if(ucReFlag==1) { EA_ucOffHook(TELEPHONEOFF); vGetCallNo(ucTempNo); if(ucTempNo[0] != 0) { vSetDialCall(ucTempNo, 1); } EA_vDelayMs(1500); vClearCallNo(); if(EA_cPhoneGetHs()==1) { vSwitchHandSet(); } else { vSwitchHandFree(); } EA_vDelayMs(700); ucTempNo[0] = 0; vGetReDialNo(ucTempNo); EA_ucTeleDialStr(ucTempNo); for(i = 0 ; i < strlen(ucTempNo); i ++) { vSetCallNo(ucTempNo[i]); } ucReFlag = 1; } vGetReDialNo(ucTempNo); cls(); display(3,ucTempNo); break; case KEY_X07: ucKeyValue='#'; case KEY_X08: if(ucKeyValue == KEY_X08) { ucKeyValue='*'; } case KEY_0: case KEY_1: case KEY_2: case KEY_3: case KEY_4: case KEY_5: case KEY_6: case KEY_7: case KEY_8: case KEY_9: EA_cPhoneDial((char)ucKeyValue); vSetCallNo(ucKeyValue); vGetCallNo(ucTempNo); display(3,ucTempNo); break; default: break; } } else if(ucAct==CALLON_SET) { vSwitchHandSet(); } else if(ucAct==CALLON_FREE) { vSwitchHandFree(); } else if(ucAct==CALLEND) { *pucCancelFlag=1; vCallEnd(); ucReFlag=0; return; } else if (ucAct==CALLIN) { gucRing=0; *pucCancelFlag=1; return; } } break; } else if(ucAct==CALLON_SET) { vSwitchHandSet(); } else if(ucAct==CALLON_FREE) { vSwitchHandFree(); } else if(ucAct==CALLEND) { *pucCancelFlag=1; vCallEnd(); ucReFlag=0; return; } else if (ucAct == CALLIN) { gucRing = 0; *pucCancelFlag = 1; return; } } break; case CALLIN: gucRing = 0; *pucCancelFlag=1; return; default: break; }//switch } }
void vHaveNoDialNum(void) { INT8 cTempNo[DIALNOLEN]; UINT8 i,ucAct,ucKeyValue; UINT8 ucReFlag=0,ucKeyFlag=0; vClearCallNo(); memset(cTempNo,0x00,sizeof(cTempNo)); while(1) { ucAct=ucGetActAndKey(&ucKeyValue); if(ucAct==KEYHIT) { switch(ucKeyValue) { case KEY_X07: ucKeyValue='#'; case KEY_X08: if(ucKeyValue==KEY_X08) { ucKeyValue='*'; } case KEY_0: case KEY_1: case KEY_2: case KEY_3: case KEY_4: case KEY_5: case KEY_6: case KEY_7: case KEY_8: case KEY_9: EA_cPhoneDial((char)ucKeyValue); vSetCallNo(ucKeyValue); vGetCallNo(cTempNo); display(3,cTempNo); ucKeyFlag=1; break; case KEY_REDIAL: if(ucKeyFlag==0) { cls(); EA_vDisplay(3, "无号码不可以重拨"); break; } vCallEnd();//挂机 ucReFlag=0; if(EA_cPhoneGetHs()) { vSwitchHandSet(); } else { vSwitchHandFree(); } EA_vDelayMs(400); memset(cTempNo, 0x00, sizeof(cTempNo)); vGetReDialNo(cTempNo); vClearCallNo(); EA_ucTeleDialStr(cTempNo); for(i = 0 ; i < strlen(cTempNo); i ++) { vSetCallNo(cTempNo[i]); } ucReFlag = 1; EA_vDisplay(1, " 重拨电话"); display(3, cTempNo); break; default: break; } } else if(ucAct==CALLON_SET) { vSwitchHandSet(); } else if(ucAct==CALLON_FREE) { vSwitchHandFree(); } else if(ucAct==CALLEND) { vCallEnd(); ucReFlag=0; return; } } }
/*远程下载交易,需要双向认证*/ uchar EA_TMS_ucDownload(uchar ucFlag, TMS_AppScript *ptTMSHead) { ET_DATETIME tDateTime; uchar ucRet; EG_uiDebugMsgLen = 0; memset(&tDateTime, 0, sizeof(tDateTime)); EA_ucGetDateTime(&tDateTime); EA_TMS_vLog("/************************************************/"); EA_TMS_vLog("/*TMS DBVer:01-01-05 %d.%d.%d %d:%d:%d*/", tDateTime.usYear, tDateTime.ucMonth, tDateTime.ucDay, tDateTime.ucHour, tDateTime.ucMinute, tDateTime.ucSecond); EA_TMS_vLog("/************************************************/"); #ifdef PED EA_TMS_vLog("\n\r# PRODUCT TYPE: PED !\n\r"); #endif if(NULL == ptTMSHead) { EI_ClearAll(); EI_vDisplayCen(2, "TMS_AppScript is NULL!"); EA_TMS_vLog("TMS_AppScript is NULL!"); ET_uiInkey(10); return EM_ERROR; } EA_TMS_vLog("# GloableVarInit..."); EG_ucAuthFlag = ucFlag; EI_vGloableVarInit(); EA_TMS_vLog("# EI_ucTMSInit..."); /*TMS初始化*/ ucRet = EI_ucTMSInit(ptTMSHead); if (ucRet != EM_SUCCESS) { EA_face_vSetInfo("参数非法"); EA_TMS_vLog("TMS SCRIPT 初始化失败!中止!"); goto TMS_EXIT; } //创建计时器 EA_TMS_vLog("# Create Timer..."); ucRet = EA_ucCreateTimer(&EG_hTimer); if (ucRet != EM_SUCCESS) { EA_TMS_vLog("EI_ucTMS3Proc: EA_ucCreateTimer EG_hTimer Fail![%x]", ucRet); } EA_TMS_vLog("连接到服务器..."); EA_face_vSetInfo("连接到服务器..."); switch (EG_ucAuthFlag) { case TMS_AUTH_NO: break; case TMS_AUTH_YL: EA_TMS_vLog("# TMS_AUTH_YL !"); EG_YL_ucPTIFlag = 0; memset(EG_ucPTI, 0, sizeof(EG_ucPTI)); if (EM_SUCCESS == EI_ucCheckTag(EG_ucReserve, sizeof(EG_ucReserve), 0xA0, 8, EG_ucPTI)) { EG_YL_ucPTIFlag = 1; EA_TMS_vLog("# EG_YL_ucPTIFlag = 1"); } EG_YL_ucSyncFlag = 0; if (EM_SUCCESS == EI_ucCheckTag(EG_ucReserve, sizeof(EG_ucReserve), 0xA1, 1, &EG_YL_ucSyncFlag)) { if (EG_YL_ucSyncFlag != 0 && EG_YL_ucSyncFlag != 1) { EI_ClearAll(); EI_vDisplayCen(2, "Flag:A1 invalid[%x]", EG_YL_ucSyncFlag); ET_uiInkey(2); goto TMS_EXIT; } EA_TMS_vLog("# EG_YL_ucSyncFlag = %d", EG_YL_ucSyncFlag); } EA_vDelayMs(100); break; case TMS_AUTH_LZ: //等待modem池接通TCP EA_vDelay(1); EA_TMS_vLog("开始认证..."); ucRet = EI_ucMutualAuth_LZ(); if (ucRet != EM_SUCCESS) { EA_face_vSetInfo("服务器握手失败"); goto TMS_EXIT; } EA_vDelayMs(100); break; case TMS_AUTH_LOCAL: //等待modem池接通TCP EA_vDelay(1); EA_TMS_vLog("开始认证..."); ucRet = EI_ucLocalAuth(); if (ucRet != EM_SUCCESS) { EA_face_vSetInfo("服务器握手失败"); goto TMS_EXIT; } EA_vDelayMs(100); break; case TMS_AUTH_ICBC: EA_TMS_vLog("TMS_AUTH_Type: ICBC"); if (EG_ucTPDULen != 0) { EA_face_vSetInfo("ICBC不支持TPDU!"); EA_TMS_vLog("TMS_AUTH_ICBC don't need tpdu !"); ucRet = EM_ERROR; goto TMS_EXIT; } case TMS_AUTH_YOUCU: if (EG_ucCommType == TMS_COMTYPE_BYMODEM || EG_ucCommType == TMS_COMTYPE_BYMODEM_SDLC) { if (EG_ucTPDULen != 5) { EA_face_vSetInfo("TMS参数设置错误"); EI_vDisplayCen(3, "TPDU设置错误[%d]", EG_ucTPDULen); EA_TMS_vLog("EI_ucTMSInit: TMS_AUTH_YOUCU EG_ucTPDULen[%d] error!", EG_ucTPDULen); ET_uiInkey(10); goto TMS_EXIT; } } else if (EG_ucCommType == TMS_COMTYPE_BYETHENET) { if (EG_ucTPDULen != 0) { EA_face_vSetInfo("TMS参数设置错误"); EI_vDisplayCen(3, "TPDU设置错误[%d]", EG_ucTPDULen); EA_TMS_vLog("EI_ucTMSInit: TMS_AUTH_YOUCU EG_ucTPDULen[%d] error!", EG_ucTPDULen); ET_uiInkey(10); goto TMS_EXIT; } } break; default: EA_face_vSetInfo("应用类型设置错误!"); EA_TMS_vLog("EA_TMS_ucDownload EG_ucAuthFlag[%x] Fail!", EG_ucAuthFlag); ET_uiInkey(10); ucRet = 0x01; goto TMS_EXIT; } ucRet = EI_ucTMS3Proc(ptTMSHead); if (ucRet != EM_SUCCESS) { EA_face_vSetInfo("下载失败"); goto TMS_EXIT; } EA_face_vSetInfo("下载结束"); TMS_EXIT: if (EM_SUCCESS == ucRet) { EA_TMS_vLog("\r\n下载成功!\r\n"); } else { EA_TMS_vLog("\r\n错误原因,下载中断!\r\n"); ET_uiInkey(2); } EI_ucTMSExit(ptTMSHead); return ucRet; }
void TA_BT_vDisconectBT(void) { EA_ucBtDisconnectLink(); EA_vDelayMs(200); }
/* * 函数功能:特殊用于离线交易上送的通讯 * 入口参数: * szSendStr ―― 待发送的数据 * nSendLen ―― 待发送数据的长度 * 出口参数: * szRecvStr ―― 收到的数据 * pnRecvLen ―― 收到的数据的长度 */ int PubUploadCommu(struct CommStru *pCommInfo, char *szSendStr, int nSendLen, char *szRecvStr, int *pnRecvLen, char *cOnline , int flag) { char szGetBuffer[30], szBuffer[10]; ISODataStru isotmp; int nLen; *cOnline = NO; if (szSendStr == NULL || szRecvStr == NULL) return EXCEPTION; if (pnRecvLen == NULL || nSendLen == 0) return EXCEPTION; //add by baijz 20110728 BCTC要求 CDMA通讯没有办法按取消键退出 EA_vDelayMs(300); if (EA_ucKBHit () == EM_key_HIT) { //有按键 if (PubuiInkey (1) == EM_key_CANCEL) { *cOnline = CANCEL; return EXCEPTION; } } //add end if (PubYlConnect (pCommInfo) != NORMAL) { *cOnline = CANCEL; return EXCEPTION; } if (gbnTransType != LOGIN) { /* * 自动冲正处理 */ //BCTST BUFCLR(szBuffer); ASSERT_NORMAL(PubGetPoscfgcAutoVoidFlag(szBuffer)); if (szBuffer[0] == 1) { PubDisplay(2, "自动冲正, 请稍候..."); BUFCLR(szGetBuffer); ASSURE_NORMAL(PubGetBankcMacChk(szGetBuffer)); PubSetBankcMacChk(MAC_ECB); //chenjs20061226 测试组反馈无法取消冲正PubAutoVoid(); //chenjs20061226 add down ASSURE_NORMAL(PubAutoVoid());//chenjs20061226 add down PubSetBankcMacChk(szGetBuffer[0]); PubClearAll(); } ProDispCommMsg(5); //END } //add end PubSetBankcMacChk(MAC_ECB); if ( flag != 2) PubCalcMac(szSendStr, nSendLen - 8, szSendStr + nSendLen - 8); /* * 通讯:发送、接收 */ /*chenjs20070105根据测试组反馈,这个提示会覆盖上面的提示 PubClearAll(); ProDispCommMsg(5); PubDisplay(2, "处理中, 请稍候..."); */ ASSURE_NORMAL(ProSendToHost(pCommInfo, nSendLen, szSendStr)); //chenjs20070105 ProDispCommMsg(6); *cOnline = YES; PubDisplay(2 , "");// 清屏 ASSURE_NORMAL(ProReadFromHost(pCommInfo, pnRecvLen, szRecvStr)); memset((char *) &isotmp, 0, sizeof(isotmp)); PubStrToIso(szRecvStr + 5, *pnRecvLen - 5, &isotmp, NULL); BUFCLR(szGetBuffer); ASSURE_NORMAL(PubGetBankcMacChk(szGetBuffer)); if (szGetBuffer[0] != MAC_NO) { BUFCLR(szBuffer); nLen = sizeof(szBuffer); PubGetBit(&isotmp, RET_CODE, szBuffer, &nLen); if (memcmp(szBuffer, "00", 2) == 0) { // 银联生产后台在电子现金离线交易上送的时候,没有送mac下来,造成计算mac错误,bctc测试是没问题的,说明按照规范,我们做法是正确的。 // if (PubChkMac(szRecvStr + *pnRecvLen - 8, szRecvStr + 5, *pnRecvLen - 8 - 5) != NORMAL) // return EXCEPTION; } } return NORMAL; }
//当笔闪卡处理 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; }