//查询银行卡余额 int Pos_QueryBank(INNER_TRANS_REQUEST * pNode) { int ret=0; double bank_balance=0; char device_id[10+1]=""; char card_id[12+1]=""; char bankcard_no[30+1]=""; char card_pwd[6+1]=""; //判断设备是否登录 des2src(card_id,pNode->CardNo); des2src(device_id,pNode->TerminalId); des2src(bankcard_no,pNode->BankCardNo); des2src(card_pwd,pNode->AccountPwd); ret=device_login_yes_or_no(atoi(device_id)); if(ret) { if(ret<0) { writelog(LOG_ERR,"device_login_yes_or_no faild,=[%s]",device_id); return E_TRANS_SCHOOL_NETERR; } else { writelog(LOG_INFO,"Device has not signed in!device_id=[%s],background ret=[%d]",device_id,ret); return E_TRANS_TERM_NOLOGIN; } } //判断操作方式(AUTH_MODE),如果绑定关系,判断校园卡密码是否正确 if(AUTH_MODE_SCHOOLPWD==g_Bank.AUTH_MODE) { //判断绑定对应关系是否相符 ret=verify_sch_bank_relationship(0,atoi(card_id),"",0,bankcard_no); if(ret) { writelog(LOG_INFO,"verify_sch_bank_relationship error!card_id=[%s],bankcard_id=[%s]",card_id,bankcard_no); return E_TRANS_RELATION_ERR; } ret=verify_card_password(atoi(card_id),"", 0,card_pwd); if(ret) { writelog(LOG_INFO,"Verify card password faild!card_id=[%s]",card_id); return ret; } } //发送银行查询余额申请包 ret=Bank_QueryBalance(pNode,&bank_balance); if(ret) { writelog(LOG_INFO,"Bank_QueryBalance error!card_id=[%s],bankcard_id=[%s]",card_id,bankcard_no); return ret; } writelog(LOG_INFO,"Query bank card balance succeed!Balance=[%s]",pNode->Balance); return 0; }
int Pos_Transfer(INNER_TRANS_REQUEST * pNode) { int ret=0; // double bank_balance=0; char device_id[10+1]=""; char card_id[12+1]=""; char bankcard_no[30+1]=""; char card_pwd[6+1]=""; int cur_serial_no=0; des2src(card_id,pNode->CardNo); des2src(device_id,pNode->TerminalId); des2src(bankcard_no,pNode->BankCardNo); des2src(card_pwd,pNode->AccountPwd); ST_PACK ArrayPack; // 设置返回包 ST_CPACK aPack; // 设置应答包 // ST_PACK *out_pack = &(aPack.pack); ST_CPACK sPack; // 设置发送包 ResetNormalCPack(&aPack, 0, 1); memset(&ArrayPack, 0, sizeof(ArrayPack)); //判断设备是否登录 ret=device_login_yes_or_no(atoi(device_id)); if(ret) { if(ret<0) { writelog(LOG_ERR,"device_login_yes_or_no faild,=[%s]",device_id); return E_TRANS_SCHOOL_NETERR; } else { writelog(LOG_INFO,"Device has not signed in!device_id=[%s],background ret=[%d]",device_id,ret); return E_TRANS_TERM_NOLOGIN; } } //判断操作方式(AUTH_MODE),如果绑定关系,判断校园卡密码是否正确 if(AUTH_MODE_SCHOOLPWD==g_Bank.AUTH_MODE) { //判断绑定对应关系是否相符 ret=verify_sch_bank_relationship(0,atoi(card_id),"",0,bankcard_no); if(ret) { writelog(LOG_INFO,"verify_sch_bank_relationship error!card_id=[%s],bankcard_id=[%s]",card_id,bankcard_no); return E_TRANS_RELATION_ERR; } ret=verify_card_password(atoi(card_id),"", 0,card_pwd); if(ret) { writelog(LOG_ERR,"Verify card password faild!card_id=[%s]",card_id); return ret; } } //循环操作,从配置文件中判断上传银行卡号对应的银行以及对应的银行科目帐号 int flag=0; for(int i=0;i<=g_Bank.BankCount;i++) { if(i==g_Bank.BankCount) { writelog(LOG_ERR,"E_TRANS_BANK_CARD_NONSUPPORT,i=[%d]!g_Bank.BankCount=[%d]",i,g_Bank.BankCount); return E_TRANS_BANK_CARD_NONSUPPORT; } for(int j=0;j<MAX_RANGE;j++) { //printf("i=[%d],j=[%d],bankcard=[%s],range=[%s],len=[%d]]\n",i,j,pNode->BankCardNo,g_Bank.BankUnit[i].szBankCardRange[j],strlen(g_Bank.BankUnit[i].szBankCardRange[j])); if(0==strlen(g_Bank.BankUnit[i].szBankCardRange[j])) break; if(0==memcmp(pNode->BankCardNo,g_Bank.BankUnit[i].szBankCardRange[j] ,strlen(g_Bank.BankUnit[i].szBankCardRange[j]))) { flag=1; g_Bank.cur_bankid=i; break; } } if(flag==1) break; } //发起模拟入账申请 ResetNormalCPack(&sPack, 0, 1); sPack.head.RequestType = 240002; SetHeadCol(&sPack, F_SORDER2,F_SCUST_AUTH,F_SEMP_PWD,F_SSERIAL0,F_SSTATION0,F_LVOL5,F_LVOL0,F_LVOL6,F_LVOL1,F_LVOL2, 0); // 设置发送windows BU的头部视图信息 //memcpy(&(sPack.pack), in_pack, sizeof(sPack.pack)); des2src(sPack.pack.sorder2,pNode->TerminalId); des2src(sPack.pack.scust_auth,pNode->BankCardNo); des2src(sPack.pack.semp_pwd,pNode->AccountPwd); des2src(sPack.pack.sserial0,pNode->CardNo); sPack.pack.lvol5=atoi(pNode->TransMoney); sPack.pack.lvol0=pNode->SendNo; sPack.pack.lvol6=atoi(pNode->AccountMoney); sPack.pack.lvol1=pNode->RecvNo; sPack.pack.lvol2=g_Bank.BankUnit[g_Bank.cur_bankid].iBankID; des2src(sPack.pack.sstation0,g_Bank.BankUnit[g_Bank.cur_bankid].szBankAccountNO); //des2src(sPack.pack.sstation0,"1021"); writelog(LOG_ERR,"g_Bank.BankUnit[g_Bank.cur_bankid].szBankAccountNO=[%s]",g_Bank.BankUnit[g_Bank.cur_bankid].szBankAccountNO); ret = ExtCall(0, g_Bank.DRTP_BRANCH, g_Bank.BCC_BASEFUNCNO, 0, g_Bank.TIMEOUT, &sPack, &aPack, &ArrayPack); if (ret < 0) { if (-2 == ret) return E_TRANS_INNER_TIMEOUT; else return E_TRANS_INNER_TIMEOUT; } //如果后台失败,则此处返回后台返回的错误码 if(aPack.head.retCode) { return aPack.head.retCode; } //调用银行接口函数,按照不同的银行转帐接口发送报文并接受应答 //该函数为通用结构,不同银行接口按照该函数名进行封装转帐报文 // cur_serial_no=aPack.pack.lvol1; ret=Bank_Transfer(pNode,cur_serial_no); if(ret) { writelog(LOG_ERR,"Bank_Transfer error,errcode=[%d]",ret); if(E_TRANS_BANK_NOANSWER==ret) //如果银行没有返回包,进行冲正处理 { ResetNormalCPack(&sPack, 0, 1); sPack.head.RequestType = 240003; SetHeadCol(&sPack, F_SORDER2,F_SCUST_AUTH,F_SEMP_PWD,F_SSERIAL0,F_LVOL5,F_LVOL0,F_LVOL6,F_LVOL1,F_LVOL2, 0); // 设置发送windows BU的头部视图信息 //memcpy(&(sPack.pack), in_pack, sizeof(sPack.pack)); des2src(sPack.pack.sorder2,pNode->TerminalId); des2src(sPack.pack.scust_auth,pNode->BankCardNo); des2src(sPack.pack.semp_pwd,pNode->AccountPwd); des2src(sPack.pack.sserial0,pNode->CardNo); sPack.pack.lvol5=atoi(pNode->TransMoney); sPack.pack.lvol0=cur_serial_no; sPack.pack.lvol6=atoi(pNode->AccountMoney); sPack.pack.lvol1=pNode->RecvNo; sPack.pack.lvol2=g_Bank.BankUnit[g_Bank.cur_bankid].iBankID; ret = ExtCall(0, g_Bank.DRTP_BRANCH, g_Bank.BCC_BASEFUNCNO, 0, g_Bank.TIMEOUT, &sPack, &aPack, &ArrayPack); if (ret < 0||aPack.head.retCode!=0) { writelog(LOG_ERR,"Call 240003 error,ret=[%d],retCode=[%d]",ret,aPack.head.retCode); } return E_TRANS_BANK_NOANSWER; } else return ret; } //调用后台正式入账接口 ResetNormalCPack(&aPack, 0, 1); sPack.head.RequestType = 240001; SetHeadCol(&sPack, F_SORDER2,F_SCUST_AUTH,F_SEMP_PWD,F_SSERIAL0,F_SSTATION0,F_LVOL5,F_LVOL0,F_LVOL6,F_LVOL1,F_LVOL2,F_LVOL7,0); // 设置发送windows BU的头部视图信息 //外部系统标识,标识哪个银行 sPack.pack.lvol2=g_Bank.BankUnit[g_Bank.cur_bankid].iBankID; des2src(sPack.pack.sstation0,g_Bank.BankUnit[g_Bank.cur_bankid].szBankAccountNO); sPack.pack.lvol7=cur_serial_no; //模拟入账返回的流水号,用此流水号正式入账 ret = ExtCall(0, g_Bank.DRTP_BRANCH, g_Bank.BCC_BASEFUNCNO, 0, g_Bank.TIMEOUT, &sPack, &aPack, &ArrayPack); if (ret < 0) { if (-2 == ret) return E_TRANS_INNER_TIMEOUT; else return E_TRANS_INNER_TIMEOUT; } if(aPack.head.retCode) { return aPack.head.retCode; } sprintf(pNode->TransMoney,"%f",aPack.pack.damt1); sprintf(pNode->ExtraMoney,"%f",aPack.pack.damt2); sprintf(pNode->AccountMoney,"%d",aPack.pack.lvol2); pNode->RecvNo=aPack.pack.lvol1; pNode->MngFeeFlag='1'; //writelog(LOG_INFO,"transfer succeed!"); return 0; }
int Pos_UnlostCard(INNER_TRANS_REQUEST * pNode) { int ret=0; char device_id[10+1]=""; char card_id[12+1]=""; ST_PACK ArrayPack; // 设置返回包 ST_CPACK aPack; // 设置应答包 // ST_PACK *out_pack = &(aPack.pack); ST_CPACK sPack; // 设置发送包 ResetNormalCPack(&aPack, 0, 1); memset(&ArrayPack, 0, sizeof(ArrayPack)); des2src(device_id,pNode->TerminalId); des2src(card_id, pNode->CardNo); //判断设备是否登录 ret=device_login_yes_or_no(atoi(device_id)); if(ret) { if(ret<0) { writelog(LOG_ERR,"device_login_yes_or_no faild,=[%s]",device_id); return E_TRANS_SCHOOL_NETERR; } else { writelog(LOG_INFO,"Device has not signed in!device_id=[%s],background ret=[%d]",device_id,ret); return E_TRANS_TERM_NOLOGIN; } } //判断输入密码是否正确 ret=verify_card_password(atoi(card_id),"",0, pNode->AccountPwd); if(ret) { writelog(LOG_ERR,"Verify card password faild!card_id=[%s]",card_id); return ret; } //向后台发起解挂申请 ResetNormalCPack(&sPack, 0, 1); sPack.head.RequestType = 847103; SetHeadCol(&sPack, F_LVOL1,F_LVOL2,F_SCUST_LIMIT,F_LVOL6,F_LVOL7, 0); // 设置发送windows BU的头部视图信息 //memcpy(&(sPack.pack), in_pack, sizeof(sPack.pack)); //判断登陆模式,使用客户号登陆还是学工号登陆 sPack.pack.lvol1=atoi(card_id); sPack.pack.lvol2=0; des2src(sPack.pack.scust_limit,OPER_SYSTEM_KEY); sPack.pack.lvol6=0; sPack.pack.lvol7=atoi(device_id); ret = ExtCall(0, g_Bank.DRTP_BRANCH, g_Bank.BCC_BASEFUNCNO, 0, g_Bank.TIMEOUT, &sPack, &aPack, &ArrayPack); if (ret < 0||aPack.head.retCode!=0) { if(ret<0) { writelog(LOG_ERR,"Call 847103 error,errcode=[%d],retCode=[%d]",ret,aPack.head.retCode); return E_TRANS_UNKNOW_ERROR; } else { writelog(LOG_ERR,"Call 847103 error,errcode=[%d],retCode=[%d]",ret,aPack.head.retCode); return aPack.head.retCode; } } return 0; }
int Pos_ChangePwd(INNER_TRANS_REQUEST * pNode) { int ret=0; char device_id[10+1]=""; char card_id[12+1]=""; char card_pwd[6+1]=""; char card_pwd_new[6+1]=""; ST_PACK ArrayPack; // 设置返回包 ST_CPACK aPack; // 设置应答包 //ST_PACK *out_pack = &(aPack.pack); ST_CPACK sPack; // 设置发送包 memset(&sPack,0,sizeof sPack); ResetNormalCPack(&aPack, 0, 1); memset(&ArrayPack, 0, sizeof(ArrayPack)); des2src(card_pwd,pNode->AccountPwd); des2src(card_pwd_new,pNode->AccountNewPwd); des2src(device_id,pNode->TerminalId); des2src(card_id, pNode->CardNo); //判断设备是否登录 writelog(LOG_ERR,"pwd1=[%6s],pwd2=[%6s]",card_pwd,card_pwd_new); ret=device_login_yes_or_no(atoi(device_id)); if(ret) { if(ret<0) { writelog(LOG_ERR,"device_login_yes_or_no faild,=[%s]",device_id); return E_TRANS_SCHOOL_NETERR; } else { writelog(LOG_INFO,"Device has not signed in!device_id=[%s],background ret=[%d]",device_id,ret); return E_TRANS_TERM_NOLOGIN; } } //判断输入密码是否正确 ret=verify_card_password(atoi(card_id),"",0, pNode->AccountPwd); if(ret) { writelog(LOG_INFO,"Verify card password faild!card_id=[%s]",card_id); return ret; } //向后台发起修改密码的申请 ResetNormalCPack(&sPack, 0, 1); sPack.head.firstflag=1; sPack.head.nextflag = 0; sPack.head.RequestType = 847111; SetHeadCol(&sPack, F_LVOL0,F_SCUST_NO, 0); // 设置发送windows BU的头部视图信息 //memcpy(&(sPack.pack), in_pack, sizeof(sPack.pack)); sPack.pack.lvol0=atoi(card_id); des2src(sPack.pack.scust_no,card_pwd_new); ret = ExtCall(0, g_Bank.DRTP_BRANCH, g_Bank.BCC_BASEFUNCNO, 0, g_Bank.TIMEOUT, &sPack, &aPack, &ArrayPack); if (ret < 0||aPack.head.retCode!=0) { writelog(LOG_ERR,"Call 847111 error,errcode=[%d],retCode=[%d]",ret,aPack.head.retCode); return E_TRANS_UNKNOW_ERROR; } return 0; }
//查询校园卡转帐流水 int Pos_QuerySerial(INNER_TRANS_REQUEST * pNode,TRUSERID *handle,int *pRetCode,char *szMsg) { char key[32+1]=""; char pwd[32+1]=""; //char account_id[16+1]=""; char account_pwd[6+1]=""; int ret=0; int cnt=0; //double unique=0.0; INNER_TRANS_REQUEST from_pos; T_t_tif_tradeserial tradeserial; //卡操作流水表 T_t_aif_account account; T_t_pif_card card; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); memset(&from_pos,0,sizeof(from_pos)); memset(&account,0,sizeof(account)); memset(&card,0,sizeof(card)); memcpy(&from_pos,pNode,sizeof(from_pos)); //判断设备是否登陆 if(0!=device_login_yes_or_no(atoi(from_pos.TerminalId))) { writelog(LOG_ERR,"Device don't login"); return E_TRANS_TERM_NOLOGIN; } ret=DB_t_pif_card_read_by_card_id(atoi(from_pos.CardNo),&card); if(ret) { writelog(LOG_ERR,"DB_t_pif_card_read_lock_by_cur_and_card_id error,errcode=[%d]",ret); //sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR); return E_TRANS_SCHACC_NOEXIT; } strcpy(key,STATIC_SEED_KEY); Strncpy_t(account_pwd, from_pos.AccountPwd,sizeof(account_pwd)); EncodePwd(key,account_pwd,pwd, 0); //判断卡密码是否正确 if(0!=memcmp(pwd,card.password,sizeof(pwd))) { writelog(LOG_ERR,"Card password error,clear_pwd[%s],input_pwd=[%s],db_pwd=[%s]",account_pwd,pwd,card.password); //sprintf(pNode->RetCode,"%d",E_TRANS_SCHCARD_PWDERR); return E_TRANS_SCHCARD_PWDERR; } if(strncmp(card.state_id,TYPE_YES,1)!=0) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"card_state=[%s]",card.state_id); return E_TRANS_SCHACC_DESTORY; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_LOST]) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"card_state=[%s]",card.state_id); return E_TRANS_SCHCARD_LOSTING; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_FREEZE]) { DB_t_pif_card_free_lock_by_cur(); writelog(LOG_ERR,"card_state=[%s]",card.state_id); return E_TRANS_SCHCARD_FREEZE; } ret=DB_t_tif_tradeserial_open_select_by_cur3_and_serial_type_and_card_id(TRADE_INNER_TRANS,card.card_id); if(ret) { db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ALERT,"declare cursor err sqlcode[%d]",ret); return E_TRANS_UNKNOW_ERROR; } SetCol(handle,0); SetCol(handle,F_SCLOSE_EMP,F_SORDER0,F_SORDER1,F_SSERIAL1,F_LVOL0,F_LVOL1,F_SDATE0,F_STIME0,F_SDATE1,F_STIME1,F_SCUST_NO,F_SCHANGE_EMP,F_SSERIAL0,F_LVOL2,F_SCUST_AUTH,F_SSTATUS1,F_SEMP_PWD,F_SEMP_PWD2,F_SSTATION0,F_SSTATION1,F_SORDER2,0); while(1) { ret=DB_t_tif_tradeserial_fetch_select_by_cur3(&tradeserial); if(ret) { DB_t_tif_tradeserial_close_select_by_cur3(); if(ret==DB_NOTFOUND) { if(cnt==0) { writelog(LOG_DEBUG,"There havn't record from t_tif_tradeserial table!"); break; } else break; } else return E_TRANS_UNKNOW_ERROR; } cnt++; memcpy(from_pos.TradeDate,tradeserial.operate_date,sizeof(from_pos.TradeDate)); memcpy(from_pos.TradeTime,tradeserial.operate_time,sizeof(from_pos.TradeTime)); sprintf(from_pos.CardNo,"%d",tradeserial.card_id); memcpy(from_pos.BankCardNo,tradeserial.b_act_id,sizeof(from_pos.BankCardNo)); sprintf(from_pos.TransMoney,"%d",int(tradeserial.trade_fee)*100); if(tradeserial.serial_state!=2) { sprintf(from_pos.RetCode,"%s","失败"); } else sprintf(from_pos.RetCode,"%s","成功"); //开始返回应答包 Strncpy_t(out_pack->sclose_emp,from_pos.TradeCode,sizeof(out_pack->sclose_emp)); Strncpy_t(out_pack->sorder0,from_pos.TransMoney,sizeof(out_pack->sorder0)); Strncpy_t(out_pack->sorder1,from_pos.ExtraMoney,sizeof(out_pack->sorder1)); Strncpy_t(out_pack->sserial1,from_pos.AccountMoney,sizeof(out_pack->sserial1)); out_pack->lvol0=from_pos.SendNo; out_pack->lvol1=from_pos.RecvNo; memcpy(out_pack->sdate0,from_pos.TradeDate,sizeof(from_pos.TradeDate)); memcpy(out_pack->stime0,from_pos.TradeTime,sizeof(from_pos.TradeTime)); memcpy(out_pack->sdate1,from_pos.BankDate,sizeof(from_pos.BankDate)); memcpy(out_pack->stime1,from_pos.BankTime,sizeof(from_pos.BankTime)); Strncpy_t(out_pack->scust_no,from_pos.Balance,sizeof(out_pack->scust_no)); Strncpy_t(out_pack->schange_emp,from_pos.RetCode,sizeof(out_pack->schange_emp)); Strncpy_t(out_pack->sserial0,from_pos.CardNo,sizeof(out_pack->sserial0)); out_pack->lvol2=from_pos.Notecase; Strncpy_t(out_pack->scust_auth,from_pos.BankCardNo,sizeof(out_pack->scust_auth)); sprintf(out_pack->sstatus1,"%c",from_pos.MngFeeFlag); Strncpy_t(out_pack->semp_pwd,from_pos.AccountPwd,sizeof(out_pack->semp_pwd)); Strncpy_t(out_pack->semp_pwd2,from_pos.AccountNewPwd,sizeof(out_pack->semp_pwd2)); Strncpy_t(out_pack->sstation0,from_pos.BankCardPwd,sizeof(out_pack->sstation0)); Strncpy_t(out_pack->sstation1,from_pos.BankCardNewPwd,sizeof(out_pack->sstation1)); Strncpy_t(out_pack->sorder2,from_pos.TerminalId,sizeof(out_pack->sorder2)); // printf("LINE:%d\n",__LINE__); PutRow(handle,out_pack,pRetCode,szMsg); if(cnt>=10) { DB_t_tif_tradeserial_close_select_by_cur3(); break; } } // printf("LINE:%d\n",__LINE__); T_t_tif_tradeserial_his tradeserial_his; memset(&tradeserial_his,0,sizeof(tradeserial_his)); if(cnt<10) { ret=DB_t_tif_tradeserial_his_open_select_by_cur1_and_serial_type_and_card_id(TRADE_INNER_TRANS,card.card_id); if(ret) { db_chk_err(__FILE__,__LINE__,&sqlca); writelog(LOG_ALERT,"declare cursor err sqlcode[%d]",ret); return E_TRANS_UNKNOW_ERROR; } // printf("LINE:%d\n",__LINE__); while(1) { ret=DB_t_tif_tradeserial_his_fetch_select_by_cur1(&tradeserial_his); if(ret) { DB_t_tif_tradeserial_his_close_select_by_cur1(); if(ret==DB_NOTFOUND) { writelog(LOG_DEBUG,"There havn't record from t_tif_tradeserial_his table!"); break; } else return E_TRANS_UNKNOW_ERROR; } cnt++; memcpy(from_pos.TradeDate,tradeserial_his.operate_date,sizeof(from_pos.TradeDate)); memcpy(from_pos.TradeTime,tradeserial_his.operate_time,sizeof(from_pos.TradeTime)); sprintf(from_pos.CardNo,"%d",tradeserial_his.card_id); memcpy(from_pos.BankCardNo,tradeserial_his.b_act_id,sizeof(from_pos.BankCardNo)); sprintf(from_pos.TransMoney,"%d",int(tradeserial_his.trade_fee)*100); if(tradeserial_his.serial_state!=2) { sprintf(from_pos.RetCode,"%s","失败"); } else sprintf(from_pos.RetCode,"%s","成功"); //开始返回应答包 Strncpy_t(out_pack->sclose_emp,from_pos.TradeCode,sizeof(out_pack->sclose_emp)); Strncpy_t(out_pack->sorder0,from_pos.TransMoney,sizeof(out_pack->sorder0)); Strncpy_t(out_pack->sorder1,from_pos.ExtraMoney,sizeof(out_pack->sorder1)); Strncpy_t(out_pack->sserial1,from_pos.AccountMoney,sizeof(out_pack->sserial1)); out_pack->lvol0=from_pos.SendNo; out_pack->lvol1=from_pos.RecvNo; Strncpy_t(out_pack->sdate0,from_pos.TradeDate,sizeof(out_pack->sdate0)); Strncpy_t(out_pack->stime0,from_pos.TradeTime,sizeof(out_pack->stime0)); Strncpy_t(out_pack->sdate1,from_pos.BankDate,sizeof(out_pack->sdate1)); Strncpy_t(out_pack->stime1,from_pos.BankTime,sizeof(out_pack->stime1)); Strncpy_t(out_pack->scust_no,from_pos.Balance,sizeof(out_pack->scust_no)); Strncpy_t(out_pack->schange_emp,from_pos.RetCode,sizeof(out_pack->schange_emp)); Strncpy_t(out_pack->sserial0,from_pos.CardNo,sizeof(out_pack->sserial0)); out_pack->lvol2=from_pos.Notecase; Strncpy_t(out_pack->scust_auth,from_pos.BankCardNo,sizeof(out_pack->scust_auth)); sprintf(out_pack->sstatus1,"%c",from_pos.MngFeeFlag); Strncpy_t(out_pack->semp_pwd,from_pos.AccountPwd,sizeof(out_pack->semp_pwd)); Strncpy_t(out_pack->semp_pwd2,from_pos.AccountNewPwd,sizeof(out_pack->semp_pwd2)); Strncpy_t(out_pack->sstation0,from_pos.BankCardPwd,sizeof(out_pack->sstation0)); Strncpy_t(out_pack->sstation1,from_pos.BankCardNewPwd,sizeof(out_pack->sstation1)); Strncpy_t(out_pack->sorder2,from_pos.TerminalId,sizeof(out_pack->sorder2)); PutRow(handle,out_pack,pRetCode,szMsg); if(cnt>=10) { DB_t_tif_tradeserial_his_close_select_by_cur1(); break; } } } writelog(LOG_INFO,"query trans record succeed!"); return 0; }
int F240002(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; double unique=0; int temp_serial_no=0; char logicdate[11]=""; char buffer[16]=""; int i=0; double trans_amt=0.0; char sMsg[255]=""; char sDebugMsg[255]=""; char sMaxCardBalance[20]=""; double dMaxCardBalance=0; T_t_aif_account tAccount; //帐户表 T_t_cif_customer tCustomer; T_t_pif_spefee tSpeFee; T_t_tif_tradeserial tradeserial; //卡操作流水表 T_t_pif_card card; InAcc IA; memset(&tSpeFee,0,sizeof(tSpeFee)); memset(&tCustomer,0,sizeof(tCustomer)); memset(&tAccount,0,sizeof(tAccount)); memset(&IA,0,sizeof(IA)); memset(&tradeserial,0,sizeof(tradeserial)); 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_SBANK_CODE,F_SEMP_NO,0); //memset(&tradeserial_bak,0,sizeof(tradeserial_bak)); ret=GetLogicDate(logicdate); //业务日期 if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret); goto L_RETU; } //判断设备是否登陆 if(0!=device_login_yes_or_no(atoi(rPack->sorder2))) { *pRetCode=E_TRANS_TERM_NOLOGIN; writelog(LOG_ERR,"Device don't login"); goto L_RETU; } //判断是否处于日终结算状态 ret=GetParameter(GLOBE_FLAG_BALANCE,buffer); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"GetParameter error,errcode=[%d]",ret); goto L_RETU; } else if(strncmp(buffer,"0",1)!=0) { *pRetCode=E_TRANS_BANK_SERVICE_NOEXIT; writelog(LOG_ERR,"System is balance now!"); goto L_RETU; } ret=DB_t_pif_card_read_by_card_id(atoi(rPack->sserial0),&card); if(ret) { *pRetCode=E_TRANS_SCHACC_NOEXIT; writelog(LOG_ERR,"Create serial_no error,error code=[%d]",ret); goto L_RETU; } if(strncmp(card.state_id,CARDSTAT_LOGOUT,4)==0) { *pRetCode=E_TRANS_SCHACC_DESTORY; writelog(LOG_ERR,"card.state_id=[%d]",card.card_id); goto L_RETU; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_LOST]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_TRANS_SCHCARD_LOSTING; writelog(LOG_ERR,"card_state=[%s]",card.state_id); goto L_RETU; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_FREEZE]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_TRANS_SCHCARD_FREEZE; writelog(LOG_ERR,"card_state=[%s]",card.state_id); goto L_RETU; } if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_WFAIL]) { DB_t_pif_card_free_lock_by_cur(); *pRetCode=E_TRANS_SCHCARD_WFAIL; writelog(LOG_ERR,"card_state=[%s]",card.state_id); goto L_RETU; } //转账不允许转小数金额 if((rPack->lvol5)%100>0) { *pRetCode=E_TRANS_TRANSMONEY_OUTRANGE; writelog(LOG_ERR,"Trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0); goto L_RETU; } //开始填充流水数据 //流水号 ret=getNewUniqNo(KEYTYPE_TRADESERIAL, &unique); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"Create serial_no error,error code=[%d]",ret); goto L_RETU; } tradeserial.serial_no=D2I(unique); //记录流水号,作为冲正使用 temp_serial_no=tradeserial.serial_no; tradeserial.other_seri_no=rPack->lvol0; //上传端流水号 tradeserial.serial_type=TXCODE_BANK_SCHOOL; //交易代码 tradeserial.serial_state=SERISTAT_NODEBT; //流水状态 tradeserial.card_id=atoi(rPack->sserial0); tradeserial.purse_id=0; tradeserial.in_balance=double((rPack->lvol6)/100.00); //入卡金额 tradeserial.out_balance=tradeserial.in_balance; //出卡金额 tradeserial.trade_count=rPack->lvol1+1; //当前卡中交易次数 ret=get_datetime_from_db(tradeserial.operate_date,tradeserial.operate_time); if(ret) { writelog(LOG_ERR,"get_datetime_from_db error,error code=[%d]",ret); getsysdate(tradeserial.operate_date); getsystime(tradeserial.operate_time); } Strncpy_t(tradeserial.collect_date,tradeserial.operate_date,sizeof(tradeserial.collect_date)); //采集日期 Strncpy_t(tradeserial.collect_time,tradeserial.operate_time,sizeof(tradeserial.collect_time)); //采集时间 Strncpy_t(tradeserial.enteract_date,logicdate,sizeof(tradeserial.enteract_date)); //入帐日期 Strncpy_t(tradeserial.enteract_time,tradeserial.operate_time,sizeof(tradeserial.enteract_time)); //入帐时间 tradeserial.maindevice_id=GetTransferSystemId(); //子系统号码 tradeserial.device_id=atoi(rPack->sorder2); //终端ID tradeserial.trade_fee=(rPack->lvol5)/100.0; //转帐金额 Strncpy_t(tradeserial.b_act_id,rPack->scust_auth,sizeof(tradeserial.b_act_id)); tradeserial.sys_id=rPack->lvol2; //表示银行 tradeserial.condition_id=SELF_TRANS; //自动/自助转帐标识 tradeserial.customer_id=card.cosumer_id; Strncpy_t(tradeserial.oper_code,OPER_SYSTEM_KEY,sizeof(tradeserial.oper_code)); //操作员代码 //判断转帐金额是否超出钱包最大限额 ret=DB_t_aif_account_read_by_card_id_and_purse_id(card.card_id, PURSE_NO_ONE,&tAccount); if(ret) { writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,card.card_id); if(DB_NOTFOUND==ret) { *pRetCode=E_TRANS_SCHACC_NOEXIT; goto L_RETU; } else { *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } } ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance); if(ret) { writelog(LOG_ERR,"GetParameter GLOBE_MAXCARDBALANCE error,errcode=[%d]",ret); *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } dMaxCardBalance=atof(sMaxCardBalance); if(amtcmp(tAccount.cur_bala+tradeserial.trade_fee,dMaxCardBalance)>0) { *pRetCode=E_TRANS_TRANSMONEY_OUTRANGE; goto L_RETU; } //读取客户收费类别字段 ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(card.cosumer_id, &tCustomer); if(ret) { writelog(LOG_ERR,"cut_id[%d]",card.cosumer_id); if(DB_NOTFOUND==ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } else { *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } } if(0==tCustomer.fee_type) { ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee); if(ret) { if(DB_NOTFOUND==ret) { tCustomer.fee_type=tCustomer.cut_type; } else { DB_t_cif_customer_free_lock_cur(); writelog(LOG_ERR,"DB_t_pif_spefee_read_by_dept_code_and_cut_type error,errcode=[%d]",ret); *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } } else { tCustomer.fee_type=tSpeFee.fee_type; } } DB_t_cif_customer_free_lock_cur(); //记录流水数据,用于提供正确的流水号,以及银行业务不成功供查询 ret=DB_t_tif_tradeserial_add(&tradeserial); if(ret) { *pRetCode=E_TRANS_UNKNOW_ERROR; writelog(LOG_ERR,"Insert t_tif_tradeserial table error,error code=[%d]",ret); goto L_RETU; } ret=db_commit(); if(ret) { *pRetCode=E_DB_COMMIT; writelog(LOG_ERR,"db_commit error,error code=[%d]",ret); goto L_RETU; } //填写入账结构,问问闻剑 memset(&IA,0,sizeof(IA)); des2src(IA.sArrInActno[0],tAccount.account_id); //贷方帐户,持卡人账户 des2src(IA.sArrInActno[2],rPack->sstation0); //借方帐号,由前置机上传 switch (rPack->lvol3) { case 4: IA.iArrInFeeSwitch[1] = 1; break; case 5: IA.iArrInFeeSwitch[1] = 0; break; default: break; } IA.iCardNo=card.card_id; IA.iFeeType=tCustomer.fee_type; IA.dArrInAmt[0]=tradeserial.trade_fee; writelog(LOG_ERR,"借方帐号=[%d]",atoi(rPack->sstation0)); ret=process(&IA,&tradeserial); if(ret) { writelog(LOG_ERR,"process err,errcode[%d]",ret); *pRetCode=E_TRANS_UNKNOW_ERROR; goto L_RETU; } sprintf(sDebugMsg,"流水号:%d ",IA.iSerialNo); for(i=1;i<=IA.iOutTxTypeCnt;i++) { switch(IA.iArrOutTxType[i]) { case TXTYPE_TOLL_DEPOSIT: case TXTYPE_DEDUCT_DEPOSIT: case TXTYPE_RETURN_DEPOSIT: tradeserial.deposit_fee=IA.dArrOutAmt[i]; break; case TXTYPE_PRE_TOLL_BOARD: case TXTYPE_TOLL_BOARD: case TXTYPE_DEDUCT_BOARD: case TXTYPE_RETURN_BOARD: case TXTYPE_BANK_PRE_TOLL_BOARD: tradeserial.boardfee=IA.dArrOutAmt[i]; break; case TXTYPE_TOLL_CHARGE: tradeserial.in_fee=IA.dArrOutAmt[i]; break; case TXTYPE_BANK_TRANSFER: trans_amt=IA.dArrOutAmt[i]; break; default: break; } if(amtcmp(IA.dArrOutAmt[i],0)!=0) { sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]); strcat(sDebugMsg,sMsg); } } sprintf(sMsg,"充值前卡余额:%.2lf 转帐后卡余额:%.2lf ",IA.dInCardBala,IA.dOutCardBala); strcat(sDebugMsg,sMsg); writelog(LOG_DEBUG,sDebugMsg); out_pack->damt0=tradeserial.out_balance; out_pack->damt1=tradeserial.trade_fee; out_pack->damt2=tradeserial.boardfee; out_pack->lvol1=tradeserial.serial_no; out_pack->lvol2=D2I(tradeserial.out_balance*100.0); des2src(out_pack->semp_no, tradeserial.operate_date); des2src(out_pack->sbank_code, tradeserial.operate_time); PutRow(handle,out_pack,pRetCode,szMsg); //业务结束后,回滚事务 ret=db_rollback(); if(ret) { *pRetCode=E_DB_ROLLBACK; writelog(LOG_ERR,"db_rollback error,error code=[%d]",ret); goto L_RETU; } return 0; L_RETU: return -1; }
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; }