📄 agentauth.cpre
字号:
/* * This is a part of the Application Preconsole * - Service Provide - Internal Switch Interface. * Copyright (C) 2001-2001 ChenYu 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-10-09 ChenYu - create implementation file for agent * authorization */#include "ap.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "isi.h";/* * Types and structures defined in this file */EXEC SQL BEGIN DECLARE SECTION;/* * 代授权登记表。 */typedef struct tagAGENTAUTHREGSTRU{ char szAccNo[AP_LEN_ACCNO + 1]; /* 卡号 */ char szDate[AP_LEN_DATE + 1]; /* 交易日期 */ int nTime; /* 交易次数 */ double dTotalAmt; /* 累计金额 */} AGENTAUTHREGSTRU;typedef AGENTAUTHREGSTRU * PAGENTAUTHREGSTRU;typedef const AGENTAUTHREGSTRU CAGENTAUTHREGSTRU;typedef const AGENTAUTHREGSTRU * PCAGENTAUTHREGSTRU;EXEC SQL END DECLARE SECTION ;#define GOLDCARD 'G'#define NORMALCARD 'N'#define RETURN_RESP(szRespCode) \ { \ AP_UPDATE(AP_PATH_RESPCODE, szRespCode); \ return; \ }#define ASSURE(b) \ { \ if (!VERIFY(b)) \ RETURN_RESP(AP_RESPCODE_SYSERR) \ }#define ASSURE_NORMAL(r) \ { \ RESULT rTemp; \ rTemp = (r); \ if (rTemp == EXCEPTION) \ AP_UPDATE(AP_PATH_RESPCODE, AP_RESPCODE_SYSERR); \ if (rTemp == INVALID) \ AP_UPDATE(AP_PATH_RESPCODE, AP_RESPCODE_LOGERR); \ if (!VERIFY_NORMAL(rTemp)) \ return; \ }/* * 检查信用卡是否可以联网交易。 */BOOL IsAgentAuth(PCXMLSTRU pxmlstruReq){ char szAgentAuth[1 + 1]; bufclr(szAgentAuth); AP_DEMAND_CFG(PATH_AGENTAUTH, szAgentAuth); return szAgentAuth[0] == 'Y';}/* * 产生授权号。 */void CreateAuthCode(PSTR pszAuthCode){ srand((UINT)time(NULL)); sprintf(pszAuthCode, "%06ld", (rand() * 97) % 1000000);} /* * 插入代授权交易到ISID表。 */RESULT RecordAgentAuthDetail(PCXMLSTRU pxmlstruReq, PCXMLSTRU pxmlstruResp){ EXEC SQL BEGIN DECLARE SECTION; ISIDSTRU isidstru; EXEC SQL END DECLARE SECTION; char szMsgType[AP_LEN_MSGTYPE + 1]; char szReqDate[AP_LEN_DATE + 1]; char szAmt[AP_LEN_AMT + 1]; memset(&isidstru, 0, sizeof(ISIDSTRU)); bufclr(szReqDate); bufclr(szAmt); bufclr(szMsgType); ASSERT_NORMAL(AP_DEMAND_EXT(AP_PATH_RESPSEQNO, isidstru.szRespSeqNo)); ASSERT_NORMAL(AP_DEMAND_EXT(AP_PATH_AUTHCODE, isidstru.szAuthResp)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_MSGTYPE, szMsgType)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_REQID, isidstru.szTermId)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_ACCNO, isidstru.szPan)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_SEQNO, isidstru.szSeqNo)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_REQDATE, szReqDate)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_REQTIME, isidstru.szLocalTransTime)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_AMT, szAmt)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_TRANSCODE, isidstru.szProcessCode)); sprintf(isidstru.szTransAmt, "%012.0lf", atof(szAmt) * 100.0); strcpy(isidstru.szMsgId, "0150"); /* 0150 暂时表示代授权 */ if (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0) strcpy(isidstru.szMsgId, "0420"); strcat(isidstru.szProcessCode, "50"); /* xxxx50 暂时表示代授权 */ strcpy(isidstru.szTraceNo, "000000"); strcpy(isidstru.szSettleDate, "0000"); strcpy(isidstru.szAcqSettleDate, "0000"); strcpy(isidstru.szLocalTransDate, &szReqDate[4]); strcpy(isidstru.szAcqId, "00000000000"); strcpy(isidstru.szForwardId, "00000000000"); strcpy(isidstru.szAddResp, "000000000000"); strcpy(isidstru.szRespCode, "00"); EXEC SQL INSERT INTO isid VALUES (:isidstru); ASSERT_SQL_NORMAL(); return NORMAL;}void AgentAuth(PCXMLSTRU pxmlstruReq, PXMLSTRU pxmlstruResp){ EXEC SQL BEGIN DECLARE SECTION; AGENTAUTHREGSTRU agentauthregstru; char szAccNo[AP_LEN_ACCNO + 1]; char szTransCode[AP_LEN_TRANSCODE + 1]; char szMsgType[AP_LEN_MSGTYPE + 1]; char szAmt[AP_LEN_AMT + 1]; char szAuthCode[AP_LEN_AUTHCODE + 1]; char szCardType[1 + 1]; char szExpDate[AP_LEN_EXPDATE + 1]; char szReqDate[AP_LEN_DATE + 1]; double dTotalAmt, dAmt; int nTime; EXEC SQL END DECLARE SECTION; char szYearMon[6 + 1]; TIMESTRU timestru; bufclr(szAccNo); bufclr(szTransCode); bufclr(szMsgType); bufclr(szAmt); bufclr(szAuthCode); bufclr(szCardType); bufclr(szReqDate); bufclr(szExpDate); AP_UPDATE(AP_PATH_RESPCODE, AP_RESPCODE_SYS_INTERMIT); ASSURE_NORMAL(AP_DEMAND(AP_PATH_ACCNO, szAccNo)) ASSURE_NORMAL(AP_DEMAND(AP_PATH_TRANSCODE, szTransCode)) ASSURE_NORMAL(AP_DEMAND(AP_PATH_MSGTYPE, szMsgType)) ASSURE_NORMAL(AP_DEMAND(AP_PATH_AMT, szAmt)) ASSURE_NORMAL(AP_DEMAND(AP_PATH_REQDATE, szReqDate)) ASSURE_NORMAL(AP_DEMAND(AP_PATH_EXPDATE, szExpDate)) if (strcmp(szTransCode, AP_TRANSCODE_CS_AUTHSETTLE) == 0) RETURN_RESP(AP_RESPCODE_ACCEPT) if (szAccNo[6] == '4' || szAccNo[6] == '5') szCardType[0] = GOLDCARD; else szCardType[0] = NORMALCARD; /* * 检查交易代授权允许。 */ if (strcmp(szTransCode, AP_TRANSCODE_CS_CONSUME) != 0 && strcmp(szTransCode, AP_TRANSCODE_CS_AUTH) != 0 && strcmp(szTransCode, AP_TRANSCODE_CS_CANCEL) != 0) RETURN_RESP(AP_RESPCODE_SYS_INTERMIT) /* * 有效期检查。 */ bufclr(szYearMon); timestru = GetTime(); sprintf(szYearMon, "%04d%02d", timestru.nYear, timestru.nMon); if (!ApCsIsValidExpDate(szExpDate) || strcmp(&szYearMon[2], szExpDate) > 0) RETURN_RESP(AP_RESPCODE_CARD_EXPIRED) /* * 读帐户交易累计记录。 */ EXEC SQL SELECT time, totalamt INTO :nTime, :dTotalAmt FROM agentauthreg WHERE accno = :szAccNo AND date = :szReqDate; if (sqlca.sqlcode == SQLCODE_NOTFOUND) { nTime = 0; dTotalAmt = 0.0; } else ASSURE(VERIFY_SQL_NORMAL()) dAmt = atof(szAmt); if (strcmp(szTransCode, AP_TRANSCODE_CS_CANCEL) == 0) { if (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0) { nTime++; dTotalAmt += dAmt; } else { nTime--; dTotalAmt -= dAmt; } } else if (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0) { nTime--; dTotalAmt -= dAmt; } else { nTime++; dTotalAmt += dAmt; /* * 代授权次数检查。 */ if (nTime > 3) RETURN_RESP(AP_RESPCODE_AGENTAUTHTIME_OUTLMT) /* * 代授权金额检查。 */ if (!(szCardType[0] == GOLDCARD && dTotalAmt <= 5000 ) && !(szCardType[0] == NORMALCARD && dTotalAmt <= 3000)) RETURN_RESP(AP_RESPCODE_AMT_OUTLMT) /* * 产生代授权码。 */ CreateAuthCode(szAuthCode); ASSURE_NORMAL(AP_INSERT(AP_PATH_AUTHCODE, szAuthCode)) ASSURE_NORMAL(RecordAgentAuthDetail(pxmlstruReq, pxmlstruResp)) } /* * 更新代授权登记表。 */ EXEC SQL UPDATE agentauthreg SET time = :nTime, totalamt = :dTotalAmt WHERE accno = :szAccNo AND date = :szReqDate; if (sqlca.sqlcode == SQLCODE_NOTFOUND) { memset(&agentauthregstru, 0, sizeof(AGENTAUTHREGSTRU)); strcpy(agentauthregstru.szAccNo, szAccNo); strcpy(agentauthregstru.szDate, szReqDate); agentauthregstru.nTime = nTime; agentauthregstru.dTotalAmt = dTotalAmt; EXEC SQL INSERT INTO agentauthreg VALUES(:agentauthregstru); } ASSURE(VERIFY_SQL_NORMAL()) AP_UPDATE(AP_PATH_RESPCODE, AP_RESPCODE_ACCEPT);}/* End of this file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -