static int lua_iso8583_unpack(lua_State *L) { iso8583_userdata *iso8583u; unsigned char *iso8583_data; unsigned int iso8583_size; size_t data_len; char error[BUFSIZ]; unsigned int i; int n = lua_gettop(L); if (n < 2) { lua_pushnil(L); lua_pushstring(L, "arguments error! too small!"); return 2; } iso8583u = (iso8583_userdata *)luaL_checkudata(L, 1, "iso8583"); if (!lua_isstring(L, 2)) { lua_pushnil(L); lua_pushstring(L, "argument error! data must be string!"); return 2; } iso8583_data = (unsigned char *)lua_tolstring(L, -1, &data_len); iso8583_size = (unsigned int)data_len; if (iso8583_unpack(iso8583u->handle, iso8583_data, &iso8583_size) != ISO8583_OK) { lua_pushnil(L); snprintf(error, BUFSIZ, "unpack iso8583 error! %s", iso8583u->handle->error); lua_pushstring(L, error); return 2; } lua_createtable (L, 129, 0); for (i = 0; i < 129; i++) { const unsigned char *user_data; unsigned int user_size; if (iso8583_get(iso8583u->handle, i, &user_data, &user_size) != ISO8583_OK) { lua_pushnil(L); snprintf(error, BUFSIZ, "unpack iso8583 error! %s", iso8583u->handle->error); lua_pushstring(L, error); return 2; } if (user_data && user_size) { lua_pushinteger(L, (int)i); lua_pushlstring(L, (const char *)user_data, user_size); lua_settable (L, -3); } } lua_pushinteger(L, (int)iso8583_size); return 2; }
int Bank_Query(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg) { int ret=0; int amt=0; double amt1=0.0; char temp[256]=""; ST_CPACK aPack; ST_PACK *out_pack = &(aPack.pack); ResetNormalCPack(&aPack,0,1); SetCol(handle,0); SetCol(handle,F_LVOL1,F_DAMT0,0); MSG8583 zgyh_req,zgyh_ans; memset(&zgyh_req,0x20,sizeof zgyh_req); memset(&zgyh_ans,0x20,sizeof zgyh_ans); ISO_MSG iso_zgyh_req,iso_zgyh_ans; iso8583_init(&iso_zgyh_req); iso8583_init(&iso_zgyh_ans); char zgyh_sbuf[2048]=""; char zgyh_abuf[2048]=""; char buf[2048]=""; char bitmap[16]={0x60,0x20,0x00,0x00,0x20,0xc0,0x10,0x04}; if(strlen(rPack->vsvarstr1)>0) bitmap[4]=0x30; //如果三磁道信息为空,三磁道的位图置空 ret=iso8583_set(&iso_zgyh_req, 0, (unsigned char*)BANK_ZGYH_TRADE_CODE_QUERY_REQ, 4); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } ret=iso8583_set(&iso_zgyh_req, 1, (unsigned char*)bitmap,8); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写银行卡号 memset(buf,0x00,sizeof buf); sprintf(buf,"%02d",strlen(rPack->scust_limit2)); sprintf(buf+2,"%s",rPack->scust_limit2); ret=iso8583_set(&iso_zgyh_req, 2, (unsigned char*)rPack->scust_limit2,strlen(rPack->scust_limit2)); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error,rPack->scust_limit2=[%s]",rPack->scust_limit2); return E_TRANS_UNKNOW_ERROR; } //写银行处理代码-000000 3 处理代号 n6 ME ME (BCD)000000 ret=iso8583_set(&iso_zgyh_req, 3, (unsigned char*)BANK_ZGYH_EXEC_CODE_QUERY_REQ, 6); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写交易参考号-流水号-取交易参考号的后六位- 11 系统跟踪号 n6 ME ME (BCD) memset(buf,0x00,sizeof buf); sprintf(buf,"%s",rPack->sholder_ac_no+8); ret=iso8583_set(&iso_zgyh_req,11,(unsigned char*)buf,6); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写二磁道数据- 35 第二磁道数据 LLVAR z..37 C2 (BCD) ret=iso8583_set(&iso_zgyh_req,35,(unsigned char*)rPack->vsvarstr0,strlen(rPack->vsvarstr0)); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error,Second track data=[%s]",rPack->vsvarstr0); return E_TRANS_UNKNOW_ERROR; } //写三磁道数据- 36 第三磁道数据 LLLVAR z..104 C2 (BCD) if(strlen(rPack->vsvarstr1)>0) { ret=iso8583_set(&iso_zgyh_req,36,(unsigned char*)rPack->vsvarstr1,strlen(rPack->vsvarstr1)); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error,Second track data=[%s]",rPack->vsvarstr1); return E_TRANS_UNKNOW_ERROR; } } //写终端号- 41 POS终端号 ans8 ME ME (ASCII) ret=iso8583_set(&iso_zgyh_req,41,(unsigned char*)rPack->sorder2,8); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写商户号- 42 商户号 ans15 M (ASCII) memset(buf,0,sizeof buf); sprintf(buf,"%s",BANK_ZGYH_MERCH_NO); ret=iso8583_set(&iso_zgyh_req,42,(unsigned char*)buf,15); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写银行卡个人密码- 52 个人密码信息包 BIN b64 C3 ANSI X9.8标准Format 01 ret=iso8583_set(&iso_zgyh_req,52,(unsigned char*)rPack->sbank_pwd,8); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } //写交易参考号- 62 发票号 LLLVAR ans999 M (ASCII) memset(buf,0x00,sizeof buf); sprintf(buf,"%s",rPack->sholder_ac_no+8); ret=iso8583_set(&iso_zgyh_req,62,(unsigned char*)buf,6); if(ret<=0) { writelog(LOG_ERR,"iso8583_set error"); return E_TRANS_UNKNOW_ERROR; } ret=iso8583_pack(&iso_zgyh_req, zgyh_sbuf); if(ret<=0) { writelog(LOG_ERR,"Pack8583 error,errcode=[%d]",ret); return E_TRANS_UNKNOW_ERROR; } //memset(temp,0x00,sizeof temp); //des2src(temp,rPack->scust_auth); //ret=send_to_and_recv_from_bank((char *)zgyh_sbuf,ret,(char*)zgyh_abuf,200,(char*)temp,rPack->lvol0,rPack->lvol1); if(ret) { writelog(LOG_ERR,"send_to_and_recv_from_bank error,bank_id=[%d],errcode=[%d]",BANK_GSYH,ret); return E_TRANS_BANK_NOANSWER; } ret=iso8583_unpack(&iso_zgyh_ans, zgyh_abuf); if(ret<0) { writelog(LOG_ERR,"UnPack8583 error,errcode=[%d]",ret); return E_TRANS_UNKNOW_ERROR; } if(0!=strncmp((char *)iso_zgyh_ans.fld[39].buf,"00",2)) { writelog(LOG_ERR,"Receive data return code error,error code= [%2.2s] ",iso_zgyh_ans.fld[39].buf); memcpy(temp,iso_zgyh_ans.fld[39].buf,2); temp[2]=0; switch(atoi(temp)) { case 41: //银行卡挂失 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_LOST); return E_TRANS_BANKCARD_LOST; case 36: //银行卡状态错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_STATERR); return E_TRANS_BANKACC_STATERR; case 51: //银行卡金额不足 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_NOMONEY); return E_TRANS_BANKACC_NOMONEY; case 55: //银行密码错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_BANKCARD_PWDERR; case 96: //银行处理超时 //sprintf(pNode->RetCode,"%d",E_TRANS_BANK_NODECIDE); return E_TRANS_BANK_NOANSWER; case 22: //其他错误 //sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR); return E_TRANS_UNKNOW_ERROR; default: //其他未知错误 //sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR); return E_TRANS_UNKNOW_ERROR; } } memset(temp,0x00,sizeof temp); iso8583_get(&iso_zgyh_ans, 4, (unsigned char*)temp, 12); BCD2INT(&amt, (unsigned char*)temp, 12, 0); out_pack->damt0=amt/100.0; out_pack->lvol0=1; PutRow(handle,out_pack,pRetCode,szMsg); return 0; }