// ----------------------------------------------------------------------------- // 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 }
/***************************************************************************** ** 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; }