📄 linkcs.cpre
字号:
/* * This is a part of the Application Preconsole * - Service Provide - ABIS. * 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-02 HLW - create implementation file for card * service linking function */#include "ap.h"#include "apsc.h"#include "apsp.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "abis.h";EXEC SQL INCLUDE "abisext.h";EXEC SQL INCLUDE "cs.h";/* * Constant macros defined in this file */ /* * Format constant macros */ #define FMT_ICSI_A "%1ld%1ld%1ld%2ld%c%8s%12s%12s%8s" \ "%19s%1ld%19.2lf%19.2lf%19.2lf%104s"#define FMT_ICSI_B "%37s%1ld%4s%6s%15s%6s%40s%1s%18s" \ "%2s%19.2lf%19.2lf%19s%6s%19.2lf%19.2lf"#define FMT_OCSI FMT_ICSI_A FMT_ICSI_B /* * Variable macros */ #define VAR_ICSI_A pcsistru->nChannelType, pcsistru->nServiceType, \ pcsistru->nReverseFlag, pcsistru->nTransCode, \ pcsistru->cDevType, pcsistru->szReqId, \ pcsistru->szSeqNo, pcsistru->szOrgSeqNo, \ pcsistru->szSettleId, \ pcsistru->szAccNo, pcsistru->nAccType, \ pcsistru->dAmt, pcsistru->dFee, pcsistru->dIsiFee, \ pcsistru->szTrack3#define VAR_ICSI_B pcsistru->szTrack2, \ pcsistru->nVerifyFlag, pcsistru->szExpDate, \ pcsistru->szAuthCode, pcsistru->szMerchCode, \ pcsistru->szAccPwd, pcsistru->szAccName, \ pcsistru->szCertType, pcsistru->szCertNo, \ pcsistru->szCurrCode, \ pcsistru->dAvailBal, pcsistru->dBal, \ pcsistru->szTransferAccNo, pcsistru->szNewAccPwd, \ pcsistru->dDsiFee, pcsistru->dKickback #define VAR_OCSI &pcsistru->nChannelType, &pcsistru->nServiceType, \ &pcsistru->nReverseFlag, &pcsistru->nTransCode, \ &pcsistru->cDevType, pcsistru->szReqId, \ pcsistru->szSeqNo, pcsistru->szOrgSeqNo, \ pcsistru->szSettleId, \ pcsistru->szAccNo, &pcsistru->nAccType, \ &pcsistru->dAmt, &pcsistru->dFee, &pcsistru->dIsiFee, \ pcsistru->szTrack3, pcsistru->szTrack2, \ &pcsistru->nVerifyFlag, pcsistru->szExpDate, \ pcsistru->szAuthCode, pcsistru->szMerchCode, \ pcsistru->szAccPwd, pcsistru->szAccName, \ pcsistru->szCertType, pcsistru->szCertNo, \ pcsistru->szCurrCode, \ &pcsistru->dAvailBal, &pcsistru->dBal, \ pcsistru->szTransferAccNo, pcsistru->szNewAccPwd, \ &pcsistru->dDsiFee, &pcsistru->dKickback/* * Card service linking function */void LinkCs(PCSISTRU pcsistru, PCXMLSTRU pxmlstruReq, PXMLSTRU pxmlstruResp, BOOL bIsFinance){ char szMsgType[AP_LEN_MSGTYPE + 1]; char szReqType[AP_LEN_REQTYPE + 1]; char szAccType[AP_LEN_ACCTYPE + 1]; char szAccFlag[AP_LEN_ACCFLAG + 1]; char szBal[AP_LEN_BAL + 1]; char szAvailBal[AP_LEN_BAL + 1]; char szCurrType[AP_LEN_CURRTYPE + 1]; char szVchNum[AP_LEN_VCHNUM + 1]; char szVchArea[AP_LEN_VCHAREA + 1]; char szFee[AP_LEN_FEE + 1]; char szIsiFee[AP_LEN_FEE + 1]; char szDsiFee[AP_LEN_FEE + 1]; char szKickBack[AP_LEN_FEE + 1]; UINT nVchAreaLen, nVchNum, n; TIASTRU tiastru; TOASTRU toastru; /* * 根据请求XML 结构填写CSI 的公共请求信息域。如果填写过程中发现 * 缺乏某些关键域,则认为TSA 有逻辑错误。 */ /* * 首先需要确定冲正交易标志、交易来源渠道与设备类型。 */ AP_DEMAND(AP_PATH_MSGTYPE, szMsgType); AP_DEMAND(AP_PATH_REQID, pcsistru->szReqId); AP_DEMAND(AP_PATH_SEQNO, pcsistru->szSeqNo); if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_REQTYPE, szReqType))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } if (strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0) pcsistru->nReverseFlag = 1; else if (strcmp(szMsgType, AP_MSGTYPE_SUBMITREQ) == 0) pcsistru->nReverseFlag = 0; else { VERIFY(FALSE); ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } if (strcmp(szReqType, AP_REQTYPE_DSI) == 0) { pcsistru->nChannelType = 2; if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_SETTLEDATE, pcsistru->szSettleId))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } } else if (strcmp(szReqType, AP_REQTYPE_ISI) == 0) { pcsistru->nChannelType = 1; if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_SETTLEDATE, pcsistru->szSettleId))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } } else if (strcmp(szReqType, AP_REQTYPE_ATM) == 0) { pcsistru->nChannelType = 0; pcsistru->cDevType = '1'; } else if (strcmp(szReqType, AP_REQTYPE_POS) == 0) { pcsistru->nChannelType = 0; pcsistru->cDevType = '2'; if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_BATCHNO, pcsistru->szSettleId))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } } else if (strcmp(szReqType, AP_REQTYPE_TERM) == 0) { pcsistru->nChannelType = 0; pcsistru->cDevType = '4'; } else if (strcmp(szReqType, AP_REQTYPE_PHONE) == 0) { pcsistru->nChannelType = 0; pcsistru->cDevType = '3'; } else { VERIFY(FALSE); ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } /* * 然后确定处理交易的业务系统类型。 */ AP_DEMAND(AP_PATH_ACCFLAG, szAccFlag); if (strcmp(szAccFlag, AP_ACCFLAG_EXTERN) == 0) pcsistru->nServiceType = 2; else if (strcmp(szAccFlag, AP_ACCFLAG_REMOTE) == 0) pcsistru->nServiceType = 1; else if (strcmp(szAccFlag, AP_ACCFLAG_NATIVE) == 0) pcsistru->nServiceType = 0; else { VERIFY(FALSE); ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } /* * 再确定帐号和帐户类型。 */ if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_ACCNO, pcsistru->szAccNo)) || !VERIFY_NORMAL(AP_DEMAND(AP_PATH_ACCTYPE, szAccType))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } if (strcmp(szAccType, AP_ACCTYPE_CREDITCARD) == 0) { pcsistru->nAccType = 1; if (!VERIFY_NORMAL(AP_DEMAND(AP_PATH_EXPDATE, pcsistru->szExpDate))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_LOGERR); return; } } else if (strcmp(szAccType, AP_ACCTYPE_DEBITCARD) == 0 || strcmp(szAccType, AP_ACCTYPE_UNITECARD) == 0) pcsistru->nAccType = 2; else if (strcmp(szAccType, AP_ACCTYPE_CHECKCARD) == 0) pcsistru->nAccType = 3; else pcsistru->nAccType = 4; /* * 确定手续费。 */ AP_DEMAND(AP_PATH_FEE, szFee); AP_DEMAND(AP_PATH_ISIFEE, szIsiFee); AP_DEMAND(AP_PATH_DSIFEE, szDsiFee); AP_DEMAND(AP_PATH_KICKBACK, szKickBack); pcsistru->dFee = atof(szFee); pcsistru->dIsiFee = atof(szIsiFee); pcsistru->dDsiFee = atof(szDsiFee); pcsistru->dKickback = atof(szKickBack); /* * 打印CSI 结构到TIA 的数据区中,调用LinkAbis提交交易,然后读取 * TOA 数据区中的CSI 信息。 */ memset(&tiastru, 0, sizeof(tiastru)); memset(&toastru, 0, sizeof(toastru)); tiastru.nAppCode = 32; if (bIsFinance) tiastru.nTransCode = 3201; else tiastru.nTransCode = 3202; tprintf(tiastru.szDataA, FMT_ICSI_A, VAR_ICSI_A); tprintf(tiastru.szDataB, FMT_ICSI_B, VAR_ICSI_B); LinkAbis(pxmlstruReq, pxmlstruResp, &tiastru, &toastru); /* * 如果交易失败,或是冲正交易,或是非本地卡业务,则应答信 * 息中只有应答码有效,所以可以立即返回。 */ if (!ApIsRespCode(pxmlstruResp, AP_RESPCODE_ACCEPT) || strcmp(szMsgType, AP_MSGTYPE_CANCELREQ) == 0) return; tscanf(toastru.szData, FMT_OCSI, VAR_OCSI); /* * 读取传票区数据。 */ bufclr(szVchArea); bufclr(szVchNum); if (memcmp(toastru.szData + 420, "9900", 4) == 0) { memcpy(szVchNum, toastru.szData + 420 + 4, 2); nVchNum = atoi(szVchNum); nVchAreaLen = AP_LEN_VCH * nVchNum; /* * 检查传票区不能超长,单笔交易最多16张传票。实际上,多笔 * SP交易加起来的传票也不能超过16张,不过这一点是由TS交易 * 来保证的。 */ if (!VERIFY(nVchAreaLen <= AP_LEN_VCHAREA)) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION); return; } for (n = 0; n < nVchNum; n++) {#ifdef ABISV20 strncpy(szVchArea + n * LEN_VCH, toastru.szData + 420 + 6 + n * LEN_VCH, LEN_VCH);#else strncpy(szVchArea + n * (LEN_VCH + 2), toastru.szData + 420 + 6 + n * LEN_VCH, 9); strncpy(szVchArea + n * (LEN_VCH + 2) + 9, " ", 2); strncpy(szVchArea + n * (LEN_VCH + 2) + 11, toastru.szData + 420 + 6 + n * LEN_VCH + 9, LEN_VCH - 9);#endif } } if (!VERIFY_NORMAL(AP_INSERT(AP_PATH_VCHNUM, szVchNum)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_VCHAREA, szVchArea))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION); return; } if (strcmp(szAccFlag, AP_ACCFLAG_NATIVE) != 0) return; /* * 根据CSI 结构中的公共应答域填写XML 应答结构。如果填写过程中 * 发生错误,则必须修改应答码为AP_RESPCODE_EXCEPTION 以促使总 * 控发起冲正。 */ sprintf(szBal, "%19.2lf", pcsistru->dBal); sprintf(szAvailBal, "%19.2lf", pcsistru->dAvailBal); if (!VERIFY_NORMAL(ConvCurrType(szCurrType, pcsistru->szCurrCode)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_ACCNAME, pcsistru->szAccName)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_ACCTYPE, szAccType)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_ACCFLAG, szAccFlag)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_CERTTYPE, pcsistru->szCertType)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_CERTNO, pcsistru->szCertNo)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_CURRTYPE, szCurrType)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_BAL, szBal)) || !VERIFY_NORMAL(AP_INSERT(AP_PATH_AVAILBAL, szAvailBal))) { ApUpdateRespCode(pxmlstruResp, AP_RESPCODE_EXCEPTION); return; } return;}/* End of this file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -