⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linkcs.cpre

📁 商业银行前置系统
💻 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 + -