银联卡BIN:发卡行识别码,最长 12 位,最短 6 位,因此在卡交易时候需要判断其BIN属于哪家银行,要从12位开始判断,如果12位没有,则判断11位,直到6位,如果6位也没有,那即视为非银联交易卡
但是由于卡BIN信息是存在数据库中的,所以在交易的时候每次都查询数据库,会使交易时间更慢,容易造成交易超时,而且操作数据库太频繁,所以我选择了一次查询出来,存放到static数组变量中,判断卡BIN的时候从数组中查找,这样做,程序只要在载入的时候就存放在内存中,每次使用直接从内存里面读取,不用再操作数据库,对于分布式数据库应用有很大的意义,尽管内存资源的占用会增加,但是是值得的
#define CUPSCTL_COUNT 500
static CUPSCTL local_cupsctl[CUPSCTL_COUNT];static int local_cupsctl_cnt;int init_cupsctl(HSTMT v_hstmt) /*初始化数据库中卡BIN放到内存中*/{ char l_tmpstr[1024]; int ret_code,i; int cupsctl_cnt;
memset(l_tmpstr,' ',sizeof(l_tmpstr)); for ( i = 0; i < CUPSCTL_COUNT ; i ++ ) { memset(&local_cupsctl[i],' ',sizeof(CUPSCTL)); }
cupsctl_cnt = 0; sprintf(l_tmpstr,"select * from CUPSCTL order by dc_preind"); CLCenReset(v_hstmt); ret_code = CLCenExec(v_hstmt,(unsigned char *)l_tmpstr,SQL_NTS); if(ret_code == SQL_SUCCESS || ret_code== SQL_SUCCESS_WITH_INFO) { while ((ret_code=GET_CUPSCTL(&local_cupsctl[cupsctl_cnt],v_hstmt))==0) { cupsctl_cnt ++; if ( cupsctl_cnt > CUPSCTL_COUNT ) { break; /*最多存放CUPSCTL_COUNT个*/ } } local_cupsctl_cnt = cupsctl_cnt; } else { MPRI_DEBUG(-1,ERROR_LEVEL,"CUPSCTL表查询失败!"); DSPMSG("CUPSCTL表查询失败!"); return -1; }
return 0;}
/*从数组中判断此卡BIN的信息*/int get_cupsctl_forarray(char *v_tcard_no, CUPSCTL *v_cupsctl){ int ret_code; int i,j,stop_flag; char l_card_bin[12]; /*放置输入卡号的前12位到6位*/
i = 0; /*循环卡号,从12位到6位*/ j = 0; /*循环CUPSCTL数组内容*/ stop_flag = 0;
for ( i = 12 ; i > 5 ; i -- ) { memset(l_card_bin,' ',sizeof(l_card_bin)); memcpy(l_card_bin,v_tcard_no,i); /*把卡号前i位复制给l_card_bin*/
for ( j=local_cupsctl_cnt; j >= 0 ; j--)/*数组中的CUPSCTL是否有此BIN*/ { if ( 0 == memcmp(l_card_bin,local_cupsctl[j].dc_preind,i) ) { memcpy(v_cupsctl,&local_cupsctl[j],sizeof(CUPSCTL)); stop_flag = 1; break; } }
if ( 1 == stop_flag ) { break; } }
if ( 1 != stop_flag ) { DSPMSG("非受理卡!"); return -1; }
return 0;}