📄 converse.cpre
字号:
/* * This is a part of the Application Preconsole * - Channel Access - ISI. * Copyright (C) 2000-2000 ABC.SDC. * All rights reserved. * * This source code is only intended as a supplement to the * Application Preconsole Reference and related * electronic documentation provided with the library. * See these sources for detailed information regarding the * Application Preconsole product. * * Update record: * 2001-08-08 ChenYu - converse for CA. */#include "ap.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "isi.h";PCSTR pszRespCode[][2] ={ {AP_RESPCODE_ACCEPT , "00"}, /* 承兑或交易成功 */ {AP_RESPCODE_REJECT , "93"}, /* 交易违法、不能完成 */ {AP_RESPCODE_LOGERR , "96"}, /* 系统异常、失效 */ {AP_RESPCODE_SYSERR , "96"}, /* 系统异常、失效 */ {AP_RESPCODE_MSG_DUPSEQNO , "94"}, /* 重复交易 */ {AP_RESPCODE_SYS_INTERMIT , "91"}, /* 发卡方或交换中心不能操作 */ {AP_RESPCODE_SERVICE_INTERMIT , "91"}, /* 发卡方或交换中心不能操作 */ {AP_RESPCODE_SERVICE_NOTSUPPORT , "40"}, /* 请求的功能尚不支持 */ {AP_RESPCODE_ACCVOUCH_NOTEXIST , "40"}, /* 请求的功能尚不支持 */ {AP_RESPCODE_ACC_NOTEXIST , "14"}, /* 无效卡号 */ {AP_RESPCODE_ACC_LOST , "41"}, /* 挂失卡(没收卡)*/ {AP_RESPCODE_ACC_BALLACK , "51"}, /* 无足够的存款 */ {AP_RESPCODE_ACCPWD_ERR , "55"}, /* 不正确的PIN */ {AP_RESPCODE_ACCPWD_TIMEOUTLMT , "75"}, /* 允许的输入PIN次数超限 */ {AP_RESPCODE_WITHDRAWTIME_OUTLMT, "65"}, /* 超出取款次数限制 */ {AP_RESPCODE_AMT_OUTLMT , "61"}, /* 超出取款金额限制 */ {AP_RESPCODE_ORGTRANS_NOTEXIST , "25"}, /* 未能找到文件上记录 */ {AP_RESPCODE_ORGTRANS_CANCELED , "N8"}, /* 未能找到文件上记录 */ {NULL , NULL}};/* * 根据ISO8583报文产生XML报文的交易日期。 */RESULT GetReqDate(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szReqDate[AP_LEN_DATE + 1]; TIMESTRU timestru; UINT nSize; bufclr(szReqDate); timestru = GetTime(); sprintf(szReqDate, "%04d", timestru.nYear); nSize = SIZE_LOCALTRANSDATE; if (GetBitInIso8583(piso8583stru, BIT_LOCALTRANSDATE, &szReqDate[4], &nSize) != NORMAL) { sprintf(&szReqDate[4], "%02d%02d", timestru.nMon, timestru.nDay); } ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQDATE, szReqDate)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的交易时间。 */RESULT GetReqTime(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szReqTime[AP_LEN_TIME + 1]; TIMESTRU timestru; UINT nSize; bufclr(szReqTime); nSize = SIZE_LOCALTRANSTIME; if (GetBitInIso8583(piso8583stru, BIT_LOCALTRANSTIME, szReqTime, &nSize) != NORMAL) { timestru = GetTime(); sprintf(szReqTime, "%02d%02d%02d", timestru.nHour, timestru.nMin, timestru.nSec); } ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQTIME, szReqTime)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的请求流水号。 */RESULT GetReqSeqNo(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTraceNo[SIZE_TRACENO + 1]; char szSettleDate[SIZE_SETTLEDATE + 1]; char szReqSeqNo[AP_LEN_SEQNO + 1]; UINT nSize; bufclr(szTraceNo); bufclr(szReqSeqNo); bufclr(szSettleDate); nSize = SIZE_TRACENO; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACENO, szTraceNo, &nSize)); nSize = SIZE_SETTLEDATE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_SETTLEDATE, szSettleDate, &nSize)); memcpy(&szReqSeqNo[0], "00", 2); memcpy(&szReqSeqNo[2], szSettleDate, SIZE_SETTLEDATE); memcpy(&szReqSeqNo[6], szTraceNo, SIZE_TRACENO); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQSEQNO, szReqSeqNo)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的请求流水号(对帐请求报文专用)。 */RESULT GetReqSeqNoInSettle(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTraceNo[SIZE_TRACENO + 1]; char szTransmissDateTime[SIZE_TRANSMISSDATETIME + 1]; char szReqSeqNo[AP_LEN_SEQNO + 1]; UINT nSize; bufclr(szTraceNo); bufclr(szReqSeqNo); bufclr(szTransmissDateTime); nSize = SIZE_TRACENO; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACENO, szTraceNo, &nSize)); nSize = SIZE_TRANSMISSDATETIME; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRANSMISSDATETIME, szTransmissDateTime, &nSize)); memcpy(&szReqSeqNo[0], "00", 2); memcpy(&szReqSeqNo[2], szTransmissDateTime, 4); memcpy(&szReqSeqNo[6], szTraceNo, SIZE_TRACENO); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQSEQNO, szReqSeqNo)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的帐号。 */RESULT GetAccNo(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szPan[SIZE_PAN_MAX + 1], *pszAccNo; UINT nSize; bufclr(szPan); pszAccNo = szPan; nSize = SIZE_PAN_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PAN, szPan, &nSize)); while (*pszAccNo != 0 && *pszAccNo == '0') ++pszAccNo; if (!VERIFY(strlen(pszAccNo) >= 12)) return INVALID; ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_ACCNO, pszAccNo)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的密码(把ISO8583密码转为XML明文)。 */RESULT GetAccPwd(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szAccPwd[AP_LEN_ACCPWD + 1], szPan[SIZE_PAN_MAX + 1], *pszPan; char szEntryMode[SIZE_ENTRYMODE + 1]; UCHAR cPin[SIZE_PIN], cPik[SIZE_KEY]; UINT nSize; bufclr(szEntryMode); bufclr(szAccPwd); bufclr(szPan); bufclr(cPik); bufclr(cPin); pszPan = szPan; nSize = SIZE_ENTRYMODE; if (!VERIFY_NORMAL(GetBitInIso8583(piso8583stru, BIT_ENTRYMODE, szEntryMode, &nSize))) szEntryMode[2] = '1'; if (szEntryMode[2] == '2') return NORMAL; nSize = SIZE_PAN_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PAN, szPan, &nSize)); while (*pszPan != 0 && *pszPan == '0') ++pszPan; if (!VERIFY(strlen(pszPan) >= 12)) return INVALID; nSize = SIZE_PIN; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PIN, cPin, &nSize)); ASSERT_NORMAL(GetKey("PIK", (PUCHAR)cPik, NULL)); ASSERT_NORMAL(Ansix98(cPin, szAccPwd, AP_LEN_ACCPWD, cPik, pszPan, FALSE)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_ACCPWD, szAccPwd)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的货币代码。 */RESULT GetCurrType(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szCurrCode[SIZE_CURRCODE + 1]; UINT nSize = SIZE_CURRCODE; bufclr(szCurrCode); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_CURRCODE, szCurrCode, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_CURRTYPE, szCurrCode)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的对帐货币代码。 */RESULT GetCurrTypeInSettle(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szSettleCurrCode[SIZE_SETTLECURRCODE + 1]; UINT nSize = SIZE_SETTLECURRCODE; bufclr(szSettleCurrCode); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_SETTLECURRCODE, szSettleCurrCode, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_CURRTYPE, szSettleCurrCode)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的第二磁道。 */RESULT GetTrack2(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTrack2[SIZE_TRACK2_MAX + 1]; char szEntryMode[SIZE_ENTRYMODE + 1]; UINT nSize; bufclr(szTrack2); bufclr(szEntryMode); nSize = SIZE_ENTRYMODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ENTRYMODE, szEntryMode, &nSize)); if (szEntryMode[1] == '1') return NORMAL; else { nSize = SIZE_TRACK2_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACK2, szTrack2, &nSize)); if (!VERIFY(nSize == SIZE_TRACK2_MAX)) return INVALID; } ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_TRACK2, szTrack2)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的第三磁道。 */RESULT GetTrack3(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTrack3[SIZE_TRACK3_MAX + 1]; char szEntryMode[SIZE_ENTRYMODE + 1]; UINT nSize; bufclr(szTrack3); bufclr(szEntryMode); nSize = SIZE_ENTRYMODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ENTRYMODE, szEntryMode, &nSize)); if (szEntryMode[1] == '1') return NORMAL; else { nSize = SIZE_TRACK3_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACK3, szTrack3, &nSize)); if (!VERIFY(nSize == SIZE_TRACK3_MAX)) return INVALID; } ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_TRACK3, szTrack3)); return NORMAL;}/* * 根据ISO8583报文的第二磁道产生XML报文的有效期段。 */RESULT GetExpDate(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTrack2[SIZE_TRACK2_MAX + 1], szExpDate[AP_LEN_EXPDATE + 1]; char *pcSign; UINT nSize = SIZE_TRACK2_MAX; bufclr(szTrack2); bufclr(szExpDate); if (GetBitInIso8583(piso8583stru, BIT_TRACK2, szTrack2, &nSize) == NORMAL || (pcSign = strchr(szTrack2, '=')) != NULL) memcpy(szExpDate, pcSign + 1, AP_LEN_EXPDATE); if (!ApCsIsValidExpDate(szExpDate)) strcpy(szExpDate, "9912"); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_EXPDATE, szExpDate)); return NORMAL;}/* * 产生XML报文的商户代码。 */RESULT GetMerchNo(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szAcceptorId[SIZE_ACCEPTORID + 1]; UINT nSize = SIZE_ACCEPTORID; bufclr(szAcceptorId); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ACCEPTORID, szAcceptorId, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_MERCHNO, szAcceptorId)); return NORMAL;}/* * 产生XML报文的商户类型。 */RESULT GetMerchType(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szMerchType[SIZE_MERCHTYPE + 1]; UINT nSize = SIZE_MERCHTYPE; bufclr(szMerchType); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_MERCHTYPE, szMerchType, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_MERCHTYPE, szMerchType)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的清算日期。 */RESULT GetSettleDate(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szSettleDate[AP_LEN_DATE + 1]; TIMESTRU timestru; UINT nSize = SIZE_SETTLEDATE; bufclr(szSettleDate); timestru = GetTime(); sprintf(szSettleDate, "%04d", timestru.nYear); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_SETTLEDATE, &szSettleDate[4], &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_SETTLEDATE, szSettleDate)); return NORMAL;}/* * 根据ISO8583报文产生XML报文原请求类型。 */RESULT GetOrgReqType(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szOrgReqType[AP_LEN_REQTYPE + 1]; char szServiceCode[SIZE_SERVICECODE + 1]; UINT nSize; bufclr(szOrgReqType); bufclr(szServiceCode); /* * 注意: * 服务限制码定义为: * 测试环境:011-POS 001-ATM 101-TERM * 生产环境:010-POS 000-ATM 100-TERM */ nSize = SIZE_SERVICECODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_SERVICECODE, szServiceCode, &nSize)); if (strcmp(szServiceCode, SERVICECODE_ATM) == 0) strcpy(szOrgReqType, AP_REQTYPE_ATM); else if (strcmp(szServiceCode, SERVICECODE_POS) == 0) strcpy(szOrgReqType, AP_REQTYPE_POS); else if (strcmp(szServiceCode, SERVICECODE_TERM) == 0) strcpy(szOrgReqType, AP_REQTYPE_TERM); else ASSERT_NORMAL(INVALID); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_ORGREQTYPE, szOrgReqType)); return NORMAL;}/* * 根据ISO8583对帐报文产生XML对帐报文帐户类型。 */RESULT GetAccTypeInSettle(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szAgent[1 + 1]; char szAccType[AP_LEN_ACCTYPE + 1]; char szServiceCode[SIZE_SERVICECODE + 1]; UINT nSize = SIZE_SERVICECODE; bufclr(szServiceCode); bufclr(szAgent); bufclr(szAccType); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_SERVICECODE, szServiceCode, &nSize)); switch (szServiceCode[2]) { case SETTLE_DEBITCARD: strcpy(szAccType, AP_ACCTYPE_DEBITCARD); strcpy(szAgent, "N"); break; case SETTLE_CREDITCARD:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -