干货干货了,之前网上搜社会信用代码验证规则,一搜一堆java的,iOS版的特少,想想自己就写了一个,不好大家见谅啊!!!
先介绍一下验证规则:
从2015年10月1日后,中国企业营业执照上会印有“统一社会信用代码”。这新版本的营业执照将取代以前发的营业执照、组织机构代码证、税务登记证。统称“三证合一“。这也意味着申请办理新企业时,只需取得营业执照即可。另外,提供企业证明时,只需提交营业执照即可,无须再提交组织机构代码证和税务登记证。
而“统一社会信用代码”实际上编码规则采用GB 32100-2015 《法人和其他组织统一社会信用代码编码规则》而来,此规则从2015年10月1日起,正式实施。
下面是《法人和其他组织统一社会信用代码编码规则》的说明。
1 范围
本标准规定了法人和其他组织统一社会信用代码(以下简称统一代码)的术语和定义、构成。本标准适用于对统一代码的编码、信息处理和信息共享交换。
2 规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
GB/T 2260 中华人民共和国行政区划代码GB 11714 全国组织机构代码编制规则GB/T 17710 信息技术 安全技术 校验字符系统
3 术语和定义
下列术语和定义适用于本文件。
3.1 组织机构 organization
企业、事业单位、机关、社会团体及其他依法成立的单位的通称。[GB/T 20091-2006, 定义2.2]
3.2 法人 legal entities
具有民事权利能力和民事行为能力,依法独立享有民事权利和承担民事义务的组织。
3.3 其他组织 other organizations
合法成立、有一定的组织机构和财产,不具备法人资格的组织。
3.4 组织机构代码 organization code
主体标识码 subject identification code按照GB 11714编制,赋予每一个组织机构在全国范围内唯一的,始终不变的识别标识码。
3.5 统一社会信用代码 unified social credit identifier
每一个法人和其他组织在全国范围内唯一的,终身不变的法定身份识别码。
4 统一代码的构成
4.1 结构
统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。
第1位:登记管理部门代码(共一位字符)第2位:机构类别代码(共一位字符)第3位第8位:登记管理机关行政区划码(共六位阿拉伯数字)第9位第17位:主体标识码(组织机构代码)(共九位字符)第18位:校验码(共一位字符)
4.2 代码及说明
登记管理部门代码:使用阿拉伯数字或大写英文字母表示。
机构编制:1 、民政:5、工商:9、其他:Y
机构类别代码:使用阿拉伯数字或大写英文字母表示。
机构编制机关:11打头机构编制事业单位,12打头机构编制中央编办直接管理机构编制的群众团体,13打头机构编制其他,19打头民政社会团体,51打头民政民办非企业单位,52打头民政基金会,53打头民政其他,59打头工商企业,91打头工商个体工商户,92打头工商农民专业合作社,93打头其他,Y1打头
登记管理机关行政区划码:只能使用阿拉伯数字表示。按照GB/T 2260编码。
主体标识码(组织机构代码):使用阿拉伯数字或英文大写字母表示。按照GB 11714编码。
在实行统一社会信用代码之前,以前的组织机构代码证上的组织机构代码由九位字符组成。格式为XXXXXXXX-Y。前面八位被称为“本体代码”;最后一位被称为“校验码”。校验码和本体代码由一个连字号(-)连接起来。以便让人很容易的看出校验码。但是三证合一后,组织机构的九位字符全部被纳入统一社会信用代码的第9位至第17位,其原有组织机构代码上的连字号不带入统一社会信用代码。
原有组织机构代码上的“校验码”的计算规则是:
例如:某公司的组织机构代码是:59467239-9。那其最后一位的组织机构代码校验码9是如何计算出来的呢?
第一步:取组织机构代码的前八位本体代码为基数。5 9 4 6 7 2 3 9提示:如果本体代码中含有英文大写字母。则A的基数是10,B的基数是11,C的基数是12,依此类推,直到Z的基数是35。
第二步:取加权因子数值。因为组织机构代码的本体代码一共是八位字符。则这八位的加权因子数值从左到右分别是:3、7、9、10、5、8、4、2。
第三步:本体代码基数与对应位数的因子数值相乘。5×3=15,9×7=63,4×9=36,6×10=60,7×5=35,2×8=16,3×4=12,9×2=18第四步:将乘积求和相加。15+63+36+60+35+16+12+18=255第五步:将和数除以11,求余数。255÷11=33,余数是2。第六步:用阿拉伯数字11减去余数,得求校验码的数值。当校验码的数值为10时,校验码用英文大写字母X来表示;当校验码的数值为11时,校验码用0来表示;其余求出的校验码数值就用其本身的阿拉伯数字来表示。11-2=9,因此此公司完整的组织机构代码为 59467239-9。
新社会统一信用代码的“校验位”计算规则是:
校验码:使用阿拉伯数字或大写英文字母来表示。校验码的计算方法参照 GB/T 17710。
上代码:
//判断是否为社会信用代码
+ (BOOL)isSocialCredit18Number:(NSString *)socialCreditNum
{
if(socialCreditNum.length != 18){
return NO;
}
NSString *scN = @"^([0-9ABCDEFGHJKLMNPQRTUWXY]{2})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9Y])$";
NSPredicate *regextestSCNum = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", scN];
if (![regextestSCNum evaluateWithObject:socialCreditNum]) {
return NO;
}
NSArray *ws = @[@1,@3,@9,@27,@19,@26,@16,@17,@20,@29,@25,@13,@8,@24,@10,@30,@28];
NSDictionary *zmDic = @{@"A":@10,@"B":@11,@"C":@12,@"D":@13,@"E":@14,@"F":@15,@"G":@16,@"H":@17,@"J":@18,@"K":@19,@"L":@20,@"M":@21,@"N":@22,@"P":@23,@"Q":@24,@"R":@25,@"T":@26,@"U":@27,@"W":@28,@"X":@29,@"Y":@30};
NSMutableArray *codeArr = [NSMutableArray array];
NSMutableArray *codeArr2 = [NSMutableArray array];
codeArr[0] = [socialCreditNum substringWithRange:NSMakeRange(0,socialCreditNum.length-1)];
codeArr[1] = [socialCreditNum substringWithRange:NSMakeRange(socialCreditNum.length-1,1)];
int sum = 0;
for (int i = 0; i < [codeArr[0] length]; i++) {
[codeArr2 addObject:[codeArr[0] substringWithRange:NSMakeRange(i, 1)]];
}
NSScanner* scan;
int val;
for (int j = 0; j < codeArr2.count; j++) {
scan = [NSScanner scannerWithString:codeArr2[j]];
if (![scan scanInt:&val] && ![scan isAtEnd]) {
codeArr2[j] = zmDic[codeArr2[j]];
}
}
for (int x = 0; x < codeArr2.count; x++) {
sum += [ws[x] intValue]*[codeArr2[x] intValue];
}
int c18 = 31 - (sum % 31);
for (NSString *key in zmDic.allKeys) {
if (zmDic[key]==[NSNumber numberWithInt:c18]) {
if (![codeArr[1] isEqualToString:key]) {
return NO;
}
}
}
return YES;
}