📄 handle.cpre
字号:
/* * This is a part of the Application Preconsole * - Channel Access - POS. * 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-03 HuangRunLang - create implemention file for * transaction handling */#include "ap.h"#include "apca.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "pos.h";EXEC SQL INCLUDE "posext.h";extern char szConvKeyTime[LEN_CONVKEYTIME + 1];/* * Types and structures defined in this file */typedef struct tagTRANSSTRU{ PCSTR pszMsgId; PCSTR pszTransType; PCSTR pszTransCode;} TRANSSTRU;typedef TRANSSTRU * PTRANSSTRU;typedef const TRANSSTRU CTRANSSTRU;typedef const TRANSSTRU * PCTRANSSTRU;/* * Variables declared in this file */PCSTR pszRespCode[][2] = { {AP_RESPCODE_ACCEPT , "00"}, /* 批准或成功地完成 */ {AP_RESPCODE_REJECT , "12"}, /* 无效交易 */ {AP_RESPCODE_SYSERR , "96"}, /* 系统故障 */ {AP_RESPCODE_LOGERR , "96"}, /* 系统故障 */ {AP_RESPCODE_SYS_INTERMIT , "91"}, /* 发卡方或交换中心不能操作 */ {AP_RESPCODE_SERVICE_INTERMIT , "91"}, /* 发卡方或交换中心不能操作 */ {AP_RESPCODE_SERVICE_NOTSUPPORT, "57"}, /* 不允许持卡人进行的交易 */ {AP_RESPCODE_REQID_INVALID , "89"}, /* 无效终端 */ {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 , "38"}, /* 超过允许的PIN试输入(没收卡) */ {AP_RESPCODE_AMT_INVALID , "13"}, /* 无效金额 */ {AP_RESPCODE_ORGTRANS_NOTEXIST , "25"}, /* 未能找到文件上记录 */ {AP_RESPCODE_ORGTRANS_CANCELED , "86"}, /* 原交易已改变 */ {AP_RESPCODE_ORGTRANS_AMTERR , "64"}, /* 原始金额不正确 */ {AP_RESPCODE_SETTLE_NOTEQUAL , "95"}, /* 结算不平 */ {AP_RESPCODE_CARD_REFISSUE , "01"}, /* 请查询银行方 */ {AP_RESPCODE_CARD_CONFISCATE , "04"}, /* 没收卡 */ {AP_RESPCODE_CARD_NOTACCEPT , "15"}, /* 无此发卡方 */ {AP_RESPCODE_CARD_EXPIRED , "54"}, /* 过期的卡 */ {AP_RESPCODE_CARDNO_INVALID , "14"}, /* 无效卡号 */ {AP_RESPCODE_AUTH_NOTEXIST , "25"}, /* 未能找到文件上记录 */ {AP_RESPCODE_MERCH_INVALID , "03"}, /* 无效商户 */ {NULL , NULL}};TRANSSTRU transstru[] = { {"0100", "31", AP_TRANSCODE_CS_QUERYBAL }, {"0100", "39", AP_TRANSCODE_CS_QUERYSTATUS}, {"0100", "38", AP_TRANSCODE_CS_AUTH }, {"0200", "00", AP_TRANSCODE_CS_CONSUME }, {"0200", "02", AP_TRANSCODE_CS_CANCEL }, {"0200", "17", AP_TRANSCODE_CS_AUTHSETTLE }, {"0200", "20", AP_TRANSCODE_CS_REFUND }, {"0200", "18", TRANSCODE_ADJUST }, {"0800", "92", TRANSCODE_INIT }, {"0500", "92", TRANSCODE_SETTLE }, {"0500", "96", TRANSCODE_SETTLE2 }, {"0300", "" , TRANSCODE_UPLOAD }, {NULL , NULL, NULL }};RESULT RecordJournal(PCXMLSTRU pxmlstruReq){ EXEC SQL BEGIN DECLARE SECTION; POSJSTRU posjstru; EXEC SQL END DECLARE SECTION; ASSERT_NORMAL(AP_DEMAND(AP_PATH_REQID, posjstru.szReqId)); ASSERT_NORMAL(AP_DEMAND(AP_PATH_REQSEQNO, posjstru.szReqSeqNo)); AP_DEMAND(AP_PATH_VOUCHNO, posjstru.szVouchNo); ASSERT_NORMAL(AP_DEMAND(AP_PATH_BATCHNO, posjstru.szBatchNo)); EXEC SQL INSERT posj VALUES(:posjstru); if (sqlca.sqlcode == SQLCODE_DUPKEY) return NORMAL; ASSERT_SQL_NORMAL(); return NORMAL;}RESULT GetTransCodeInUpLoad(PISO8583STRU piso8583stru, PSTR pszTransCode){ char szProcessCode[SIZE_PROCESSCODE + 1]; char szTransType[SIZE_TRANSTYPE + 1]; UINT nSize, n; bufclr(szProcessCode); bufclr(szTransType); nSize = SIZE_PROCESSCODE; GetBitInIso8583(piso8583stru, BIT_PROCESSCODE, szProcessCode, &nSize); memcpy(szTransType, szProcessCode, SIZE_TRANSTYPE); n = 0; while (transstru[n].pszMsgId != NULL) { if (strcmp(szTransType, transstru[n].pszTransType) == 0) { strcpy(pszTransCode, transstru[n].pszTransCode); return NORMAL; } n++; } return INVALID;}RESULT GetTransCodeInReverse(PISO8583STRU piso8583stru, PSTR pszTransCode){ char szMsgId[SIZE_MSGID + 1]; char szProcessCode[SIZE_PROCESSCODE + 1]; char szTransType[SIZE_TRANSTYPE + 1]; UINT nSize, n; bufclr(szMsgId); bufclr(szProcessCode); bufclr(szTransType); nSize = SIZE_MSGID; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_MSGID, szMsgId, &nSize)); nSize = SIZE_PROCESSCODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PROCESSCODE, szProcessCode, &nSize)); memcpy(szTransType, szProcessCode, SIZE_TRANSTYPE); if (strcmp(szMsgId, "0400") == 0) { if (strcmp(szTransType, "38") == 0) { strcpy(pszTransCode, AP_TRANSCODE_CS_AUTH); return NORMAL; } else strcpy(szMsgId, "0200"); } n = 0; while (transstru[n].pszMsgId != NULL) { if (strcmp(szMsgId, transstru[n].pszMsgId) == 0 && strcmp(szTransType, transstru[n].pszTransType) == 0) { strcpy(pszTransCode, transstru[n].pszTransCode); return NORMAL; } n++; } return INVALID;}RESULT GetTransCode(PISO8583STRU piso8583stru, PSTR pszTransCode){ char szMsgId[SIZE_MSGID + 1]; char szProcessCode[SIZE_PROCESSCODE + 1]; char szTransType[SIZE_TRANSTYPE + 1]; UINT nSize, n; bufclr(szMsgId); bufclr(szProcessCode); bufclr(szTransType); nSize = SIZE_MSGID; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_MSGID, szMsgId, &nSize)); nSize = SIZE_PROCESSCODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PROCESSCODE, szProcessCode, &nSize)); memcpy(szTransType, szProcessCode, SIZE_TRANSTYPE); if (strcmp(szMsgId, "0300") == 0) { strcpy(pszTransCode, TRANSCODE_UPLOAD); return NORMAL; } n = 0; while (transstru[n].pszMsgId != NULL) { if (strcmp(szMsgId, transstru[n].pszMsgId) == 0 && strcmp(szTransType, transstru[n].pszTransType) == 0) { strcpy(pszTransCode, transstru[n].pszTransCode); return NORMAL; } n++; } return INVALID;}RESULT GetReqDateTime(PXMLSTRU pxmlstruReq){ TIMESTRU timestru; char szReqDate[AP_LEN_DATE + 1]; char szReqTime[AP_LEN_TIME + 1]; bufclr(szReqDate); bufclr(szReqTime); timestru = GetTime(); sprintf(szReqTime, "%02d%02d%02d", timestru.nHour, timestru.nMin, timestru.nSec); sprintf(szReqDate, "%04d%02d%02d", timestru.nYear, timestru.nMon, timestru.nDay); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQDATE,szReqDate)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_REQTIME,szReqTime)); return NORMAL;}RESULT GetAccNo(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szPan[SIZE_PAN_MAX + 1]; UINT nSize; bufclr(szPan); nSize = SIZE_PAN_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PAN, szPan, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_ACCNO, szPan)); return NORMAL;}RESULT GetMerchNo(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szMerchId[SIZE_MERCHID + 1]; UINT nSize; bufclr(szMerchId); nSize = SIZE_MERCHID; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_MERCHID, szMerchId, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_MERCHNO, szMerchId)); return NORMAL;}RESULT GetAccPwd(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq, PUCHAR pcKey){ char szEntryMode[SIZE_ENTRYMODE + 1]; char szAccPwd[AP_LEN_ACCPWD + 1]; char szPan[SIZE_PAN_MAX + 1]; UCHAR cPin[SIZE_PIN]; UINT nSize; bufclr(szEntryMode); bufclr(szAccPwd); bufclr(szPan); bufclr(cPin); nSize = SIZE_ENTRYMODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ENTRYMODE, szEntryMode, &nSize)); if (szEntryMode[2] != '1') return NORMAL; nSize = SIZE_PIN; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PIN, cPin, &nSize)); nSize = SIZE_PAN_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_PAN, szPan, &nSize)); ASSERT_NORMAL(Ansix98(cPin, szAccPwd, AP_LEN_ACCPWD, pcKey, szPan, FALSE)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_ACCPWD, szAccPwd)); return NORMAL;}RESULT GetCurrType(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szFundType[SIZE_FUNDTYPE + 1]; UINT nSize; bufclr(szFundType); nSize = SIZE_FUNDTYPE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_FUNDTYPE, szFundType, &nSize)); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_CURRTYPE, szFundType)); return NORMAL;}RESULT GetAmt(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szAmt[AP_LEN_AMT + 1], szPosAmt[SIZE_AMT + 1]; UINT nSize; bufclr(szAmt); bufclr(szPosAmt); nSize = SIZE_AMT; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_AMT, szPosAmt, &nSize)); sprintf(szAmt, "%19.2lf", atof(szPosAmt) / 100); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_AMT, szAmt)); return NORMAL;}RESULT GetExpDate(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTrack2[SIZE_TRACK2_MAX + 1]; char szExpDate[SIZE_EXPDATE + 1]; char szEntryMode[SIZE_ENTRYMODE + 1]; UINT nSize; char *pcSign; bufclr(szTrack2); bufclr(szExpDate); bufclr(szEntryMode); nSize = SIZE_ENTRYMODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ENTRYMODE, szEntryMode, &nSize)); if (memcmp(szEntryMode, "01", 2) == 0) { nSize = SIZE_EXPDATE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_EXPDATE, szExpDate, &nSize)); if (strcmp(szExpDate, "0000") == 0) strcpy(szExpDate, "9912"); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_EXPDATE, szExpDate)); return NORMAL; } DETECT(memcmp(szEntryMode, "02", 2) == 0); /* * 按照联网联合关于磁条的规范,所有银行卡都必须使用第二磁道,所以 * 如果输入模式是刷卡,则必定包含第二磁道信息。 */ nSize = SIZE_TRACK2_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACK2, szTrack2, &nSize)); DETECT_NULL(pcSign = strchr(szTrack2, 'D')); memcpy(szExpDate, pcSign + 1, SIZE_EXPDATE); if (!ApCsIsValidExpDate(szExpDate)) strcpy(szExpDate, "9912"); ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_EXPDATE, szExpDate)); return NORMAL;}RESULT GetTrack2(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTrack2[SIZE_TRACK2_MAX + 1]; char szEntryMode[SIZE_ENTRYMODE + 1]; UINT n, nSize; bufclr(szTrack2); bufclr(szEntryMode); nSize = SIZE_ENTRYMODE; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_ENTRYMODE, szEntryMode, &nSize)); if (memcmp(szEntryMode, "01", 2) == 0) return NORMAL; DETECT(memcmp(szEntryMode, "02", 2) == 0); nSize = SIZE_TRACK2_MAX; ASSERT_NORMAL(GetBitInIso8583(piso8583stru, BIT_TRACK2, szTrack2, &nSize)); for (n = 0; n < nSize; n++) if (szTrack2[n] == 'D') szTrack2[n] = '='; ASSERT_NORMAL(AP_INSERT_EXT(AP_PATH_TRACK2, szTrack2)); return NORMAL;}RESULT GetTrack3(PISO8583STRU piso8583stru, PXMLSTRU pxmlstruReq){ char szTrack3[SIZE_TRACK3_MAX + 1]; char szEntryMode[SIZE_ENTRYMODE + 1]; UINT n, nSize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -