Example #1
0
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
}
Example #2
0
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;
}
Example #3
0
/*
 * 函数功能:检查返回的报文是否串包
 * 入口参数: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;

}
Example #4
0
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;
}
Example #5
0
/*
 * 函数功能:检查返回的报文是否串包
 * 入口参数: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;

}
Example #6
0
/*
* 函数功能:冲正交易处理
* 入口参数:无
* 出口参数:无
* 返 回 值: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;
}
Example #7
0
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;

}
Example #8
0
/*
 * 函数功能:检查返回的报文是否串包
 * 入口参数: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;
}
Example #9
0
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);	   // 其它错误,交易失败		
}
Example #10
0
/*
闪卡流程处理,无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);
}
Example #11
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;
}
Example #12
0
/*
 * 函数功能: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;
}
Example #13
0
// 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
    }
}
Example #14
0
/**************************************
*功能:	基于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;
}
Example #15
0
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;
}
Example #16
0
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;
}
Example #17
0
/*
 * 函数功能:提示冲正信息
 * 入口参数:无
 * 出口参数:无
 * 返 回 值: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;
    }

}
Example #18
0
/* 系统检查,此函数为检测不过只有按取消键跳越 */
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;
}
Example #19
0
/*
 * 函数功能:冲正交易处理
 * 入口参数:无
 * 出口参数:无
 * 返 回 值: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;
}
Example #20
0
/*
* 函数功能:提示冲正信息
* 入口参数:无
* 出口参数:无
* 返 回 值: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;
}
Example #21
0
/*
 * 函数功能:检查返回的报文是否串包
 * 入口参数: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;

}
Example #22
0
/*
 * 函数功能:检查返回的报文是否串包
 * 入口参数: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;
}
Example #23
0
/**************************************
*功能:	基于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;
}
Example #24
0
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;
}
Example #25
0
/*
 * 函数功能:检查返回的报文
 * 入口参数: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;
}
Example #26
0
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;
}
Example #27
0
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;
	}
}
Example #28
0
/*
 * 函数功能:获得返回的错误码
 * 入口参数:无
 * 出口参数:无
 * 返    回: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;
}
Example #29
0
/*
 * 查芯片余额
 */
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;
}