政策依据

为深入贯彻落实党中央、国务院关于推进社会信用体系建设决策部署,进一步推动社会信用体系建设高质量发展。国务院印发《国务院关于批转发展改革委等部门法人和其他组织统一社会信用代码制度建设总体方案的通知》明确了法人和其他组织统一社会信用代码的顶层制度设计和具体工作要求,确立了统一社会信用代码的管理机制和地位。

标准支撑

国家标准委先后颁布了强制性国家标准《法人和其他组织统一社会信用代码编码规则》以及《法人和其他组织统一社会信用代码赋码操作规范》、《法人和其他组织统一社会信用代码数据交换接口》等一系列标准,明确了法人和其他组织统一社会信用代码的编码要求,规范赋码、数据交换等技术要求。

统一社会信用代码构成

统一社会信用代码设计为18位,由登记管理部门代码、机构类别代码、登记管理机关行政区划码、主体标识码(组织机构代码)、校验码五部分组成。

微信图片_2025-07-16_165210_173.png

第一部分(第1位)

登记管理部门代码,使用阿拉伯数字或英文字母表示。例如:机构编制、民政、市场监管三个登记管理部门分别使用1、5、9表示。

登记管理部门代码标识
机构编制1
外交2
司法行政3
文化4
民政5
旅游6
宗教7
工会8
工商9
中央军委改革和编制办公室A
农业N
其他Y

第二部分(第2位)

机构类别代码,使用阿拉伯数字或英文字母表示。登记管理部门根据管理职能,确定在本部门登记的机构类别编码。例如,市场监管部门使用1表示企业,2表示个体工商户,3表示农民专业合作社。

登记管理部门机构类别代码标识
机构编制机关1
事业单位2
编办直接管理机构编制的群众团体3
其他9
外交外国常驻新闻机构1
其他9
司法行政律师执业机构1
公证处2
基层法律服务所3
司法鉴定机构4
仲裁委员会5
其他9
文化外国在华文化中心1
其他9
民政社会团体1
民办非企业单位2
基金会3
其他9
旅游外国旅游部门常驻代表机构1
港澳台地区旅游部门常驻内地(大陆)代表机构2
其他9
宗教宗教活动场所1
宗教院校2
其他9
工会基层工会1
其他9
工商企业1
个体工商户2
农民专业合作社3
中央军委改革和编制办公室军队事业单位1
其他9
农业组级集体经济组织1
村级集体经济组织2
乡镇级集体经济组织3
其他9
其他1

第三部分(第3-8位)

登记管理机关行政区划码,使用阿拉伯数字表示。例如:国家用100000,北京用110000。既满足登记管理部门按地区管理需求,也便于社会对注册登记主体所在区域进行识别。(参照《中华人民共和国行政区划代码〔GB/T 2260-2007〕》

第四部分(第9-17位)

主体标识码(组织机构代码),使用阿拉伯数字或英文字母表示。(参照《全国组织机构代码编制规则〔GB 11714-1997〕》

第五部分(第18位)

校验码。使用阿拉伯数字或英文字母表示。

统一社会信用代码特性

  • 唯一性 统一社会信用代码及其9位主体标识码(组织机构代码)在全国范围内是唯一的
  • 兼容性 无含义代码稳定可靠,有含义代码分类管理
  • 稳定性 统一社会信用代码一经赋予,主体存续期间,始终保持不变
  • 全覆盖 全国范围内依法设立登记的法人和其他组织,统一社会信用代码全覆盖

Java校验工具

package;
 
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
 
/**
 *
 * 组织机构代码/统一社会信用代码校验工具类
 *
 * 1.isUniformSocialCreditCode方法用于判断统一社会信用代码是否有效
 * 2.isOrganizationCertificate方法用于判断组织机构代码是否有效
 *
 */
 
public class RegexUtil {
    private static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY";
    private static final char[] BASE_CODE_ARRAY = BASE_CODE_STRING.toCharArray();
    private static final List < Character > BASE_CODES = new ArrayList < Character > ();
    private static final String BASE_CODE_REGEX = "[" + BASE_CODE_STRING + "]{18}";
    private static final int[] WEIGHT = {
        1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28
    };
 
    static {
        for (char c: BASE_CODE_ARRAY) {
            BASE_CODES.add(c);
        }
    }
 
    /**
     * 加权因子
     */
    private static int power[] = {
        3, 7, 9, 10, 5, 8, 4, 2
    };
  
    /**
     * 判断统一社会信用代码是否有效
     * @param a
     * @param b
     * @return
     */
    public static boolean isUniformSocialCreditCode(String socialCreditCode) {
            if (StringUtils.isBlank(socialCreditCode) || !Pattern.matches(BASE_CODE_REGEX, socialCreditCode)) {
                return false;
            }
            char[] businessCodeArray = socialCreditCode.toCharArray();
            char check = businessCodeArray[17];
            int sum = 0;
            for (int i = 0; i < 17; i++) {
                char key = businessCodeArray[i];
                sum += (BASE_CODES.indexOf(key) * WEIGHT[i]);
            }
            int value = 31 - sum % 31;
            return check == BASE_CODE_ARRAY[value % 31];
        }
  
        /**
         * 判断组织机构代码是否有效
         * @param organizationCertificate
         * @return
         */
    public static boolean isOrganizationCertificate(String organizationCertificate) {
        String temp = organizationCertificate.toUpperCase();
        if (temp.contains("-")) {
            temp = temp.replace("-", "");
        }
        if (temp.length() != 9) {
            return false;
        }
        // 获取前面8位
        String pre8 = temp.substring(0, 8);
        char[] pre8chars = pre8.toCharArray(); // 0~z;
        // 获取校验码
        String code = temp.substring(8, 9);
        boolean isCode = isCode(code, sum(pre8chars));
        return isCode;
    }
 
    /**
     * 求和
     * @param bit
     * @return
     */
    private static int sum(char[] bit) {
        int sum = 0;
        for (int i = 0; i < bit.length; i++) {
            int intTemp = bit[i] > '9' ? (bit[i] - 'A' + 10) : Integer.parseInt(bit[i] + "");
            System.out.print(" " + intTemp);
            sum += intTemp * power[i];
        }
        return sum;
    }
 
    /**
     * 判断机构代码的校验码和计算出的校验码是否一致
     * @param a
     * @param b
     * @return
     */
    private static boolean isCode(String a, int b) {
        String codeTEmp = (11 - b % 11) == 10 ? "X" : (11 - b % 11) == 11 ? 0 + "" : (11 - b % 11) + "";
        return a.equals(codeTEmp);
    }
}