欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS-------18位社会信用代码验证

程序员文章站 2022-04-22 17:20:16
iOS-------18位社会信用代码验证! 先介绍一下验证规则: 从2015年10月1日后,中国企业营业执照上会印有“统一社会信用代码”。这新版本的营...

iOS-------18位社会信用代码验证!

先介绍一下验证规则:
从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&pide;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;

}