📄 handle.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-05 ChenYu - create implementation file for * ISI handling * 2002-01-26 ChenYu - update function RecordJournal for record * traceno, acqid, forwordid in isij */#include "ap.h"#include "apca.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "isi.h";RESULT RecordJournal(PCXMLSTRU pxmlstruReq, PCISO8583STRU piso8583stru){ UINT nSize; EXEC SQL BEGIN DECLARE SECTION; ISIJSTRU isijstru; EXEC SQL END DECLARE SECTION; memset(&isijstru, 0, sizeof(ISIJSTRU)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_REQSEQNO, isijstru.szReqSeqNo)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_ORGREQTYPE, isijstru.szOrgReqType)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_SETTLEDATE, isijstru.szSettleDate)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_AGENT, isijstru.szAgent)); nSize = SIZE_TRACENO; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACENO, isijstru.szTraceNo, &nSize)); nSize = SIZE_ACQID_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ACQID, isijstru.szAcqId, &nSize)); nSize = SIZE_FORWARDID_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_FORWARDID, isijstru.szForwardId, &nSize)); EXEC SQL INSERT isij VALUES(:isijstru); if (sqlca.sqlcode == SQLCODE_DUPKEY) return NORMAL; ASSERT_SQL_NORMAL(); return NORMAL;}/* * 取冲正标识。 */BOOL IsReverse(PISO8583STRU piso8583stru){ char szMsgId[SIZE_MSGID + 1]; UINT nSize = SIZE_MSGID; bufclr(szMsgId); GetBitInIso8583(piso8583stru, BIT_MSGID, szMsgId, &nSize); return strcmp(szMsgId, "0420") == 0;}RESULT FillRespIso8583(PISO8583STRU piso8583stru, PCSTR pszRespCode){ char szMsgId[SIZE_MSGID + 1]; UINT nSize = SIZE_MSGID; bufclr(szMsgId); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_MSGID, szMsgId, &nSize)); szMsgId[2]++; SetBitInIso8583(piso8583stru, BIT_MSGID, szMsgId, SIZE_MSGID); ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_RESPCODE, pszRespCode, SIZE_RESPCODE)); return NORMAL;}/* * ASSURE_NORMAL宏用来确保在处理请求ISO8583报文时某些操作成功。 * 必须注意,该宏在检测到错误时把错误信息反映到报文中,而函数返回正常! * 另外,如果错误即非INVALID,也不是EXCEPTION,将保持当前的应答码 * 不变。 */#define ASSURE_NORMAL(r) \ { \ RESULT rTemp = (r); \ if (rTemp == EXCEPTION) \ VERIFY_NORMAL(FillRespIso8583(piso8583stru, "96")); \ if (rTemp == INVALID) \ VERIFY_NORMAL(FillRespIso8583(piso8583stru, "30")); \ if (rTemp == MACERR) \ VERIFY_NORMAL(FillRespIso8583(piso8583stru, "Z2")); \ if (!VERIFY_NORMAL(rTemp)) \ { \ SetBitInIso8583(piso8583stru, BIT_ENTRYMODE, NULL, 0); \ SetBitInIso8583(piso8583stru, BIT_PINCAPTURECODE, NULL, 0); \ SetBitInIso8583(piso8583stru, BIT_TRACK2, NULL, 0); \ SetBitInIso8583(piso8583stru, BIT_TRACK3, NULL, 0); \ SetBitInIso8583(piso8583stru, BIT_ACCEPTORNAME, NULL, 0); \ SetBitInIso8583(piso8583stru, BIT_PIN, NULL, 0); \ SetBitInIso8583(piso8583stru, BIT_ORGDATA, NULL, 0); \ \ if (nBit > 0) \ VERIFY_NORMAL(SetMac(piso8583stru, cTransMac, nBit)); \ \ DeleteXml(&xmlstruReq); \ DeleteXml(&xmlstruResp); \ return NORMAL; \ } \ }#define RETURN_RESULT(r) \ { \ DeleteXml(&xmlstruReq); \ DeleteXml(&xmlstruResp); \ return (r); \ }#define INSERT_MSGTYPE(IsReverse) \ AP_INSERT_EXT(AP_PATH_MSGTYPE, IsReverse ? \ AP_MSGTYPE_CANCELREQ : AP_MSGTYPE_SUBMITREQ)/* * 查询帐户余额。 */ RESULT HandleQueryBal(PISO8583STRU piso8583stru){ UINT nBit = 0; XMLSTRU xmlstruReq, xmlstruResp; PXMLSTRU pxmlstruReq, pxmlstruResp; pxmlstruReq = &xmlstruReq; pxmlstruResp = &xmlstruResp; memset(&xmlstruReq, 0, sizeof(xmlstruReq)); memset(&xmlstruResp, 0, sizeof(xmlstruResp)); ASSURE_NORMAL(CreateXml(&xmlstruReq, FALSE, AP_PATH_ROOT, NULL)) /* * ISO8583->XML域转换。 */ ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_MSGTYPE, AP_MSGTYPE_SUBMITREQ)) ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_TRANSCODE, AP_TRANSCODE_CS_QUERYBAL)) ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_REQID, AP_REQID_ISI)) ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_TRACKVERIFY, "N")) ASSURE_NORMAL(GetReqDate(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetReqTime(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetReqSeqNo(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetAccNo(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetAccPwd(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetCurrType(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetTrack2(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetTrack3(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetExpDate(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetMerchNo(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetMerchType(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetSettleDate(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetOrgReqType(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetAgent(piso8583stru, pxmlstruReq)) /* * 向后台提交请求。 */ ASSURE_NORMAL(RecordJournal(&xmlstruReq, piso8583stru)) ASSURE_NORMAL(ApCaSubmit(&xmlstruReq, &xmlstruResp)) /* * 清理废弃ISO8583域。 */ SetBitInIso8583(piso8583stru, BIT_ENTRYMODE, NULL, 0); SetBitInIso8583(piso8583stru, BIT_PINCAPTURECODE, NULL, 0); SetBitInIso8583(piso8583stru, BIT_TRACK2, NULL, 0); SetBitInIso8583(piso8583stru, BIT_TRACK3, NULL, 0); SetBitInIso8583(piso8583stru, BIT_ACCEPTORNAME, NULL, 0); SetBitInIso8583(piso8583stru, BIT_PIN, NULL, 0); /* * XML->ISO8583域转换。 */ VERIFY_NORMAL(SetRespCode(pxmlstruResp, piso8583stru)); VERIFY_NORMAL(SetAddResp(pxmlstruResp, piso8583stru)); if (ApIsRespCode(&xmlstruResp, AP_RESPCODE_ACCEPT)) { if (!VERIFY_NORMAL(SetAddAmt(pxmlstruResp, piso8583stru)) || !VERIFY_NORMAL(SetIdNo(pxmlstruResp, piso8583stru))) RETURN_RESULT(EXCEPTION) } else if (ApIsRespCode(&xmlstruResp, AP_RESPCODE_EXCEPTION)) RETURN_RESULT(EXCEPTION) RETURN_RESULT(NORMAL)}/* * 查询帐户状态。 */RESULT HandleQueryStatus(PISO8583STRU piso8583stru){ UINT nBit = 0; XMLSTRU xmlstruReq, xmlstruResp; PXMLSTRU pxmlstruReq, pxmlstruResp; pxmlstruReq = &xmlstruReq; pxmlstruResp = &xmlstruResp; memset(&xmlstruReq, 0, sizeof(xmlstruReq)); memset(&xmlstruResp, 0, sizeof(xmlstruResp)); ASSURE_NORMAL(CreateXml(&xmlstruReq, FALSE, AP_PATH_ROOT, NULL)) /* * ISO8583->XML域转换。 */ ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_MSGTYPE, AP_MSGTYPE_SUBMITREQ)) ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_TRANSCODE, AP_TRANSCODE_CS_QUERYSTATUS)) ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_REQID, AP_REQID_ISI)) ASSURE_NORMAL(AP_INSERT_EXT(AP_PATH_TRACKVERIFY, "Y")) ASSURE_NORMAL(GetReqDate(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetReqTime(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetReqSeqNo(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetAccNo(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetCurrType(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetTrack2(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetTrack3(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetExpDate(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetMerchNo(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetMerchType(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetSettleDate(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetOrgReqType(piso8583stru, pxmlstruReq)) ASSURE_NORMAL(GetAgent(piso8583stru, pxmlstruReq)) /* * 向后台提交请求。 */ ASSURE_NORMAL(RecordJournal(&xmlstruReq, piso8583stru)) ASSURE_NORMAL(ApCaSubmit(&xmlstruReq, &xmlstruResp)) SetBitInIso8583(piso8583stru, BIT_ENTRYMODE, NULL, 0); SetBitInIso8583(piso8583stru, BIT_PINCAPTURECODE, NULL, 0); SetBitInIso8583(piso8583stru, BIT_TRACK2, NULL, 0); SetBitInIso8583(piso8583stru, BIT_TRACK3, NULL, 0); SetBitInIso8583(piso8583stru, BIT_ACCEPTORNAME, NULL, 0); /* * XML->ISO8583域转换。 */ VERIFY_NORMAL(SetRespCode(pxmlstruResp, piso8583stru)); VERIFY_NORMAL(SetAddResp(pxmlstruResp, piso8583stru)); if (ApIsRespCode(&xmlstruResp, AP_RESPCODE_ACCEPT)) { if (!VERIFY_NORMAL(SetAddAmt(&xmlstruResp, piso8583stru)) || !VERIFY_NORMAL(SetIdNo(pxmlstruResp, piso8583stru))) RETURN_RESULT(EXCEPTION) } if (ApIsRespCode(&xmlstruResp, AP_RESPCODE_EXCEPTION)) RETURN_RESULT(EXCEPTION) RETURN_RESULT(NORMAL)}/* * 消费。 */ RESULT GetConsume(PXMLSTRU pxmlstruReq, PCISO8583STRU piso8583stru, BOOL bIsReverse){ ASSERT_NORMAL(INSERT_MSGTYPE(bIsReverse)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_TRANSCODE, AP_TRANSCODE_CS_CONSUME)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQID, AP_REQID_ISI)); ASSERT_NORMAL(GetReqDate(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetReqTime(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetAccNo(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetCurrType(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetAmt(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetFee(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetMerchNo(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetMerchType(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetOrgReqType(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetSettleDate(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetAgent(piso8583stru, pxmlstruReq)); if (!bIsReverse) { ASSERT_NORMAL(GetReqSeqNo(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetAccPwd(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetTrack2(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetTrack3(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(GetExpDate(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_TRACKVERIFY, "Y")); } else { ASSERT_NORMAL(GetReqSeqNoInReverse(piso8583stru, pxmlstruReq)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_TRACKVERIFY, "N")); } return NORMAL;}RESULT SetConsume(PISO8583STRU piso8583stru, PCXMLSTRU pxmlstruResp, BOOL bIsReverse){ SetBitInIso8583(piso8583stru, BIT_ENTRYMODE, NULL, 0); SetBitInIso8583(piso8583stru, BIT_PINCAPTURECODE, NULL, 0); SetBitInIso8583(piso8583stru, BIT_TRACK2, NULL, 0); SetBitInIso8583(piso8583stru, BIT_TRACK3, NULL, 0); SetBitInIso8583(piso8583stru, BIT_ACCEPTORNAME, NULL, 0); SetBitInIso8583(piso8583stru, BIT_PIN, NULL, 0); SetBitInIso8583(piso8583stru, BIT_ORGDATA, NULL, 0); ASSERT_NORMAL(SetRespCode(pxmlstruResp, piso8583stru)); ASSERT_NORMAL(SetAddResp(pxmlstruResp, piso8583stru)); if (!bIsReverse) { ASSERT_NORMAL(SetExpDate(pxmlstruResp, piso8583stru)); ASSERT_NORMAL(SetAuthResp(pxmlstruResp, piso8583stru)); ASSERT_NORMAL(SetAddAmt(pxmlstruResp, piso8583stru)); } ASSERT_NORMAL(SetMac(piso8583stru, cTransMac, bIsReverse ? BIT_MAC128 : BIT_MAC64)); return NORMAL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -