关于银联卡BIN

    技术2022-05-11  140

    银联卡BIN:发卡行识别码,最长 12 位,最短 位,因此在卡交易时候需要判断其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;}


    最新回复(0)