📄 converse.cpre
字号:
/* * This is a part of the Application Preconsole * - Service Provide - 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 packet. */#include "ap.h"#include "apsc.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "isi.h";PCSTR pszRespCode[][2] = { {"00", AP_RESPCODE_ACCEPT }, /* 承兑或交易成功 */ {"01", AP_RESPCODE_CARD_REFISSUE }, /* 查发卡方 */ {"02", AP_RESPCODE_CARD_REFISSUE }, /* 查发卡方的特殊条件 */ {"03", AP_RESPCODE_MERCH_INVALID }, /* 无效商户 */ {"04", AP_RESPCODE_CARD_CONFISCATE }, /* 没收卡 */ {"05", AP_RESPCODE_REJECT }, /* 不予承兑 */ {"06", AP_RESPCODE_SYSERR }, /* 出错 */ {"07", AP_RESPCODE_CARD_CONFISCATE }, /* 特殊条件下没收卡 */ {"09", AP_RESPCODE_ORGTRANS_INPROC }, /* 请求正在处理中 */ {"12", AP_RESPCODE_REJECT }, /* 无效交易 */ {"13", AP_RESPCODE_AMT_INVALID }, /* 无效金额 */ {"14", AP_RESPCODE_CARDNO_INVALID }, /* 无效卡号 */ {"15", AP_RESPCODE_CARD_NOTACCEPT }, /* 无此发卡方 */ {"19", AP_RESPCODE_SERVICE_RETRY }, /* 重新送入交易 */ {"20", AP_RESPCODE_REJECT }, /* 无效应答 */ {"21", AP_RESPCODE_REJECT }, /* 不作任何处理 */ {"22", AP_RESPCODE_REJECT }, /* 怀疑操作有误 */ {"23", AP_RESPCODE_FEE_ERR }, /* 不可接受的交易费 */ {"25", AP_RESPCODE_ORGTRANS_NOTEXIST }, /* 未能找到文件上记录 */ {"30", AP_RESPCODE_SYSERR }, /* 格式错误 */ {"31", AP_RESPCODE_CARD_NOTACCEPT }, /* 交换中心不支持的银行 */ {"33", AP_RESPCODE_CARD_CONFISCATE }, /* 过期的卡(没收卡) */ {"34", AP_RESPCODE_CARD_CONFISCATE }, /* 有作弊嫌疑(没收卡) */ {"35", AP_RESPCODE_CARD_CONFISCATE }, /* 与安保部门联系(没收卡)*/ {"36", AP_RESPCODE_CARD_CONFISCATE }, /* 受限制的卡(没收卡)*/ {"37", AP_RESPCODE_CARD_CONFISCATE }, /* 呼受理方安保部门(没收卡)*/ {"38", AP_RESPCODE_CARD_CONFISCATE }, /* PIN输入次数超限(没收卡)*/ {"39", AP_RESPCODE_ACC_NOTEXIST }, /* 无此信用卡帐户 */ {"40", AP_RESPCODE_SERVICE_NOTSUPPORT }, /* 请求的功能尚不支持 */ {"41", AP_RESPCODE_CARD_CONFISCATE }, /* 挂失卡(没收卡)*/ {"42", AP_RESPCODE_ACC_NOTEXIST }, /* 无此帐户 */ {"43", AP_RESPCODE_CARD_CONFISCATE }, /* 被窃卡(没收卡)*/ {"44", AP_RESPCODE_ACC_NOTEXIST }, /* 无此投资帐户 */ {"51", AP_RESPCODE_ACC_BALLACK }, /* 无足够的存款 */ {"52", AP_RESPCODE_ACC_NOTEXIST }, /* 无此支票帐户 */ {"53", AP_RESPCODE_ACC_NOTEXIST }, /* 无此储蓄卡帐户 */ {"54", AP_RESPCODE_CARD_EXPIRED }, /* 过期的卡 */ {"55", AP_RESPCODE_ACCPWD_ERR }, /* 不正确的PIN */ {"56", AP_RESPCODE_ACC_NOTEXIST }, /* 无此卡记录 */ {"57", AP_RESPCODE_SERVICE_NOTSUPPORT }, /* 不允许持卡人进行的交易 */ {"58", AP_RESPCODE_SERVICE_NOTSUPPORT }, /* 不允许终端进行的交易 */ {"59", AP_RESPCODE_REJECT }, /* 有作弊嫌疑 */ {"60", AP_RESPCODE_REJECT }, /* 与安保部门联系 */ {"61", AP_RESPCODE_AMT_OUTLMT }, /* 超出取款金额限制 */ {"62", AP_RESPCODE_REJECT }, /* 受限制的卡 */ {"63", AP_RESPCODE_REJECT }, /* 违反安保规定 */ {"64", AP_RESPCODE_ORGTRANS_AMTERR }, /* 原始金额不正确 */ {"65", AP_RESPCODE_WITHDRAWTIME_OUTLMT }, /* 超出取款次数限制 */ {"66", AP_RESPCODE_REJECT }, /* 呼安保部门 */ {"67", AP_RESPCODE_CARD_CONFISCATE }, /* 捕捉(没收卡)*/ {"68", AP_RESPCODE_REJECT }, /* 收到的回答太迟 */ {"75", AP_RESPCODE_ACCPWD_TIMEOUTLMT }, /* PIN 输入次数超限 */ {"90", AP_RESPCODE_SYS_INTERMIT }, /* 日期切换正在处理 */ {"91", AP_RESPCODE_REJECT }, /* 发卡方或交换中心不能操作 */ {"92", AP_RESPCODE_CARD_NOTACCEPT }, /* 目标机构找不到或无法达到 */ {"93", AP_RESPCODE_REJECT }, /* 交易违法、不能完成 */ {"94", AP_RESPCODE_DUPCREDITTRANS }, /* 重复交易 */ {"95", AP_RESPCODE_SYSERR }, /* 调节控制错 */ {"96", AP_RESPCODE_SYSERR }, /* 系统异常、失效 */ {"97", AP_RESPCODE_REQID_INVALID }, /* ATM/POS 终端号找不到 */ {"98", AP_RESPCODE_SYSERR }, /* 交换中心收不到发卡方应答 */ {"99", AP_RESPCODE_ACCPWD_ERR }, /* PIN 格式错 */ {"Z2", AP_RESPCODE_SYSERR }, /* MAC鉴别失败 */ {"N1", AP_RESPCODE_SYSERR }, /* 受理行未签到 */ {"N4", AP_RESPCODE_SYSERR }, /* 受理行未签到 */ {"N6", AP_RESPCODE_SYSERR }, /* 发卡行通讯失败 */ {NULL, NULL }};/* * 判断是否冲正请求。 */RESULT IsReverse(PCXMLSTRU pxmlstruReq, PBOOL pbIsReverse){ char szMsgType[AP_LEN_MSGTYPE + 1]; bufclr(szMsgType); ASSERT_NORMAL(AP_DEMAND(AP_PATH_MSGTYPE, szMsgType)); *pbIsReverse = (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0); return NORMAL;}/* * 手工授权。 */BOOL IsManualAuth(PCXMLSTRU pxmlstruReq){ char szManualAuth[1 + 1]; bufclr(szManualAuth); AP_DEMAND(AP_PATH_MANUALAUTH, szManualAuth); return szManualAuth[0] == 'Y';}/* * 检查ISO8583返回码。 */BOOL IsRespCode(PCISO8583STRU piso8583stru, PCSTR pszRespCode){ char szRespCode[SIZE_RESPCODE + 1]; UINT nSize = SIZE_RESPCODE; bufclr(szRespCode); if (GetBitInIso8583(piso8583stru, BIT_RESPCODE, szRespCode, &nSize) != NORMAL) return FALSE; return strcmp(pszRespCode, szRespCode) == 0;}/* * 公共格式转换函数(XML->ISO8583)。 */RESULT GetPubInfo(PISO8583STRU piso8583stru, PCXMLSTRU pxmlstruReq){ ASSERT_NORMAL(GetPan(pxmlstruReq, piso8583stru)); /* 2 */ ASSERT_NORMAL(GetTransmissDateTime(pxmlstruReq, piso8583stru)); /* 7 */ ASSERT_NORMAL(GetLocalTransTime(pxmlstruReq, piso8583stru)); /* 12 */ ASSERT_NORMAL(GetLocalTransDate(pxmlstruReq, piso8583stru)); /* 13 */ ASSERT_NORMAL(GetAcqSettleDate(pxmlstruReq, piso8583stru)); /* 17 */ ASSERT_NORMAL(GetMerchType(pxmlstruReq, piso8583stru)); /* 18 */ ASSERT_NORMAL(GetEntryMode(pxmlstruReq, piso8583stru)); /* 22 */ ASSERT_NORMAL(GetConditionCode(pxmlstruReq, piso8583stru)); /* 25 */ ASSERT_NORMAL(GetAcqId(pxmlstruReq, piso8583stru)); /* 32 */ ASSERT_NORMAL(GetForwardId(pxmlstruReq, piso8583stru)); /* 33 */ ASSERT_NORMAL(GetServiceCode(pxmlstruReq, piso8583stru)); /* 40 */ ASSERT_NORMAL(GetTermId(pxmlstruReq, piso8583stru)); /* 41 */ ASSERT_NORMAL(GetAcceptorId(pxmlstruReq, piso8583stru)); /* 42 */ ASSERT_NORMAL(GetAcceptorName(pxmlstruReq, piso8583stru)); /* 43 */ ASSERT_NORMAL(GetCurrCode(pxmlstruReq, piso8583stru)); /* 49 */ return NORMAL;}/* * 获取冲正所需的原始数据。 */RESULT GetOrgInfo(PCSTR pszSeqNo, PISO8583STRU piso8583stru){ ISIDSTRU isidstru; ASSERT_NORMAL(GetOrgDetail(pszSeqNo, &isidstru)); ASSERT_NORMAL(GetOrgPan(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgProcessCode(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgTransAmt(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgSettleDate(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgAcqSettleDate(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgMerchType(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgConditionCode(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgTransFee(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgAcqId(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgForwardId(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgAuthResp(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgServiceCode(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgEntryMode(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgTermId(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgAcceptorId(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgAcceptorName(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgAddResp(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgCurrCode(&isidstru, piso8583stru)); ASSERT_NORMAL(GetOrgData(&isidstru, piso8583stru)); return NORMAL;}/* * 读ISID记录(读冲正或撤销或退货交易的原交易) */RESULT GetOrgDetail(PCSTR pszSeqNo, PISIDSTRU pisidstru){ EXEC SQL BEGIN DECLARE SECTION ; char szSeqNo[AP_LEN_SEQNO + 1]; ISIDSTRU isidstru; EXEC SQL END DECLARE SECTION ; bufclr(szSeqNo); memset(&isidstru, 0, sizeof(ISIDSTRU)); strcpy(szSeqNo, pszSeqNo); EXEC SQL SELECT * INTO :isidstru FROM isid WHERE seqno = :szSeqNo; ASSERT_SQL_NORMAL(); memcpy(pisidstru, &isidstru, sizeof(ISIDSTRU)); return NORMAL;}/* * 产生ISO8583报文的原始处理码。 */ RESULT GetOrgProcessCode(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_PROCESSCODE, pisidstru->szProcessCode, SIZE_PROCESSCODE)); return NORMAL;}/* * 产生ISO8583报文的原始帐号。 */ RESULT GetOrgPan(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_PAN, pisidstru->szPan, SIZE_PAN_MAX)); return NORMAL;}/* * 产生ISO8583报文的原始交易金额。 */ RESULT GetOrgTransAmt(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_TRANSAMT, pisidstru->szTransAmt, SIZE_TRANSAMT)); return NORMAL;}/* * 产生ISO8583报文的原始清算日期。 */ RESULT GetOrgSettleDate(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ if (strlen(TrimString(pisidstru->szSettleDate)) == 0) strcpy(pisidstru->szSettleDate, "0101"); ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_SETTLEDATE, pisidstru->szSettleDate, SIZE_SETTLEDATE)); return NORMAL;}/* * 产生ISO8583报文的原始受理方清算日期。 */ RESULT GetOrgAcqSettleDate(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ACQSETTLEDATE, pisidstru->szAcqSettleDate, SIZE_ACQSETTLEDATE)); return NORMAL;}/* * 产生ISO8583报文的原始商户类型。 */ RESULT GetOrgMerchType(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_MERCHTYPE, pisidstru->szMerchType, SIZE_MERCHTYPE)); return NORMAL;}/* * 产生ISO8583报文的原始输入方式码。 */ RESULT GetOrgEntryMode(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ENTRYMODE, pisidstru->szEntryMode, SIZE_ENTRYMODE)); return NORMAL;}/* * 产生ISO8583报文的原始服务点条件码。 */ RESULT GetOrgConditionCode(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_CONDITIONCODE, pisidstru->szConditionCode, SIZE_CONDITIONCODE)); return NORMAL;}/* * 产生ISO8583报文的原始手续费。 */ RESULT GetOrgTransFee(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_TRANSFEE, pisidstru->szTransFee, SIZE_TRANSFEE)); return NORMAL;}/* * 产生ISO8583报文的原受理方机构代码。 */ RESULT GetOrgAcqId(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ACQID, pisidstru->szAcqId, SIZE_ACQID_MAX)); return NORMAL;}/* * 产生ISO8583报文的原发卡方机构代码。 */ RESULT GetOrgForwardId(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ if (strlen(TrimString(pisidstru->szForwardId)) == 0) strcpy(pisidstru->szForwardId, "63000000000"); ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_FORWARDID, pisidstru->szForwardId, SIZE_FORWARDID_MAX)); return NORMAL;}/* * 产生ISO8583报文的原始授权码。 */ RESULT GetOrgAuthResp(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ if (strlen(TrimString(pisidstru->szAuthResp)) == 0) strcpy(pisidstru->szAuthResp, " "); ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_AUTHRESP, pisidstru->szAuthResp, SIZE_AUTHRESP)); return NORMAL;}/* * 产生ISO8583报文的原始服务限制码。 */ RESULT GetOrgServiceCode(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_SERVICECODE, pisidstru->szServiceCode, SIZE_SERVICECODE)); return NORMAL;}/* * 产生ISO8583报文的原始终端号。 */ RESULT GetOrgTermId(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_TERMID, pisidstru->szTermId, SIZE_TERMID)); return NORMAL;}/* * 产生ISO8583报文的原受卡方标识码(商户号)。 */ RESULT GetOrgAcceptorId(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ACCEPTORID, pisidstru->szAcceptorId, SIZE_ACCEPTORID)); return NORMAL;}/* * 产生ISO8583报文的原受卡方名称。 */ RESULT GetOrgAcceptorName(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ACCEPTORNAME, pisidstru->szAcceptorName, SIZE_ACCEPTORNAME)); return NORMAL;}/* * 产生ISO8583报文的原始发卡方流水号。 */ RESULT GetOrgAddResp(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ if (strlen(TrimString(pisidstru->szAddResp)) == 0) InitString(pisidstru->szAddResp, '0', SIZE_ADDRESP_MAX); ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ADDRESP, pisidstru->szAddResp, SIZE_ADDRESP_MAX)); return NORMAL;}/* * 产生ISO8583报文的原货币代码。 */ RESULT GetOrgCurrCode(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_CURRCODE, pisidstru->szCurrCode, SIZE_CURRCODE)); return NORMAL;}/* * 原始数据元。 */ RESULT GetOrgData(PISIDSTRU pisidstru, PISO8583STRU piso8583stru){ char szOrgData[SIZE_ORGDATA + 1]; bufclr(szOrgData); memcpy(&szOrgData[0], pisidstru->szMsgId, SIZE_MSGID); memcpy(&szOrgData[4], pisidstru->szProcessCode, SIZE_PROCESSCODE); memcpy(&szOrgData[10], pisidstru->szAcqSettleDate, SIZE_ACQSETTLEDATE); memcpy(&szOrgData[14], pisidstru->szSeqNo, AP_LEN_SEQNO); memcpy(&szOrgData[26], &pisidstru->szAcqId[1], 10); if (strlen(TrimString(pisidstru->szTraceNo)) == 0) memset(&szOrgData[36], '0', SIZE_TRACENO); else memcpy(&szOrgData[36], pisidstru->szTraceNo, SIZE_TRACENO); ASSERT_NORMAL(SetBitInIso8583(piso8583stru, BIT_ORGDATA, szOrgData, SIZE_ORGDATA)); return NORMAL;}/* * ISO8583->XML转换函数。 *//* * 根据ISO8583报文产生XML报文的帐户类型。 */ RESULT SetAccType(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruResp){ char szAccType[AP_LEN_ACCTYPE + 1]; char szAddAmt[SIZE_ADDAMT_MAX + 1]; UINT nSize = SIZE_ADDAMT_MAX; bufclr(szAddAmt); bufclr(szAccType); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ADDAMT, szAddAmt, &nSize)); if (memcmp(szAddAmt, "30", 2) == 0) strcpy(szAccType, AP_ACCTYPE_CREDITCARD); else strcpy(szAccType, AP_ACCTYPE_DEBITCARD); ASSERT_NORMAL(AP_INSERT(AP_PATH_ACCTYPE, szAccType)); return NORMAL;}/* * 根据ISO8583报文产生XML报文的可用余额。 */RESULT SetAvailBal(PCISO8583STRU piso8583stru, PXMLSTRU pxmlstruResp){ char szAvailBal[AP_LEN_BAL + 1]; char szAddAmt[SIZE_ADDAMT_MAX + 1]; UINT nSize = SIZE_ADDAMT_MAX; bufclr(szAddAmt); bufclr(szAvailBal); ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ADDAMT, szAddAmt, &nSize)); memcpy(szAvailBal, &szAddAmt[28], 12); sprintf(szAvailBal, "%19.2lf", atof(szAvailBal) / 100.0 * (szAddAmt[27] == 'D' ? -1.0 : 1.0)); ASSERT_NORMAL(AP_INSERT(AP_PATH_AVAILBAL, szAvailBal));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -