Esempio n. 1
0
static int pack_body(TRANS& trans,std::string& body)
{
    int ret = 0;

	gReader.fetchRow();

	//生成交易流水号并记录
    ret = GetNewRefno(trans.refno);
    if (ret)
    {
        return ret;
    }

	   TiXmlDocument doc;
    {
        TiXmlElement root("ROOT");
        doc.InsertEndChild(root);
    }
    char dt[15] = {0};
    getsysdatetime(dt);
    string now(dt);
	stringstream ss;

	TiXmlNode& root = *(doc.FirstChild());

 	//版本号
	ec_add_xml_node_value(root,"VERSION", "010101" );

	//交易代码
	ec_add_xml_node_value(root,"TRANS_TYPE", "120321" );

	//动作代码
	ec_add_xml_node_value(root,"ACTION_TYPE", "1");

	/*//响应代码
	ec_add_xml_node_value(root,"RESP_CODE", );*/

	//登录身份类型
	ec_add_xml_node_value(root,"LOGIN_TYPE", "1");

	//交易渠道
	ec_add_xml_node_value(root,"TRANS_SOURCE", "BP");

	//登录机构代码
	ec_add_xml_node_value(root,"LOGIN_INST_CODE", "48080000");

	//交易日期
	{
		string str;
		str.assign(trans.accdate,8);
		ec_add_xml_node_value(root,"TXN_DATE", str);
	}

	//交易时间
	{
		string str;
		str.assign(trans.acctime,6);
		ec_add_xml_node_value(root,"TXN_TIME", str);
	}

	//跟踪号/流水号
	{
		string str;
		str.assign(trans.refno,14);
		//str[6]='0';
		//str[7]='0';
		str=str.substr(6);
		//str.append(1,'1');
		ec_add_xml_node_value(root,"TRACE_NO", str);
	}

	//登录网点代码
	{
		string str;

		ret = get_ec_para(YTCEC_LOGIN_MERCH, str);
		if (ret)
		{
			LOG(ERROR, "中银通登录网点代码未配置");
			return E_COMMON_ERR;
		}
		ec_add_xml_node_value(root,"LOGIN_MERCH_CODE", str);
	}
	//ec_add_xml_node_value(root,"LOGIN_MERCH_CODE", "J001");

	//登录操作员代码
	{
		string str;

		ret = get_ec_para(YTCEC_LOGIN_USER, str);
		if (ret)
		{
			LOG(ERROR, "中银通登录操作员代码未配置");
			return E_COMMON_ERR;
		}
		ec_add_xml_node_value(root,"LOGIN_USER_CODE", str);
	}
	//ec_add_xml_node_value(root,"LOGIN_USER_CODE", "A5");

	std::string	ocard_no	;	//	旧卡卡号
	std::string	validtid	;	//	持卡人身份验证
	std::string	password	;	//	密码
	std::string	idcode	;	//	客户证件类型
	std::string	idtype	;	//	客户证件号码
	std::string	name	;	//	客户名
	std::string	familyname	;	//	客户姓
	std::string	name_spell	;	//	拼音名
	std::string	familyname_spell	;	//	拼音姓
	std::string	birthday	;	//	生日
	std::string	telphone	;	//	电话号码
	std::string	mobile	;	//	手机
	std::string	corpname	;	//	工作单位
	std::string	address	;	//	地址
	std::string	postcode	;	//	邮编
	std::string	email	;	//	电邮
	std::string	roomno	;	//	房间
	std::string	floorno	;	//	楼层
	std::string	homeaddr	;	//	住址
	std::string	estate	;	//	ESTATE
	std::string	street	;	//	街道
	std::string	district	;	//	DISTRICT
	std::string	area	;	//	地区
	std::string	newcardno	;	//	新卡号
	std::string	selectpin	;	//	卡密码选择
	std::string	activeswitch	;	//	是否激活
	std::string	feeswitch	;	//	收费标志
	std::string	fee	;	//	换卡费金额
	std::string	paytype	;	//	付款方式
	std::string	creditcardno	;	//	信用卡号
	std::string	memocode	;	//	回执号码
	std::string	reason	;	//	换卡原因
	std::string newcardfield55; //55域
    string  reserved;       //保留

    //旧卡卡号
    {
            ss.str("");
            COL2VAR(ocard_no);
            ss << ocard_no;
            ec_add_xml_node_value(root,"PRIMARY_ACCT_NUM",ss.str());
    }

    //持卡人身份验证
    {
            ss.str("");
            COL2VAR(validtid);
            ss << validtid;
            ec_add_xml_node_value(root,"VALIDTID",ss.str());
    }

    //密码
    {
            ss.str("");
            COL2VAR(password);
            ss << password;
            ec_add_xml_node_value(root,"CUSTPASSWORD",ss.str());
    }

    //客户证件类型
    {
            ss.str("");
            COL2VAR(idcode);
            ss << idcode;
            ec_add_xml_node_value(root,"IDTYPE",ss.str());
    }

    //客户证件号码
    {
            ss.str("");
            COL2VAR(idtype);
            ss << idtype;
            ec_add_xml_node_value(root,"IDCODE",ss.str());
    }

    //客户名
    {
            ss.str("");
            COL2VAR(name);
            ss << name;
            ec_add_xml_node_value(root,"NAME",ss.str());
    }

    //客户姓
    {
            ss.str("");
            COL2VAR(familyname);
            ss << familyname;
            ec_add_xml_node_value(root,"SNAME",ss.str());
    }

    //拼音名
    {
            ss.str("");
            COL2VAR(name_spell);
            ss << name_spell;
            ec_add_xml_node_value(root,"SPELL_NAME",ss.str());
    }

    //拼音姓
    {
            ss.str("");
            COL2VAR(familyname_spell);
            ss << familyname_spell;
            ec_add_xml_node_value(root,"SPELL_SNAME",ss.str());
    }

    //生日
    {
            ss.str("");
            COL2VAR(birthday);
            ss << birthday;
            ec_add_xml_node_value(root,"BIRTHDAY",ss.str());
    }

    //电话号码
    {
            ss.str("");
            COL2VAR(telphone);
            ss << telphone;
            ec_add_xml_node_value(root,"COPHONE",ss.str());
    }

    //手机
    {
            ss.str("");
            COL2VAR(mobile);
            ss << mobile;
            ec_add_xml_node_value(root,"MOBILE",ss.str());
    }

    //工作单位
    {
            ss.str("");
            COL2VAR(corpname);
            ss << corpname;
            ec_add_xml_node_value(root,"BUS_NAME",ss.str());
    }

    //地址
    {
            ss.str("");
            COL2VAR(address);
            ss << address;
            ec_add_xml_node_value(root,"ADDR",ss.str());
    }

    //邮编
    {
            ss.str("");
            COL2VAR(postcode);
            ss << postcode;
            ec_add_xml_node_value(root,"POST",ss.str());
    }

    //电邮
    {
            ss.str("");
            COL2VAR(email);
            ss << email;
            ec_add_xml_node_value(root,"EMAIL",ss.str());
    }

    //房间
    {
            ss.str("");
            COL2VAR(roomno);
            ss << roomno;
            ec_add_xml_node_value(root,"ROOM",ss.str());
    }

    //楼层
    {
            ss.str("");
            COL2VAR(floorno);
            ss << floorno;
            ec_add_xml_node_value(root,"FLOOR",ss.str());
    }

    //住址
    {
            ss.str("");
            COL2VAR(homeaddr);
            ss << homeaddr;
            ec_add_xml_node_value(root,"BUILDING",ss.str());
    }

    //ESTATE
    {
            ss.str("");
            COL2VAR(estate);
            ss << estate;
            ec_add_xml_node_value(root,"ESTATE",ss.str());
    }

    //街道
    {
            ss.str("");
            COL2VAR(street);
            ss << street;
            ec_add_xml_node_value(root,"STREET",ss.str());
    }

    //DISTRICT
    {
            ss.str("");
            COL2VAR(district);
            ss << district;
            ec_add_xml_node_value(root,"DISTRICT",ss.str());
    }

    //地区
    {
            ss.str("");
            COL2VAR(area);
            ss << area;
            ec_add_xml_node_value(root,"REGION",ss.str());
    }

    //新卡号
    {
            ss.str("");
            COL2VAR(newcardno);
            ss << newcardno;
            ec_add_xml_node_value(root,"NCARD_NO",ss.str());
    }

    //卡密码选择
    {
            ss.str("");
            COL2VAR(selectpin);
            ss << selectpin;
            ec_add_xml_node_value(root,"SELECTPIN",ss.str());
    }

    //是否激活
    {
            ss.str("");
            COL2VAR(activeswitch);
            ss << activeswitch;
            ec_add_xml_node_value(root,"ACTIVE",ss.str());
    }

    //收费标志
    {
            ss.str("");
            COL2VAR(feeswitch);
            ss << feeswitch;
            ec_add_xml_node_value(root,"FEEFLG",ss.str());
    }

    //换卡费金额
    {
            ss.str("");
            COL2VAR(fee);
            ss << fee;
            ec_add_xml_node_value(root,"FEE",ss.str());
    }

    //付款方式
    {
            ss.str("");
            COL2VAR(paytype);
            ss << paytype;
            ec_add_xml_node_value(root,"PAYMENTWAY",ss.str());
    }

    //信用卡号
    {
            ss.str("");
            COL2VAR(creditcardno);
            ss << creditcardno;
            ec_add_xml_node_value(root,"CREDITNO",ss.str());
    }

    //回执号码
    {
            ss.str("");
            COL2VAR(memocode);
            ss << memocode;
            ec_add_xml_node_value(root,"MEMOCODE",ss.str());
    }

    //换卡原因
    {
            ss.str("");
            COL2VAR(reason);
            ss << reason;
            ec_add_xml_node_value(root,"REAS",ss.str());
    }

	//IC卡数据域(对应银联标准中55域,下列都是其子域)

	ec_add_xml_node_value(root,"ICC_DATA", "");
	TiXmlNode* icc_data;

	ec_xml_get_xml_childnode(root,"ICC_DATA",&icc_data);

	//解析55域字段,存入map

	map<std::string,std::string> tag_map;
	COL2VAR(newcardfield55);
	string field55(newcardfield55);
	LOG(DEBUG, "55"<<newcardfield55);
	string tag_field_name(""),tag_field_value("");

    while (field55.length()>0)
    {
        get_first_field(field55,tag_field_name,tag_field_value);
		LOG(DEBUG, "tag_field_name"<<tag_field_name<<"tag_field_value"<<tag_field_value);
        tag_map[tag_field_name]=tag_field_value;

    }

	//交易计数器
    ec_add_xml_node_value(*icc_data, "TAG_9F36", tag_map["9F36"]);


    //应用密文
    ec_add_xml_node_value(*icc_data, "TAG_9F26", tag_map["9F26"]);


    //发卡行自定义数据
    ec_add_xml_node_value(*icc_data, "TAG_9F10", tag_map["9F10"]);


    //授权金额
    ec_add_xml_node_value(*icc_data, "TAG_9F02", tag_map["9F02"]);


    //其他金额
    ec_add_xml_node_value(*icc_data, "TAG_9F03", tag_map["9F03"]);


    //终端国家代码
    ec_add_xml_node_value(*icc_data, "TAG_9F1A", tag_map["9F1A"]);


    //终端验证结果
    ec_add_xml_node_value(*icc_data, "TAG_95", tag_map["95"]);


    //交易货币代码
    ec_add_xml_node_value(*icc_data, "TAG_5F2A", tag_map["5F2A"]);


    //交易日期
    ec_add_xml_node_value(*icc_data, "TAG_9A", tag_map["9A"]);


    //交易类型
    ec_add_xml_node_value(*icc_data, "TAG_9C", tag_map["9C"]);


    //不可预知数
    ec_add_xml_node_value(*icc_data, "TAG_9F37", tag_map["9F37"]);


    //应用交互特征
    ec_add_xml_node_value(*icc_data, "TAG_82", tag_map["82"]);


    //第一币种货币代码
    ec_add_xml_node_value(*icc_data, "TAG_9F71", tag_map["9F71"]);


    //第一币种余额
    ec_add_xml_node_value(*icc_data, "TAG_9F79", tag_map["9F79"]);


	//保留域
	{
		ss.str("");
		COL2VAR(reserved);
		ss<<reserved;
		ec_add_xml_node_value(root,"RESERVED",ss.str());
	}

	//报文鉴别码
	// ec_add_xml_node_value(root, "MESG_AUTHN_CODE", "87AE");
    ec_bank_any_ytc::calc_trans_mac(&root);

	TiXmlPrinter printer;
    doc.Accept(&printer);

	char xml_header[100]="<?xml version='1.0' encoding='GBK'?>\n";
	body.append(xml_header);
    body += printer.CStr();
	return 0;
}
Esempio n. 2
0
int F846333(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) {
    int ret=0;
    CAccTrans *pAccTrans=CAccTrans::getInstance();
    des2src(pAccTrans->trans.opercode,rPack->semp);
    pAccTrans->trans.transcode=TC_EACCDEPOSIT;
    ret=pAccTrans->InitTrans();
    if(ret)
        return ret;
    TRANS& trans=pAccTrans->trans;
    T_t_transdtl transdtl;		//add by chen 2012-01-04
    memset(&transdtl, 0, sizeof(transdtl));		//add by chen 2012-01-04
    ST_CPACK aPack;
    ST_PACK *outPack = &(aPack.pack);
    ResetNormalCPack(&aPack,0,1);

    SetCol(handle,0);

    des2src(trans.craccno,rPack->sbank_acc);	//贷方账号
    des2src(trans.eaccno,rPack->sbank_acc);	//电子钱包账号
    if(!strlen(trans.eaccno))
        return E_INPUTNULL_ACCNO;
    //检查客户
    //去帐户信息
    T_t_netacc tNetAcc;
    memset(&tNetAcc,0,sizeof(tNetAcc));
    ret=DB_t_netacc_read_by_accno(trans.eaccno,&tNetAcc);
    if(ret) {
        writelog(LOG_ERR,"accno[%s]",trans.eaccno);
        if(DB_NOTFOUND==ret)
            return E_NOTEXIST_EACCNO;
        else
            return E_DB_ACCOUNT_R;
    }
    if(tNetAcc.status[0]!=STATUS_NORMAL) {
        return E_EACCNO_LOGOUT;
    }
    //	创建账号
    pAccTrans->trans.custid=tNetAcc.custid;		//客户号
    pAccTrans->trans.inputamt=rPack->damt0;		//输入金额
    pAccTrans->trans.unusedamt = trans.inputamt;	//剩余金额
    if(!pAccTrans->trans.inputamt)
        return E_INPUT_AMT_NULL;
    pAccTrans->trans.fundtype=rPack->lvol9;	//资金类型
    des2src(pAccTrans->trans.voucherno,rPack->scust_auth2);
    ret=pAccTrans->doTrans();
    if(ret)
        return ret;
    SetCol(handle,F_LVOL0,F_LVOL8,F_SDATE3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);
    des2src(outPack->sdate3,pAccTrans->trans.accdate);
    des2src(outPack->semp,trans.opercode);
    outPack->lwithdraw_flag=trans.termid;
    outPack->lserial1=trans.termseqno;
    sprintf(outPack->vsmess,"客户[%s] %s 帐户余额:%.2f元",tNetAcc.accname,pAccTrans->remark.c_str(),pAccTrans->trans.craccaftbal);
    des2src(trans.remark,outPack->vsmess);
    PutRow(handle,outPack,pRetCode,szMsg);
//start add by chen 2012-01-04
    transdtl.transflag = 1;		//交易标志 1为充值
    transdtl.status[0] = '3';		//流水状态 3是成功
    transdtl.termid = trans.termid;			//终端编号
    transdtl.termseqno = trans.termseqno;	//终端流水号
    strncpy(transdtl.transdate, trans.transdate, 8);	//交易日期
    strncpy(transdtl.transtime, trans.transtime, 6);	//交易时间
    transdtl.transcode = trans.transcode;	//交易码
    transdtl.custid = trans.custid;			//客户号
    GetStuempnoByCustid(transdtl.custid,transdtl.stuempno);	//学工号
    strncpy(transdtl.custname, tNetAcc.accname, 61);	//客户名
    strncpy(transdtl.voucherno, trans.voucherno, 21);	//凭证号
    transdtl.amount= trans.transamt;		//交易金额
    transdtl.cardbefbal= trans.craccbefbal;	//交易前余额
    transdtl.cardaftbal = trans.craccaftbal;	//交易后余额
    transdtl.paytype = rPack->lvol9;		//支付方式
    strncpy(transdtl.accdate, trans.accdate, 8);	//记账日期
    strncpy(transdtl.acctime, trans.acctime, 6);	//记账时间
    strncpy(transdtl.opercode, trans.opercode, 9);	//操作员
    // 产生交易参考号
    T_t_refno tRefno;

    memset(&tRefno,0,sizeof(tRefno));
    get_random(tRefno.mac);
    ret= GetNewRefno(tRefno.refno);
    if(ret)
        return ret;

    des2src(tRefno.lastsaved,trans.sysdatetime);
    des2src(tRefno.accdate,trans.accdate);
    tRefno.termid = trans.termid;
    tRefno.termseqno = trans.termseqno;
    tRefno.status = RS_SUCC;

    ret=DB_t_refno_add(&tRefno);
    if(ret) {
        if(DB_REPEAT==ret)
            return E_DB_REFNO_E;
        else
            return E_DB_REFNO_I;
    }
    strncpy(transdtl.refno, tRefno.refno, 14);	//交易参考号
    //添加交易流水记录
    ret = DB_t_transdtl_add(&transdtl);
    if(ret) {
        if(DB_REPEAT == ret)
            return E_DB_TRANSDTL_E;
        else
            return E_DB_TRANSDTL_I;
    }
//end add by chen 2012-01-04
    return 0;
}
Esempio n. 3
0
int F846340(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) {
    int ret=0;

    CAccTrans *pAccTrans=CAccTrans::getInstance();
    TRANS& trans=pAccTrans->trans;
    trans.transcode=TC_EACC2SHOP;
    trans.transtype = TRANSTYPE_EACCPAYMENT; // 支付交易
    //trans.termid=TERMID_WEB;
    trans.termid=rPack->lcert_code; // 使用支付网关的注册ID

    ret=pAccTrans->InitTrans();
    if(ret)
        return ret;

    trans.inputamt=D4U5(rPack->damt0,2);
    trans.unusedamt = trans.inputamt;
    trans.transamt=trans.inputamt;

    if(amtcmp(trans.inputamt,0)==0)
        return E_INPUT_AMT_NULL;

    if(amtcmp(trans.inputamt,0)<0)
        return E_INPUT_AMT;

    //查询电子钱包帐户
    T_t_netacc tNetAccount;
    memset(&tNetAccount,0,sizeof(tNetAccount));
    ret=DB_t_netacc_read_by_accno(rPack->scust_no,&tNetAccount);
    if(ret) {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_EACCNO,rPack->scust_no);
        else
            return E_DB_ACCOUNT_R;
    }

    //检查电子钱包密码
    if(rPack->lvol1 == 0) { // 检查电子账户密码 检查账户余额
        if(strcmp(rPack->snote2,tNetAccount.paypwd)!=0)
            return E_EACCPWD;
    }

    if(tNetAccount.status[0]!=STATUS_NORMAL) // 账户状态
        return ERRINFO(E_EACCNO_LOGOUT,tNetAccount.accno);

    if(tNetAccount.stoppayflag[0]=='1') // 止付标志
        return ERRINFO(E_EACC_STOPPAY,tNetAccount.accno);

    if(rPack->lvol1 == 0) { // 检查电子账户密码 检查账户余额
        if(amtcmp(trans.inputamt,tNetAccount.balance)>0)
            return ERRINFO(E_EACC_BALANCE_SHORTAGE,trans.inputamt-tNetAccount.balance);
    }
    /*
    double CardMaxBal=0;
    ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
    if(ret)
    	return ret;
    if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0)
    	return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
    */
    des2src(trans.draccno,tNetAccount.accno);

    trans.custid=tNetAccount.custid;
    des2src(trans.custname,tNetAccount.accname);

    // 支付转账
    T_t_shop shop;

    memset(&shop,0,sizeof(shop));
    ret=DB_t_shop_read_by_shopid(rPack->lvol0,&shop);
    if(ret) {
        if(DB_NOTFOUND==ret)
            return E_NOTEXIST_SHOPID;
        else
            return E_DB_SHOP_R;
    }
    if(shop.status[0]!=STATUS_NORMAL)
        return E_SHOP_LOGOUT;

    if(shop.shoptype!=SHOPTYPE_ESHOP)
        return ERRIF_SHOP_TYPE;

    des2src(trans.craccno,shop.accno);

    // 产生交易参考号
    T_t_refno tRefno;

    memset(&tRefno,0,sizeof(tRefno));
    get_random(tRefno.mac);
    ret= GetNewRefno(tRefno.refno);
    if(ret)
        return ret;

    des2src(tRefno.lastsaved,trans.sysdatetime);
    des2src(tRefno.accdate,trans.accdate);
    tRefno.termid = trans.termid;
    tRefno.termseqno = trans.termseqno;
    tRefno.status = RS_SUCC;

    ret=DB_t_refno_add(&tRefno);
    if(ret) {
        if(DB_REPEAT==ret)
            return E_DB_REFNO_E;
        else
            return E_DB_REFNO_I;
    }

    des2src(trans.refno, tRefno.refno);

    ret=pAccTrans->doTrans();
    if(ret)
        return ret;

    // 添加电子账户支付信息
    T_t_epay_record t_epay_record;
    memset(&t_epay_record,0,sizeof(t_epay_record));

    des2src(t_epay_record.refno, tRefno.refno);
    t_epay_record.shopid = shop.shopid;
    des2src(t_epay_record.oid, rPack->sbankname);
    des2src(t_epay_record.accno,tNetAccount.accno);
    des2src(t_epay_record.accname,tNetAccount.accname);
    t_epay_record.amount = trans.inputamt;
    des2src(t_epay_record.currency,rPack->sstock_code);

    des2src(t_epay_record.epay_date,trans.accdate);
    des2src(t_epay_record.epay_time,trans.acctime);
    t_epay_record.status = 1; // 交易成功
    t_epay_record.transcode = trans.transcode;
    des2src(t_epay_record.remark,rPack->snote);

    ret=DB_t_epay_record_add(&t_epay_record);
    if(ret)
        return ret;

    // 添加交易流水
    T_t_transdtl transdtl;
    memset(&transdtl,0,sizeof(transdtl));

    des2src(transdtl.refno,tRefno.refno); // 交易参考号
    des2src(transdtl.transdate,trans.accdate);
    des2src(transdtl.transtime,trans.acctime);
    strcpy(transdtl.accdate,trans.accdate);
    strcpy(transdtl.acctime,trans.acctime);
    transdtl.termid=trans.termid;
    transdtl.termseqno=trans.termseqno;
    transdtl.transcode=trans.transcode;
    transdtl.transflag=TF_PAY;
    transdtl.managefee=trans.totalfeeamt;
    des2src(transdtl.custname,tNetAccount.accname);
    transdtl.amount = trans.inputamt;
    des2src(transdtl.opercode,trans.opercode);
    transdtl.cardbefbal = trans.draccbefbal;
    transdtl.cardaftbal = trans.draccaftbal;
    des2src(transdtl.coldate,trans.accdate);
    des2src(transdtl.coltime,trans.acctime);
    transdtl.status[0]=DTLSTATUS_SUCCESS;
    transdtl.revflag[0]='0';
    transdtl.custid=tNetAccount.custid;
    GetStuempnoByCustid(transdtl.custid,transdtl.stuempno);
    ret=DB_t_transdtl_add(&transdtl);
    if(ret) {
        if(DB_REPEAT==ret)
            return E_DB_TRANSDTL_E;
        else
            return E_DB_TRANSDTL_I;
    }

    ST_CPACK aPack;
    ST_PACK *outPack = &(aPack.pack);
    ResetNormalCPack(&aPack,0,1);

    SetCol(handle,0);
    SetCol(handle,F_LVOL0,F_SCUST_NO, F_SDATE0,F_STIME0,
           F_DAMT0,F_SPHONE3,F_SADDR,F_VSMESS,0);
    outPack->lvol0=shop.shopid;
    des2src(outPack->scust_no,tNetAccount.accno);
    des2src(outPack->sdate0,trans.accdate);
    des2src(outPack->stime0,trans.acctime);

    des2src(outPack->sphone3,tRefno.refno); // 一卡通流水号,冲正使用
    des2src(outPack->saddr,tRefno.mac); // MAC 冲正使用

    outPack->damt0=trans.draccaftbal; // 余额
    char temp[128]="";
    sprintf(temp,"%s 支付成功,电子钱包余额:%.2f",
            tNetAccount.accname, trans.draccaftbal);

    pAccTrans->remark+=temp;
    strcpy(outPack->vsmess,pAccTrans->remark.c_str());
    des2src(trans.remark,outPack->vsmess);
    PutRow(handle,outPack,pRetCode,szMsg);
    return 0;
}
Esempio n. 4
0
int F240020(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	pAccTrans->trans.transcode=TC_BANKTRANS;
	TRANS& trans=pAccTrans->trans;
	trans.termid=rPack->lcert_code;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	trans.inputamt = rPack->lvol5/100.0;
	trans.unusedamt=trans.inputamt;
	trans.cardflag=1;
	trans.usecardflag=1;
	trans.cardbefbal=rPack->lvol6/100.00;
	trans.dpscnt=rPack->lvol1+1;	//充值次数
	trans.cardaftbal=trans.cardbefbal;
	//转账不允许转小数金额
	if((rPack->lvol5)%100>0)
	{
		writelog(LOG_ERR,"trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		strcpy(szMsg,"转账金额必须是整数");
		return E_TRANS_TRANSMONEY_OUTRANGE;
	}
	if(rPack->lvol5<1)
	{
		writelog(LOG_ERR,"trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		strcpy(szMsg,"转账金额不能为0");
		return E_TRANS_TRANSMONEY_OUTRANGE;
	}
	T_t_account		tAccount;		//帐户表
	T_t_card		card;
	T_t_bankcard 	bankcard;
	T_t_cfgbank     cfgbank;
	T_t_device device;
	
	memset(&cfgbank,0,sizeof cfgbank);
	memset(&tAccount,0,sizeof(tAccount));
	memset(&card,0,sizeof(card));
	memset(&bankcard,0,sizeof(bankcard));
	memset(&device,0,sizeof device);

	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);


	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_SCUST_AUTH,F_SNAME,F_SNAME2,F_LSERIAL0,F_STX_PWD,F_LVOL5,F_LVOL6,0);


	/*判断设备是否登陆
	if(0!=device_login_yes_or_no(trans.termid))
	{
		writelog(LOG_ERR,"Device don't login");
		return E_TRANS_TERM_NOLOGIN;
	}
	*/
	
	/*
	char buffer[16]="";
	//判断是否处于日终结算状态
 	ret=GetSysParaVal(GLOBE_FLAG_BALANCE,buffer);
	if(ret)
	{
		writelog(LOG_ERR,"GetSysParaVal error,errcode=[%d]",ret);
		return E_TRANS_UNKNOW_ERROR;
	}
	else if(strncmp(buffer,"0",1)!=0)
	{
		writelog(LOG_ERR,"System is balance now!");
		return E_TRANS_BANK_SERVICE_NOEXIT;
	}
	*/

	ret=DB_t_device_read_by_deviceid(trans.termid, &device);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_device_read_by_deviceid err,errcode=[%d],device_id=[%d]",ret,trans.termid);
		return E_DB_DEVICE_R;
	}
		
	trans.cardno=rPack->lvol0;
	ret=pAccTrans->CheckAcc(&card,&tAccount);
	if(ret)
		return ret;
	if(amtcmp(trans.cardbefbal-tAccount.balance,MAXAMT_CARDGTACC)>=0)
	{
		writelog(LOG_ERR,"cardbefbal[%.2lf]account balance[%.2lf]",trans.cardbefbal,tAccount.balance);
		return ERRIF_CARDBAL_EXCEPT;
	}
	double CardMaxBal=0;
	ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
	if(ret)
		return ret;
	if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0)
		return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);

	trans.feetype=card.feetype;
	trans.cardtype=card.cardtype;
	trans.custid=card.custid;
