python实现银行卡号生成器

1. 银行卡生成规则

银行卡一般为16位或者19位,根据不同银行或者不同银行的不同卡种生成

1.1. 银行bin码

BIN号即银行标识代码,英文全称是 Bank Identification Number。BIN由6位数字表示,出现在卡号的前6位,由国际标准化组织(ISO)分配给各从事跨行转接交换的银行卡组织。国内常见银行的bin号如下:

银行卡bin码不全为6位,其余见:银行卡bin码大全

1.2. 中间位

也是各个银行的自定义位,不同银行根据不同的规则生成,有些银行根据分行、支行等信息生成,也有的银行根据流水顺序生成

1.3. 校验位

根据LUHN算法生成,假如不包含校验码的字串为x,计算方法如下:
1.3.1. 从x的右边第1个数字开始,每隔一位乘以2
1.3.2. 把第一步中获得的乘积各位数相加得sum1
1.3.3. x中未乘2的各位数相加得sum2
1.3.4. sum=sum1+sum2,sum对10取模后得到m
1.3.5. 若n为0,则校验码为0,其余则为对应的10-n,即n对10得补数

举例:

不包含校验码的银行卡为6226634703308310
1. 02=0,32=6,02=0,32=6,72=14,32=6,62=12,22=4
2. sum1 = 0+6+0+6+(1+4)+6+(1+2)+4=30
3. sum2 = 1+8+3+0+4+6+2+6=30
4. sum=sum1+sum2=60
5. sum%10 = 0,所以校验码为0

2. python编码实现

2.1. 银行卡bin码生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def getBinNum(self, useRandom=True):
bankToBin = json.load(open("function/json/banknametobin.json", encoding="utf-8"))
if useRandom:
print("随机生成一个银行bin号......")
tempBank = random.sample(bankToBin.keys(), 1)[0]
self.binNum = bankToBin[tempBank]
return self.binNum, tempBank
else:
print("请选择银行:")
bankList = list(bankToBin.keys())
for i in range(len(bankList)):
print("%d.%s" % (i, bankList[i]))
bankNum = input()
if len(bankNum) == 0:
return self.getBinNum()
elif int(bankNum) in range(len(bankList)):
self.binNum = bankToBin[bankList[int(bankNum)]]
return self.binNum, bankList[int(bankNum)]
else:
print("输入有误,请重新输入:")
return self.getBinNum(useRandom=False)
2.2 中间位生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def getMidNum(self, useRandom=True):
if useRandom:
print("默认生成一个16位的银行卡")
tempMidnum = ""
for x in range(9):
tempMidnum = tempMidnum + str(random.randint(0, 10))
x = x
self.midNum = tempMidnum
return self.midNum
else:
tempNum = input("请输入要生成银行卡位数(16或19位):")
if len(tempNum) == 0:
return self.getMidNum()
elif int(tempNum) in (16, 19):
tempMidnum = ""
for x in range(int(tempNum)-6-1):
tempMidnum = tempMidnum + str(random.randint(0, 10))
self.midNum = tempMidnum
return self.midNum
else:
print("输入有误,请重新输入:")
return self.getMidNum(useRandom=False)
2.3 校验码生成
1
2
3
4
5
6
7
8
9
10
11
12
def getLastcode(self, bankNumNoLastcode):
sum = 0
for i in bankNumNoLastcode[-1::-2]:
for m in str(int(i)*2):
sum = sum + int(m)
for j in bankNumNoLastcode[-2::-2]:
sum = sum + int(j)
if sum % 10 == 0:
self.lastCode = '0'
else:
self.lastCode = str(10 - sum % 10)
return self.lastCode

源码见:https://github.com/xdthesun/GetInfomation.git

投食