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; }
//POS转帐 int Pos_Transfer(INNER_TRANS_REQUEST * pNode) { int ret=0; ST_PACK ArrayPack; // 设置返回包 ST_CPACK aPack; // 设置应答包 ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack, 0, 1); memset(&ArrayPack, 0, sizeof(ArrayPack)); //判断设备是否登录 //判断操作方式(AUTH_MODE),如果绑定关系,判断校园卡密码是否正确 //发起模拟入账申请 ST_CPACK sPack; // 设置发送包 ResetNormalCPack(&sPack, 0, 1); sPack.head.RequestType = 240002; 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=pNode->SendNo; sPack.pack.lvol6=atoi(pNode->AccountMoney); sPack.pack.lvol1=pNode->RecvNo+1; ret = ExtCall(0, 7000, 9000, 0, 4, &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; } //调用银行接口函数,按照不同的银行转帐接口发送报文并接受应答 //该函数为通用结构,不同银行接口按照该函数名进行封装转帐报文 // ret=Bank_Transfer(pNode); if(ret) { if(E_TRANS_BANK_NOANSWER==ret) //如果银行没有返回包,进行冲正处理 { ret=call_240003(); //DelTrans(&from_pos,temp_serial_no); if(ret) writelog(LOG_ERR,"DelTrans error,error code=[%d]",ret); return E_TRANS_BANK_NOANSWER; } else { writelog(LOG_ERR,"send_to_and_recv_from_bank error,errcode=[%d]",ret); return ret; } } //调用后台正式入账接口 ResetNormalCPack(&aPack, 0, 1); sPack.head.RequestType = 240001; ret = ExtCall(0, 7000, 9000, 0, 4, &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); pNode->RecvNo=aPack.pack.lvol1; pNode->MngFeeFlag='1'; //writelog(LOG_INFO,"transfer succeed!"); return 0; }