关于银联卡BIN

来源:互联网 发布:山东媳妇 知乎 编辑:程序博客网 时间:2024/05/01 01:35

银联卡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;
}

原创粉丝点击