// -----------------------------------------------------------------------------
// CNATFWUNSAFErrorCodeAttribute::ConstructL
// -----------------------------------------------------------------------------
//
void CNATFWUNSAFErrorCodeAttribute::ConstructL(TInt aResponseCode,
        const TDesC8& aReasonPhrase)
{
    __ASSERT_ALWAYS(CheckResponseCode(aResponseCode),
                    User::Leave(KErrArgument));

    iReasonPhrase = aReasonPhrase.AllocL();
    iResponseCode = aResponseCode;
}
// -----------------------------------------------------------------------------
// CNATFWUNSAFErrorCodeAttribute::__DbgTestInvariant
// -----------------------------------------------------------------------------
//
void CNATFWUNSAFErrorCodeAttribute::__DbgTestInvariant() const
{
#if defined(_DEBUG)
    if (!iReasonPhrase || !CheckResponseCode(iResponseCode))
    {
        User::Invariant();
    }
#endif
}
Example #3
0
/*****************************************************************************
 ** Descriptions:	效验接收包
 ** Parameters:          void
 ** Returned value:
 ** Created By:		lilin2012.08.06
 ** Remarks:
 ***************************************************+**************************/
s32 CheckRecBag(SDK_8583_ST8583 *pstSendBag, SDK_8583_ST8583 *pstRevBag) {
	//SDK_PED_DES_TYPE type;
	u8 ucMacBuf[32];
	u8 sendbuf[64] = { 0 };
	u8 proccode[6] = { 0 };
	s32 slen;
	s32 rlen;
	u8 revbuf[64] = { 0 };
	u8 res[3] = { 0 };
	s32 rlt;
	u8 i;
	u8 num = 0;
	struct _Field60 stfield60;

	struct _TradeData *stTradeData = &gstTradeData;

#ifdef ELECSIGN
	u8 maxCheckNum = 6;
#endif
	u8 he_checkdata[6] = {
	SDK_8583_FIELD_MSG,           //消息类型
			3,                              //交易处理码
			11,                             //流水号
			41,                             //终端号
			42,                             //商户号
			4,                              //交易金额
			};

	//获取处理吗
	Log("wangb", "CheckRecBag start");
	if (sdk8583IsDomainExist(pstSendBag, 3)) {
		GetFieldData(pstSendBag, 3, proccode, 6);
	}
	memset(sendbuf, 0, sizeof(sendbuf));
	rlt = GetFieldData(pstSendBag, SDK_8583_FIELD_MSG, sendbuf, 4);   //获取消息类型
	if (rlt < 0) {
		Log("CheckRecBag", "取RECV0错误");
		return ERR_RECZERO;
	} else {
		if (memcmp(sendbuf, "05", 2))                        //结算报文没有39域
				{
			memset(res, 0, sizeof(res));
			rlt = GetFieldData(pstRevBag, 39, res, 3);
			if (rlt < 0) {
				Log("CheckRecBag", "取RECV39错误\r\n");
				return ERR_RECZERO;
			} else {
				ProviderSetTagValue(TAG_8583_BKRESULT, res, rlt);
			}
		}
	}
	//是否缺失64域
	if (sdk8583IsDomainExist(pstSendBag, 64))          //先判断发送包是否有64
			{
		if (strcmp(res, "00") == 0)       //39域返回正确
				{
			if (!sdk8583IsDomainExist(pstRevBag, 64))         //判断接收64域
					{
				rlt = ERR_MISSMAC;
				return rlt;
			}
		}
	}

	//判断64域是否正确
	if (sdk8583IsDomainExist(pstRevBag, 64)) {
		rlt = GetMacData(stTradeData, pstRevBag, ucMacBuf);
		Log("wangb", "ucMacBuf64 %s", ucMacBuf);
		if (rlt != SDK_OK) {
			Log("CheckRecBag", "ECB算法错误");
			return ERR_CALCMAC;
		}
		memset(revbuf, 0, sizeof(revbuf));
		rlt = GetFieldData(pstRevBag, 64, revbuf, 8);
		Log("wangb", "revbuf64 %s", revbuf);
		if (rlt < 0) {
			Log("CheckRecBag", "缺少64域");
			return ERR_RECZERO;
		}
		// TraceHex("CheckRecBag", "cal=", ucMacBuf, 8);
		// TraceHex("CheckRecBag", "mac=", revbuf, 8);

		if (memcmp(ucMacBuf, revbuf, 8)) {
			Log("CheckRecBag", "MAC效验错误");
			rlt = ERR_CALCMAC;
			return rlt;
		}
	}

	u8 gElecSignIsSendingEsTrade = false; //本次交易为电子签名上送交易(用于解包8583不校验4域--打包8583)
#ifdef ELECSIGN
	if (gElecSignIsSendingEsTrade) {
		maxCheckNum = 5;
	} else {
		maxCheckNum = 6;
	}
	for (i = 0; i < maxCheckNum; i++)
#else
			for (i = 0; i < 6; i++)
#endif
			{
		num = he_checkdata[i];

		if (sdk8583IsDomainExist(pstRevBag, num)
				&& sdk8583IsDomainExist(pstSendBag, num)) {
			memset(revbuf, 0, sizeof(revbuf));
			rlen = GetFieldData(pstRevBag, num, revbuf, 64);

			if (rlen < 0) {
				Log("CheckRecBag", "取RECV%d错误\r\n", num);
				return ERR_RECZERO;
			}
			memset(sendbuf, 0, sizeof(sendbuf));
			slen = GetFieldData(pstSendBag, num, sendbuf, 64);

			if (slen < 0) {
				Log("CheckRecBag", "取SEND%d错误\r\n", num);
				return ERR_RECZERO;
			}
			Log("wangb", "sendbuf is %s", sendbuf);
			Log("wangb", "revbuf is %s", revbuf);
			switch (num) {
			case SDK_8583_FIELD_MSG:   //判断消息类型

				if ((memcmp(sendbuf, revbuf, 2))
						|| (revbuf[2] != (sendbuf[2] + 1))) {
					rlt = ERR_MSGTYPE;
					return rlt;
				}
				break;

			case 3:      //比较处理码(银行卡检测中心说一定要比较第1个字节交易类型)

				if (memcmp(sendbuf, revbuf, 2)) {
					rlt = ERR_PROCESSCODE;
					return rlt;
				}
				break;

			case 11:

				//比较POS流水号
				if (strcmp(sendbuf, revbuf)) {
					rlt = ERR_VOUCHERNO;
					return rlt;
				}
				break;

			case 41:

				//比较终端号
				if (strcmp(sendbuf, revbuf)) {
					rlt = ERR_TERMINALNO;
					return rlt;
				}
				break;

			case 42:

				//比较商户号
				if (strcmp(sendbuf, revbuf)) {
					rlt = ERR_MERCHANTNO;
					return rlt;
				}
				break;

			case 4:

				//比较交易金额
				if (strcmp(sendbuf, revbuf)) {
					Log("CheckRecBag", "%s  %s\r\n", sendbuf, revbuf);
					memset(&stfield60, 0, sizeof(stfield60));

					if (ParseField60(&stfield60)) {
						if (strcmp(res, "10") || stfield60.ucPortion != '1') //不为部分扣款
								{
							rlt = ERR_TRADEAMOUNT;
							return rlt;
						}
					}
				}
				break;

			default:
				break;
			}
		} else {
			if (num == 41) {
				rlt = ERR_TERMINALNO;
				return rlt;
			}

			if (num == 42) {
				rlt = ERR_MERCHANTNO;
				return rlt;
			}
		}
	}

	//响应码处理
	memset(sendbuf, 0, sizeof(sendbuf));
	rlt = GetFieldData(pstSendBag, SDK_8583_FIELD_MSG, sendbuf, 4); //获取消息类型码

	if (rlt < 0) {
		Log("CheckRecBag", "取RECV0错误");
		return ERR_RECZERO;
	}

	if (memcmp(sendbuf, "04", 2) == 0)                    //冲正包判断
			{
		if (memcmp(res, "00", 2) && memcmp(res, "12", 2)
				&& memcmp(res, "25", 2)) {
			return ERR_RESPONSE;
		}
	}
	//磁条卡现金充值确认包判断
	else if (memcmp(sendbuf, "0220", 4) == 0
			&& memcmp(proccode, "63", 2) == 0) {
		if (memcmp(res, "00", 2) && memcmp(res, "A6", 2)) {
			return ERR_RESPONSE;
		}
	} else {
		if (memcmp(sendbuf, "05", 2))                        //结算报文没有39域
				{
			if (!CheckResponseCode(res))    //响应码错误
					{
				Log("CheckRecBag", "响应码error  %s", res);
//			  Log("CheckRecBag", "FunCode", stfield60.asFunCode, 2);
				//磁条卡现金充值回98当做超时
				memset(&stfield60, 0, sizeof(struct _Field60));
				ParseField60(&stfield60);

				//磁条卡现金充值包判断
				if (memcmp(sendbuf, "0200", 4) == 0
						&& memcmp(proccode, "63", 2) == 0
						&& memcmp(stfield60.asFunCode, "48", 2) == 0) {
					if (memcmp(res, "98", 2) == 0) {
						//lilin 20140214磁条卡现金充值不显示交易失败要进行磁条卡现金充值确认
//                        GetStrResponseError(dispbuf);
//                        sdkDispPromptBox(false, 500, dispbuf);
						return SDK_TIME_OUT;
					}
				}
				/*=======BEGIN: lilin 2015.01.12  15:31 modify===========*/
				if ((memcmp(sendbuf, "0200", 4) == 0)
						&& (memcmp(proccode, "00", 2) == 0)
						&& (memcmp(stfield60.asFunCode, "22", 2) == 0))     //消费
						{
					if ((strcmp(res, "10") == 0)
							&& (stfield60.ucPortion != '1')) //如果不是部分扣费还返回10则需要冲正
							{
						return ERR_NEEDREVERSAL;
					}
					if ((strcmp(res, "10") == 0)
							&& (stfield60.ucPortion == '1'))           //部分扣款
							{
						return ERR_RESPONSE10;
					}
				}
				/*====================== END======================== */
				return ERR_RESPONSE;
			}
		}
	}

	//都正确处理更新时间和日期
	if (sdk8583IsDomainExist(pstRevBag, 12))                         //更新交易时间
			{
		memset(revbuf, 0, sizeof(revbuf));
		rlt = GetFieldData(pstRevBag, 12, revbuf, 64);
		/*
		 if (rlt)
		 {
		 sdkAscToBcd(&gstSys.ucHour, &revbuf[0], 2);
		 sdkAscToBcd(&gstSys.ucMinute, &revbuf[2], 2);
		 sdkAscToBcd(&gstSys.ucSecond, &revbuf[4], 2);
		 }
		 */
	}

	if (sdk8583IsDomainExist(pstRevBag, 13))                     //更新交易日期
			{
		memset(revbuf, 0, sizeof(revbuf));
		rlt = GetFieldData(pstRevBag, 13, revbuf, 64);
		/*
		 if (rlt)
		 {
		 sdkAscToBcd(&gstSys.ucMonth, &revbuf[0], 2);
		 sdkAscToBcd(&gstSys.ucDay, &revbuf[2], 2);
		 }
		 */
	}
	// Trace("CheckRecBag", "OK\r\n");
	Log("wangb", "CheckRecBag OK");
	return SDK_OK;
}