Python 统一社会信用代码校验

Python 统一社会信用代码校验

网上看到有一篇用JS实现的18位社会统一信用代码校验的文章效果非常不错,但是它不便于做后端校验,我个人写的Django项目需要做后端社会统一信用代码后端校验,就小小的复现了一下。



1 统一社会信用代码标准

本代码适用于GB32100—2015《法人和其他组织统一社会信用代码编码规则》标准规定的统一社会信用代码。编码由18位阿拉伯数字或大写英文字母表示,分别是1位登记管理部门代码、1位机构类别代码、6位登记管理机关行政区划码、9位主体标识码、1位校验码。

GB2015规定的社会统一信用代码


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')

社会统一信用代码校验结果


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢牛马 不怕困难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值