Python 统一社会信用代码校验
网上看到有一篇用JS实现的18位社会统一信用代码校验的文章效果非常不错,但是它不便于做后端校验,我个人写的Django项目需要做后端社会统一信用代码后端校验,就小小的复现了一下。
1 统一社会信用代码标准
本代码适用于GB32100—2015《法人和其他组织统一社会信用代码编码规则》标准规定的统一社会信用代码。编码由18位阿拉伯数字或大写英文字母表示,分别是1位登记管理部门代码、1位机构类别代码、6位登记管理机关行政区划码、9位主体标识码、1位校验码。
2 校验编码
import re
def verifySocietyCode(code):
"""校验社会统一社会信用代码"""
pattern_code = re.compile('^[0-9A-Z]+$')
# 先校验长度是否满足要求
if len(code) != 18 or len(pattern_code.findall(code)) == 0:
return False
# 长度满足要求
else:
total = 0
words = '0123456789ABCDEFGHJKLMNPQRTUWXY'
weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
# 遍历计算total值
for i in range(0, len(code) - 1):
# 取出对应位置的字串
sub_string = code[i:i + 1]
# 找到该字串第一次出现的位置
sub_string_index = words.find(sub_string)
# 计算权重与加权因子之和
total = total + sub_string_index * weights[i]
# 进行逻辑校验
logic_check_code = 31 - (total % 31)
if logic_check_code == 31:
logic_check_code = 0
char_ls = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',
'L', 'M', 'N', 'P', 'Q', 'R', 'T', 'U', 'W', 'X', 'Y']
logic_check_code = char_ls[logic_check_code]
check_code = code[17:18]
if logic_check_code != check_code:
print("不是有效的统一社会信用编码!")
return False
else:
print("是有效的统一社会信用编码!")
return True
3 校验结果验证
if __name__ == "__main__":
for c in ['92330783MA29QJ0F5X', '92450303MA5MXE8R6J', '92520626MA6GJ0T945', '92411625MA44MN57X7',
'92220104MA14XX328N', '91350582M00013D31G', '622323199512052058']:
ans = verifySocietyCode(c)
print(ans, '\n')