//	if(tAccount.lastdpscnt>trans.dpscnt)
//	{
//		return ERRINFO(E_CARDCNT_LT_LASTCARDCNT,trans.dpscnt,tAccount.lastdpscnt);
//	}

	//校验绑定关系
	ret = DB_t_bankcard_read_by_custid(card.custid, &bankcard);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
		{
			strcpy(szMsg,"学工号和银行卡号未绑定");
			return E_DB_BANKCARD_N;
		}
		else
		{
			return E_DB_BANKCARD_R;
		}
	}
	
	ret = DB_t_cfgbank_read_by_bankcode(bankcard.bankcode,&cfgbank);
	if(ret)
	{
		return E_DB_CFGBANK_R;
	}
	
	if(strncmp(trans.acctime,cfgbank.bankstarttime,6) < 0
		|| strncmp(trans.acctime,cfgbank.bankendtime,6) > 0)
	{
		return E_OUT_BANKTIME;
	}

	//取流水号
	ret=pAccTrans->GetTermSeqno();
	if(ret)
	{
		writelog(LOG_ERR,"GetTermSeqno error,error code=[%d]",ret);
		return ret;
	}

	T_t_refno tRefno;

	memset(&tRefno,0,sizeof(tRefno));
	
	get_random(tRefno.mac);

	ret= GetNewRefno(tRefno.refno);
	if(ret)
		return ret;
	des2src(tRefno.lastsaved,trans.sysdatetime);
	des2src(tRefno.accdate,trans.transdate);
	tRefno.termid = trans.termid;
	tRefno.termseqno = trans.termseqno;
	ret=DB_t_refno_add(&tRefno);
	if(ret)
	{
		if(DB_REPEAT==ret)
			return E_DB_REFNO_E;
		else
			return E_DB_REFNO_I;
	}
	
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));

	des2src(transdtl.transdate,trans.transdate);
	des2src(transdtl.transtime,trans.transtime);
	strcpy(transdtl.accdate,trans.accdate);
	strcpy(transdtl.acctime,trans.acctime);
	transdtl.termid=trans.termid;
	transdtl.termseqno=trans.termseqno;
	transdtl.transcode=trans.transcode;
	transdtl.cardno=trans.cardno;
	transdtl.purseno=trans.purseno;
	transdtl.transflag = TF_DPS;
	transdtl.cardcnt=trans.dpscnt;
	transdtl.cardbefbal=trans.cardbefbal;
    transdtl.amount=trans.inputamt;
	transdtl.cardaftbal=trans.cardaftbal;
	transdtl.custid=tAccount.custid;
	//transdtl.sysid= rPack->lvol2;
	transdtl.exttype=EXTTYPE_BANKCARD;
	des2src(transdtl.extdata,bankcard.bankcardno);
	des2src(transdtl.showcardno,card.showcardno);
	transdtl.status[0]=DTLSTATUS_INIT;
	des2src(transdtl.refno,tRefno.refno);
	des2src(transdtl.devphyid,device.devphyid);
	GetCustBaseInfoByCustID(card.custid,transdtl.custname,transdtl.stuempno,NULL);
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
	  if(DB_REPEAT==ret)
	    return E_DB_TRANSDTL_E;
	  else
	    return E_DB_TRANSDTL_I;
	}	
	des2src(out_pack->scust_auth,bankcard.bankcardno);					// 银行卡号
	des2src(out_pack->sname,transdtl.stuempno);							// 学工号
	des2src(out_pack->sname2,transdtl.refno);							// 交易参考号
	des2src(out_pack->stx_pwd,tRefno.mac);								// 随机数
	out_pack->lserial0=trans.termseqno;									// 终端流水号
	out_pack->lvol5 = D2I(trans.inputamt*100);									// 交易金额 (分)
	out_pack->lvol6 = D2I(trans.cardbefbal*100);									// 入卡值(分)

	writelog(LOG_INFO,"bankcardno[%s],stuempno[%s],refno[%s],termseqno[%d],inputamt[%d],befbal[%d]",out_pack->scust_auth,
		out_pack->sname,out_pack->sname2,out_pack->lserial0,out_pack->lvol5,out_pack->lvol6);
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
}
Esempio n. 5
0
int F240024(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

    int ret=0;
    int request_type = 2401;
    int drtp_branch  = 0;
    int base_funcno = 0;
    int bcc_timeout = 0;
    char bankcode[3] = "";

    ST_CPACK bPack;
    ST_PACK *out_pack = &(bPack.pack);
    ResetNormalCPack(&bPack,0,1);
    SetCol(handle,0);
    SetCol(handle,F_DAMT0,0);


    ST_PACK ArrayPack;			// 设置返回包
    ST_CPACK aPack;				// 设置应答包
    ST_CPACK sPack;			 	// 设置发送包
    T_t_card card;
    memset(&card,0x00,sizeof card);
    T_t_bankcard bankcard;
    memset(&bankcard,0,sizeof bankcard);
    T_t_device device;
    memset(&device,0x00,sizeof device);

    ResetNormalCPack(&aPack, 0, 1);
    memset(&ArrayPack, 0, sizeof(ArrayPack));

    ResetNormalCPack(&sPack, 0, 1);
    sPack.head.RequestType = request_type;

    SetHeadCol(&sPack,F_LCERT_CODE,F_SCUST_AUTH,F_LVOL0,F_LVOL1,F_SDATE0,
               F_SHOLDER_AC_NO,F_SPHONE,F_SPHONE3,F_SCUST_LIMIT,F_SCUST_LIMIT2,F_SCUST_AUTH,F_SCUST_AUTH2,F_DAMT0,F_SBANK_PWD,
               F_VSVARSTR0,F_VSVARSTR1,F_SORDER2,0);

    ret = DB_t_bankcard_read_by_bankcardno(rPack->scust_auth, &bankcard);
    if(ret)
    {
        strcpy(szMsg,"您的校园卡号和银行卡号未绑定");
        return E_DB_BANKCARD_R;
    }
    ret=DB_t_card_read_by_custid_and_status(bankcard.custid, "1", &card);
    if(ret)
    {
        strcpy(szMsg,"校园卡已经注销");
        return E_DB_CARD_N;
    }

    //校验绑定关系
    ret = DB_t_bankcard_read_by_custid(card.custid, &bankcard);
    if(ret)
    {
        writelog(LOG_ERR,"DB_t_bankcard_read_by_custid err,errcode=[%d]",ret);
        if(DB_NOTFOUND==ret)
        {
            strcpy(szMsg,"学工号和银行卡号未绑定");
            return E_DB_BANKCARD_N;
        }
        else
        {
            return E_DB_BANKCARD_R;
        }
    }

    ret = DB_t_bankcard_read_by_custid_and_bankcardno(card.custid,rPack->scust_auth, &bankcard);
    if(ret)
    {
        strcpy(szMsg,"学工号和银行卡号没绑定");

        return E_DB_BANKCARD_R;
    }
    des2src(bankcode,bankcard.bankcode);
    T_t_cfgbank cfgbank;
    memset(&cfgbank,0,sizeof cfgbank);
    ret = DB_t_cfgbank_read_by_bankcode(bankcode,&cfgbank);
    if(ret)
    {
        return E_DB_CFGBANK_R;
    }
    if(strncmp(getsystime(NULL),cfgbank.bankstarttime,6) < 0
            || strncmp(getsystime(NULL),cfgbank.bankendtime,6) > 0)
    {
        return E_OUT_BANKTIME;
    }

    T_t_customer customer;
    memset(&customer,0,sizeof customer);
    ret = DB_t_customer_read_by_custid(card.custid, &customer);
    if(ret)
    {
        return E_DB_CUSTOMER_R;
    }
    ret=DB_t_device_read_by_deviceid(rPack->lcert_code, &device);
    if(ret)
    {
        return E_DB_DEVICE_R;
    }
    drtp_branch = cfgbank.bccdrtpno;								// drtp 编号
    base_funcno = cfgbank.bccfuncno;							// 前置主功能号
    bcc_timeout = cfgbank.bcctimeout;								// 前置超时时间

    sPack.pack.lcert_code = 240100;								// 交易码
    des2src(sPack.pack.scust_limit2,cfgbank.bankip);					// 银行ip
    sPack.pack.lvol0 = cfgbank.bankport;							// 银行端口
    sPack.pack.lvol1 = cfgbank.banktimeout;					// 银行超时时间


    GetNewRefno(sPack.pack.sholder_ac_no);				// 一卡通交易参考号
    db_commit();
    des2src(sPack.pack.sdate0,getsysdate(NULL));					// 交易日期
    des2src(sPack.pack.scust_limit,customer.custname);				// 姓名
    des2src(sPack.pack.scust_auth2,customer.idno);					// 身份证号
    des2src(sPack.pack.scust_auth,rPack->scust_auth);				// 银行卡号
    des2src(sPack.pack.sphone3,rPack->sphone3);				//银行卡密码,ansi加密处理过
    des2src(sPack.pack.vsvarstr0, rPack->vsvarstr0);				//二磁道数据
    des2src(sPack.pack.vsvarstr1, rPack->vsvarstr1);				//三磁道数据
    des2src(sPack.pack.sorder2,device.devphyid);					//设备物理ID
    if(bcc_timeout<5)
        bcc_timeout=5;

    ret = ExtCall(0, drtp_branch, base_funcno, 0, bcc_timeout, &sPack, &aPack, &ArrayPack);
    if (ret < 0 || aPack.head.retCode != 0)
    {
        writelog(LOG_ERR,"extcall 2401 ret[%d],retcode[%d] timeout[%d] ",ret,aPack.head.retCode,bcc_timeout);
        if (ret < 0)				// 通讯错误,要冲正的
        {
            writelog(LOG_ERR,"调用后台业务失败,业务终止");
            return E_BCC_NETWORK;
        }
        else						// 收到前置返回的错误
        {
            writelog(LOG_ERR,"%s",aPack.pack.vsmess);
            strcpy(szMsg,aPack.pack.vsmess);
            return E_COMMON_ERR;
        }
    }
    if(aPack.pack.lvol1 != 1)		// 前置解包错误
    {
        writelog(LOG_ERR,"接收银行数据错误");
        return E_BCC_NETWORK;
    }

    out_pack->damt0=aPack.pack.damt0;
    PutRow(handle,out_pack,pRetCode,szMsg);

    return 0;

}
Esempio n. 6
0
int F846336(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) {
    int ret=0;
    CAccTrans *pAccTrans=CAccTrans::getInstance();
    TRANS& trans=pAccTrans->trans;

    //des2src(pAccTrans->trans.opercode,rPack->semp);
    trans.termid=rPack->lcert_code;

    int transflag=rPack->lvol3;
    if(transflag) {
        trans.transcode=TC_EACC2CARD;
    } else {
        trans.transcode=TC_CARD2EACC;
    }

    ret=pAccTrans->InitTrans();
    if(ret)
        return ret;

    char pwd_crypt[33]="";
    des2src(pwd_crypt,rPack->scust_limit); // 卡密码

    trans.cardflag=1;
    trans.usecardflag=1;
    trans.cardno=rPack->lvol0;
    trans.purseno=PURSE_NO_ONE;
    trans.dpscnt=rPack->lvol5+1;
    trans.paycnt=rPack->lvol6+1;
    trans.cardbefbal=rPack->lvol7/100.0;
    trans.cardaftbal=trans.cardbefbal;
    trans.inputamt=D4U5(rPack->damt0,2);
    trans.unusedamt = trans.inputamt;

//	transdtl.cardaftbal=rPack->lvol8;
//	transdtl.siteno=rPack->lcert_code;
//	transdtl.frontno=0;
    //des2src(transdtl.devphyid,rPack->sname);
    //transdtl.devseqno=rPack->lserial0;
    //des2src(transdtl.bankcode,rPack->sbank_code);
    //des2src(transdtl.bankcardno,rPack->scard0);
    //des2src(transdtl.mobile,rPack->sphone2);
//	des2src(transdtl.remark,rPack->ssectypes);

    T_t_refno tRefno;
    memset(&tRefno,0,sizeof(tRefno));

    get_random(tRefno.mac);
    ret= GetNewRefno(tRefno.refno);
    if(ret)
        return ret;
    des2src(tRefno.lastsaved,trans.sysdatetime);
    des2src(tRefno.accdate,trans.accdate);
    tRefno.termid = trans.termid;
    tRefno.termseqno = trans.termseqno;
    tRefno.status = RS_SUCC;

    ret=DB_t_refno_add(&tRefno);
    if(ret) {
        if(DB_REPEAT==ret)
            return E_DB_REFNO_E;
        else
            return E_DB_REFNO_I;
    }

    //检查客户
    des2src(trans.cardphyid,rPack->sstation0);
    T_t_card tCard;

    memset(&tCard,0,sizeof(tCard));
    ret=doCard(tCard);
    if(ret) {
        return ret;
    }
    //查询卡帐户
    T_t_account tCardAccount;
    memset(&tCardAccount,0,sizeof(tCardAccount));
    ret=DB_t_account_read_by_accno(tCard.accno,&tCardAccount);
    if(ret) {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_CARDACCNO,tCard.accno);
        else
            return E_DB_ACCOUNT_R;
    }
    if(tCardAccount.status[0]!=STATUS_NORMAL) {
        return ERRINFO(E_CARDACC_LOGOUT,tCardAccount.accno);
    }
    //根据客户号查询电子钱包帐户
    T_t_netacc tNetAccount;
    memset(&tNetAccount,0,sizeof(tNetAccount));
    ret=DB_t_netacc_read_by_custid(tCardAccount.custid,&tNetAccount);
    if(ret) {
        if(DB_NOTFOUND==ret)
            return ERRINFO(E_NOTEXIST_EACCNO,tCardAccount.custid);
        else
            return E_DB_ACCOUNT_R;
    }
    if(tNetAccount.status[0]!=STATUS_NORMAL)
        return ERRINFO(E_EACCNO_LOGOUT,tNetAccount.accno);
    strcpy(trans.cardaccno,tCardAccount.accno);

    trans.feetype=tCard.feetype;
    trans.custid=tCard.custid;
    strcpy(trans.cardaccno,tCardAccount.accno);
    strcpy(trans.eaccno,tNetAccount.accno);

    if(TC_CARD2EACC==trans.transcode) {
        //检查卡密码
        if(strcmp(tCard.cardpwd,pwd_crypt)!=0) {
            return E_CARDPWD;
        }

        if(amtcmp(trans.inputamt,trans.cardbefbal)>0)
            return ERRINFO(E_CARD_BALANCE_SHORTAGE,trans.cardbefbal);
    } else {
        char inpwd_crypt[65]="";
        des2src(inpwd_crypt,rPack->snote2); //检查电子钱包密码
        if(!strlen(inpwd_crypt))
            return E_EACCPWD;

        if(strcmp(inpwd_crypt,tNetAccount.paypwd)!=0)
            return E_EACCPWD;

        //if(tNetAccount.stoppayflag[0]=='1')
        //	return ERRINFO(E_EACC_STOPPAY,tNetAccount.accno);

        if(amtcmp(trans.inputamt,tNetAccount.balance)>0)
            return ERRINFO(E_EACC_BALANCE_SHORTAGE,trans.inputamt-tNetAccount.balance);

        double CardMaxBal=0;
        ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
        if(ret)
            return ret;
        if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0)
            return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
    }
    trans.feetype=0;
    trans.usecardflag=1;
    trans.custid=tCard.custid;
    ret=pAccTrans->doTrans();
    if(ret)
        return ret;
    T_t_transdtl transdtl;
    memset(&transdtl,0,sizeof(transdtl));

    des2src(transdtl.refno,tRefno.refno); // 交易参考号
    des2src(transdtl.transdate,trans.accdate);
    des2src(transdtl.transtime,trans.acctime);
    des2src(transdtl.coldate,trans.accdate);
    des2src(transdtl.coltime,trans.acctime);
    strcpy(transdtl.accdate,trans.accdate);
    strcpy(transdtl.acctime,trans.acctime);
    transdtl.termid=trans.termid;
    transdtl.termseqno=trans.termseqno;
    transdtl.transcode=trans.transcode;
    transdtl.cardno=trans.cardno;
    transdtl.purseno=trans.purseno;
    des2src(transdtl.custname,tNetAccount.accname);
    if(TC_EACC2CARD==trans.transcode) {
        transdtl.transflag=TF_DPS;
        transdtl.cardcnt = trans.dpscnt;
    } else {
        transdtl.transflag=TF_PAY;
        transdtl.cardcnt = trans.paycnt;
    }
    transdtl.cardbefbal=trans.cardbefbal;
    transdtl.cardaftbal=trans.cardaftbal;
    transdtl.managefee=trans.totalfeeamt;
    transdtl.amount=trans.inputamt;
    des2src(transdtl.opercode,trans.opercode);
    transdtl.status[0]=DTLSTATUS_SUCCESS;
    transdtl.revflag[0]='0';
    des2src(transdtl.showcardno,tCard.showcardno);
    transdtl.custid=tCard.custid;
    GetStuempnoByCustid(transdtl.custid,transdtl.stuempno);
    ret=DB_t_transdtl_add(&transdtl);
    if(ret) {
        if(DB_REPEAT==ret)
            return E_DB_TRANSDTL_E;
        else
            return E_DB_TRANSDTL_I;
    }

    ST_CPACK aPack;
    ST_PACK *outPack = &(aPack.pack);
    ResetNormalCPack(&aPack,0,1);

    SetCol(handle,0);
    SetCol(handle,F_LVOL0,F_LVOL8,F_SDATE0,F_SPHONE3,F_SADDR,
           F_SDATE3,F_STIME3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);

    strcpy(outPack->sphone3,tRefno.refno);
    strcpy(outPack->saddr,tRefno.mac);
    outPack->lvol0=tCard.cardno;
    outPack->lvol8=D4U5(trans.cardaftbal*100,0);
    des2src(outPack->sdate3,trans.accdate);
    des2src(outPack->stime3,trans.acctime);
    des2src(outPack->semp,trans.opercode);
    outPack->lwithdraw_flag=trans.termid;
    outPack->lserial1=trans.termseqno;
    char temp[128]="";
    if(TC_EACC2CARD==trans.transcode) {
        sprintf(temp,"电子账户向卡转账 %.2f 元成功,电子账户余额:%.2f 卡余额:%.2f",
                trans.inputamt,
                trans.draccaftbal,
                trans.cardaftbal);
    } else {
        sprintf(temp,"卡向电子账户转账 %.2f 元成功,电子账户余额:%.2f 卡余额:%.2f",
                trans.inputamt,
                trans.craccaftbal,
                trans.cardaftbal);
    }

    pAccTrans->remark+=temp;
    strcpy(outPack->vsmess,pAccTrans->remark.c_str());
    des2src(trans.remark,outPack->vsmess);
    PutRow(handle,outPack,pRetCode,szMsg);
    return 0;
}
Esempio n. 7
0
static int pack_body(TRANS& trans,std::string& body)
{
    int ret = 0;

	gReader.fetchRow();

	//生成交易流水号并记录
    ret = GetNewRefno(trans.refno);
    if (ret)
    {
        return ret;
    }

	   TiXmlDocument doc;
    {
        TiXmlElement root("ROOT");
        doc.InsertEndChild(root);
    }
    char dt[15] = {0};
    getsysdatetime(dt);
    string now(dt);

	TiXmlNode& root = *(doc.FirstChild());

 	//版本号
	ec_add_xml_node_value(root,"VERSION", "010101" );

	//交易代码
	ec_add_xml_node_value(root,"TRANS_TYPE", "120226" );

	//动作代码
	ec_add_xml_node_value(root,"ACTION_TYPE", "1");

	/*//响应代码
	ec_add_xml_node_value(root,"RESP_CODE", );*/

	//登录身份类型
	ec_add_xml_node_value(root,"LOGIN_TYPE", "1");

	//交易渠道
	ec_add_xml_node_value(root,"TRANS_SOURCE", "BP");

	//登录机构代码
	ec_add_xml_node_value(root,"LOGIN_INST_CODE", "10006");

	//交易日期
	{
		string str;
		str.assign(trans.accdate,8);
		ec_add_xml_node_value(root,"TXN_DATE", str);
	}

	//交易时间
	{
		string str;
		str.assign(trans.acctime,6);
		ec_add_xml_node_value(root,"TXN_TIME", str);
	}

	//跟踪号/流水号
	{
		string str;
		str.assign(trans.refno,14);
		//str[6]='0';
		//str[7]='0';
		str=str.substr(6);
		//str.append(1,'1');
		ec_add_xml_node_value(root,"TRACE_NO", str);
	}

	//受卡机终端标识码

	ec_add_xml_node_value(root,"CARD_ACCPTR_TERMNL_ID", "12345676");

	//登录网点代码
	{
		string str;

		ret = get_ec_para(YTCEC_LOGIN_MERCH, str);
		if (ret)
		{
			LOG(ERROR, "中银通登录网点代码未配置");
			return E_COMMON_ERR;
		}
		ec_add_xml_node_value(root,"LOGIN_MERCH_CODE", str);
	}
	//ec_add_xml_node_value(root,"LOGIN_MERCH_CODE", "J001");

	//登录操作员代码
	{
		string str;

		ret = get_ec_para(YTCEC_LOGIN_USER, str);
		if (ret)
		{
			LOG(ERROR, "中银通登录操作员代码未配置");
			return E_COMMON_ERR;
		}
		ec_add_xml_node_value(root,"LOGIN_USER_CODE", str);
	}
	//ec_add_xml_node_value(root,"LOGIN_USER_CODE", "A5");

	    string  cardno_begin;   //开始卡号
        string  cardno_end;     //结束卡号
        int     cardcnt;        //卡数量
        string  product_group_code;     //产品组代码
        string  product_code;   //产品代码
        int     in_fee_amt;     //内收手续费
        int     out_fee_amt;    //外收手续费
        int     receivable_amt; //应收金额
        int     is_guarantee_deposit;   //是否收取押金
        int     guarantee_deposit;      //押金
        int     is_get_fee;     //是否收费
        int     fee_amt;        //发卡费
        string  idcode; //持卡人证件号码
        string  idtype; //持卡人证件类型
        string  name;   //持卡人名
        string  familyname;     //持卡人姓
        string  name_spell;     //持卡人名-拼音
        string  familyname_spell;       //持卡人姓-拼音
        string  birthday;       //持卡人生日
        string  telphone;       //持卡人电话号码
        string  mobile; //持卡人手机
        string  address;        //持卡人地址
        string  postcode;       //持卡人邮编
        string  email;  //持卡人电邮
        string  corpname;       //持卡人单位名称
        string  comments;       //持卡人备注
        string  reserved;       //保留

	//卡片数量
	{
		stringstream ss;
		COL2VAR(cardcnt);
		ss << cardcnt;
		ec_add_xml_node_value(root,"CARDCOUNT",ss.str());
	}

	//起始卡号
	{
		stringstream ss;
		COL2VAR(cardno_begin);
		ss <<cardno_begin;
		ec_add_xml_node_value(root,"STARTCARD",ss.str());
	}

	//结束卡号
	{
		stringstream ss;
		COL2VAR(cardno_end);
		ss <<cardno_end;
		ec_add_xml_node_value(root,"ENDCARD",ss.str());
	}

	//产品组
	{
		stringstream ss;
		COL2VAR(product_group_code);
		ss <<product_group_code;
		ec_add_xml_node_value(root,"PRD_GRP_CODE",ss.str());
	}

	//产品
	{
		stringstream ss;
		COL2VAR(product_code);
		ss <<product_code;
		ec_add_xml_node_value(root,"PRD_CODE",ss.str());
	}

	//内收手续费
	{
		stringstream ss;
		COL2VAR(in_fee_amt);
		ss << setiosflags(ios::right)<<setw(12) <<setfill('0') <<in_fee_amt;
		ec_add_xml_node_value(root,"TOTAL_IN_FEE_AMT",ss.str());
	}

	//外收手续费
	{
		stringstream ss;
		COL2VAR(out_fee_amt);
		ss << setiosflags(ios::right)<<setw(12) <<setfill('0') <<out_fee_amt;
		ec_add_xml_node_value(root,"TOTAL_OUT_FEE_AMT",ss.str());
	}

	//应收金额
	{
		stringstream ss;
		COL2VAR(receivable_amt);
		ss << setiosflags(ios::right)<<setw(12) <<setfill('0') <<receivable_amt;
		ec_add_xml_node_value(root,"BALAMT",ss.str());
	}

	//是否收取押金
	{
		stringstream ss;
		COL2VAR(is_guarantee_deposit);
		ss <<is_guarantee_deposit;
		ec_add_xml_node_value(root,"PLEDGEFLG",ss.str());
	}

	//押金
	{
		stringstream ss;
		COL2VAR(guarantee_deposit);
		ss << setiosflags(ios::right)<<setw(12) <<setfill('0') <<guarantee_deposit;
		ec_add_xml_node_value(root,"PLEDGE",ss.str());
	}

	//是否收费
	{
		stringstream ss;
		COL2VAR(is_get_fee);
		ss <<is_get_fee;
		ec_add_xml_node_value(root,"FEEFLG",ss.str());
	}

	//发卡费
	{
		stringstream ss;
		COL2VAR(fee_amt);
		ss << setiosflags(ios::right)<<setw(12) <<setfill('0') <<fee_amt;
		ec_add_xml_node_value(root,"FEE",ss.str());
	}

	//持卡人证件号码
	{
		stringstream ss;
		COL2VAR(idcode);
		ss <<idcode;
		ec_add_xml_node_value(root,"IDCODE",ss.str());
	}

	//持卡人证件类型
	{
		stringstream ss;
		COL2VAR(idtype);
		ss <<idtype;
		ec_add_xml_node_value(root,"IDTYPE",ss.str());
	}

	//持卡人名
	{
		stringstream ss;
		COL2VAR(name);
		ss <<name;
		ec_add_xml_node_value(root,"NAME",ss.str());
	}

	//持卡人姓
	{
		stringstream ss;
		COL2VAR(familyname);
		ss <<familyname;
		ec_add_xml_node_value(root,"SURNAME",ss.str());
	}

	//持卡人拼音名
	{
		stringstream ss;
		COL2VAR(name_spell);
		ss <<name_spell;
		ec_add_xml_node_value(root,"SPELL_NAME",ss.str());
	}

	//持卡人拼音姓
	{
		stringstream ss;
		COL2VAR(familyname_spell);
		ss <<familyname_spell;
		ec_add_xml_node_value(root,"SPELL_SURNAME",ss.str());
	}

	//持卡人生日
	{
		stringstream ss;
		COL2VAR(birthday);
		ss <<birthday;
		ec_add_xml_node_value(root,"BIRTHDAY",ss.str());
	}

	//持卡人电话号码
	{
		stringstream ss;
		COL2VAR(telphone);
		ss<<telphone;
		ec_add_xml_node_value(root,"COPHONE",ss.str());
	}

	//持卡人手机
	{
		stringstream ss;
		COL2VAR(mobile);
		ss<<mobile;
		ec_add_xml_node_value(root,"MOBILE",ss.str());
	}

	//持卡人地址
	{
		stringstream ss;
		COL2VAR(address);
		ss<<address;
		ec_add_xml_node_value(root,"ADDR",ss.str());
	}

	//持卡人邮编
	{
		stringstream ss;
		COL2VAR(postcode);
		ss<<postcode;
		ec_add_xml_node_value(root,"POST",ss.str());
	}

	//持卡人电邮
	{
		stringstream ss;
		COL2VAR(email);
		ss<<email;
		ec_add_xml_node_value(root,"EMAIL",ss.str());
	}

	//持卡人单位名称
	{
		stringstream ss;
		COL2VAR(corpname);
		ss<<corpname;
		ec_add_xml_node_value(root,"COMNAME",ss.str());
	}

	//持卡人备注
	{
		stringstream ss;
		COL2VAR(comments);
		ss<<comments;
		ec_add_xml_node_value(root,"CUSTRES",ss.str());
	}

	//保留域
	{
		stringstream ss;
		COL2VAR(reserved);
		ss<<reserved;
		ec_add_xml_node_value(root,"RESERVED",ss.str());
	}



	//报文鉴别码
	// ec_add_xml_node_value(root, "MESG_AUTHN_CODE", "87AE");
    ec_bank_any_ytc::calc_trans_mac(&root);

	TiXmlPrinter printer;
    doc.Accept(&printer);

	char xml_header[100]="<?xml version='1.0' encoding='GBK'?>\n";
	body.append(xml_header);
    body += printer.CStr();
	return 0;
}
Esempio n. 8
0
int F240002(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	pAccTrans->trans.transcode=TC_BANKTRANS;
	TRANS& trans=pAccTrans->trans;
	trans.termid=atoi(rPack->sorder2);
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	trans.inputamt = rPack->lvol5/100.0;
	trans.unusedamt=trans.inputamt;
	trans.cardflag=1;
	trans.usecardflag=1;
	trans.cardbefbal=rPack->lvol6/100.00;
	trans.dpscnt=rPack->lvol1+1;
	trans.cardaftbal=trans.cardbefbal;
	//转账不允许转小数金额
	if((rPack->lvol5)%100>0)
	{
		writelog(LOG_ERR,"trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		strcpy(szMsg,"转账金额必须是整数");
		return E_TRANS_TRANSMONEY_OUTRANGE;
	}
	if(rPack->lvol5<1)
	{
		writelog(LOG_ERR,"trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		strcpy(szMsg,"转账金额不能为0");
		return E_TRANS_TRANSMONEY_OUTRANGE;
	}
	T_t_account		tAccount;		//帐户表
	T_t_card		card;

	memset(&tAccount,0,sizeof(tAccount));
	memset(&card,0,sizeof(card));


	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);


	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_DAMT0,F_DAMT1,F_DAMT2,F_LVOL1,F_LVOL2,F_LSERIAL0,F_SNAME2,0);


	//判断设备是否登陆
	if(0!=device_login_yes_or_no(trans.termid))
	{
		writelog(LOG_ERR,"Device don't login");
		return E_TRANS_TERM_NOLOGIN;
	}
	trans.cardno=atoi(rPack->sserial0);
	ret=pAccTrans->CheckAcc(&card,&tAccount);
	if(ret)
		return ret;
	if(amtcmp(trans.cardbefbal-tAccount.balance,MAXAMT_CARDGTACC)>=0)
	{
		writelog(LOG_ERR,"cardbefbal[%.2lf]account balance[%.2lf]",trans.cardbefbal,tAccount.balance);
		return ERRIF_CARDBAL_EXCEPT;
	}		
	double CardMaxBal=0;
	ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
	if(ret)
		return ret;
	if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0)
		return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
	trans.feetype=card.feetype;
	trans.cardtype=card.cardtype;
	trans.custid=card.custid;
	des2src(trans.cardaccno,tAccount.accno);		//贷方帐户,持卡人账户
	des2src(trans.draccno,rPack->sstation0);		//借方帐号,由前置机上传
	ret=pAccTrans->doFeeTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doMainTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;	
	//业务结束后,回滚事务
	ret=db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_rollback error,error code=[%d]",ret);
		return E_DB_ROLLBACK;
	}
	//重新取流水号
	ret=pAccTrans->GetTermSeqno();
	if(ret)
	{
		writelog(LOG_ERR,"GetTermSeqno error,error code=[%d]",ret);
		return ret;
	}
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));

	des2src(transdtl.transdate,trans.transdate);
	des2src(transdtl.transtime,trans.transtime);
	strcpy(transdtl.accdate,trans.accdate);
	strcpy(transdtl.acctime,trans.acctime);
	transdtl.termid=trans.termid;
	transdtl.termseqno=trans.termseqno;
	transdtl.transcode=trans.transcode;
	transdtl.paytype=trans.fundtype;
	des2src(transdtl.voucherno,trans.voucherno);
	transdtl.cardno=trans.cardno;
	transdtl.purseno=trans.purseno;
	transdtl.transflag=TF_DPS;
	transdtl.cardcnt=trans.dpscnt;
	transdtl.cardbefbal=trans.cardbefbal;
    transdtl.amount=trans.totaltransamt;
	transdtl.managefee=trans.totalfeeamt;
	transdtl.cardaftbal=trans.cardaftbal;
	transdtl.custid=card.custid;
	//transdtl.sysid= rPack->lvol2;
	transdtl.exttype=EXTTYPE_BANKCARD;	
	des2src(transdtl.extdata,rPack->scust_auth);
	des2src(transdtl.showcardno,card.showcardno);
	transdtl.status[0]=DTLSTATUS_FAIL;
	ret=GetNewRefno(transdtl.refno);
	if(ret)
	{
		ERRTIP("取交易参考号失败");
		return ret;
	}		
	GetCustBaseInfoByCustID(card.custid,transdtl.custname,transdtl.stuempno,NULL);
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
	  if(DB_REPEAT==ret)
	    return E_DB_TRANSDTL_E;
	  else
	    return E_DB_TRANSDTL_I;
	}	
	char sMsg[255]="";
	char sDebugMsg[255]="";
	sprintf(sDebugMsg,"流水号:%d ",trans.termseqno);
	sprintf(sMsg,"充值前卡余额:%.2lf 转帐后卡余额:%.2lf ",trans.cardbefbal,trans.cardaftbal);
    strcat(sDebugMsg,sMsg);
	writelog(LOG_DEBUG,sDebugMsg);

	des2src(out_pack->sname2,transdtl.refno);
	out_pack->lserial0=trans.termseqno;
	out_pack->damt0=trans.cardaftbal;
	out_pack->damt1=transdtl.amount;
	out_pack->damt2=transdtl.managefee;
	out_pack->lvol1=transdtl.termseqno;
	out_pack->lvol2=D2I(trans.cardaftbal*100);
	
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
}