引言

需求:商户进件的子模块证件信息页面新增营业执照编号校验

iOS小技能:【营业执照编号校验】18位社会信用代码验证 unified social credit identifier_校验码

非小微商户,证件信息需要录入营业执照号

I、商户进件新增营业执照编号校验

从2015年10月1日后,中国企业营业执照上会印有“统一社会信用代码”。这新版本的营业执照将取代以前发的营业执照、组织机构代码证、税务登记证。统称“三证合一“。

1、申请办理新企业时,只需取得营业执照即可。 2、提供企业证明时,只需提交营业执照即可,无须再提交组织机构代码证和税务登记证。

而“统一社会信用代码”实际上编码规则采用 GB 32100-2015 《法人和其他组织统一社会信用代码编码规则》而来,此规则从2015年10月1日起,正式实施。

/gzfw/ggcx/g…

1.1 【需求背景】

18位编码的校验依据GB 32100-2015 《法人和其他组织统一社会信用代码编码规则》, 统一代码由十八位阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成,包括以下5个部分

第1位登记管理部门代码 第2位机构类别代码 第3位~第8位登记管理机关行政区划码 第9位~第17位主体标识码(组织机构代码) 第18位校验码

1.2 【需求描述】

商户进件(新增、审核通过前编辑),如营业执照号必填则对营业执照编号进行校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”

1.3 术语和定义

组织机构 organization

  企业、事业单位、机关、社会团体及其他依法成立的单位的通称。[GB/T 20091-2006, 定义2.2]

法人 legal entities

  具有民事权利能力和民事行为能力,依法独立享有民事权利和承担民事义务的组织。

其他组织 other organizations

  合法成立、有一定的组织机构和财产,不具备法人资格的组织。

组织机构代码 organization code

  主体标识码 subject identification code按照GB 11714编制,赋予每一个组织机构在全国范围内唯一的,始终不变的识别标识码。

统一社会信用代码 unified social credit identifier

  每一个法人和其他组织在全国范围内唯一的,终身不变的法定身份识别码。

1.4 统一代码的构成(unified identifier)

  统一代码由十八位的阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)组成。   

第1位:登记管理部门代码(共一位字符) 第2位:机构类别代码(共一位字符) 第3位~第8位:登记管理机关行政区划码(共六位阿拉伯数字) 第9位~第17位:主体标识码(组织机构代码)(共九位字符) 第18位:校验码(共一位字符)

1.5 代码及说明

  •   登记管理部门代码:使用阿拉伯数字或大写英文字母表示。

登记管理部门

代码标识

机构编制

1

外交

2

司法行政

3

文化

4

民政

5

旅游

6

宗教

7

工会

8

工商

9

中央军委改革和编制办公室

A

农业

N

其他

Y

 

  • 机构类别代码:使用阿拉伯数字或大写英文字母表示。

登记管理部门

机构类别

代码标识

机构编制

机关

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位: 登记管理机关行政区划码只能使用阿拉伯数字表示。按照GB/T 2260编码。
  • 第9位~17位:主体标识码(组织机构代码)使用阿拉伯数字或英文大写字母表示。按照GB 11714编码。
  • 校验码

  在实行统一社会信用代码之前,以前的组织机构代码证上的组织机构代码由九位字符组成。格式为XXXXXXXX-Y。前面八位被称为“本体代码”;最后一位被称为“校验码”。校验码和本体代码由一个连字号(-)连接起来。以便让人很容易的看出校验码。 是三证合一后,组织机构的九位字符全部被纳入统一社会信用代码的第9位至第17位,其原有组织机构代码上的连字号不带入统一社会信用代码。 1、原有组织机构代码上的“校验码”的计算规则:   例如:某公司的组织机构代码是:59467239-9。那其最后一位的组织机构代码校验码9是如何计算出来的?   第一步:取组织机构代码的前八位本体代码为基数。5 9 4 6 7 2 3 9   提示:如果本体代码中含有英文大写字母。则A的基数是10,B的基数是11,C的基数是12,依此类推,直到Z的基数是35。即采用16进制编码 进行计算   第二步:取加权因子数值。因为组织机构代码的本体代码一共是八位字符。则这八位的加权因子数值从左到右分别是: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。

2、新社会统一信用代码的“校验位”计算规则是:   校验码:使用阿拉伯数字或大写英文字母来表示。校验码的计算方法参照 GB/T 17710。

II、iOS代码实现

iOS小技能:【营业执照编号校验】18位社会信用代码验证 unified social credit identifier_iOS_02

2.1 简单校验字母

  • 用法
if (!self.isMicro_Merchants && _zzbhTextF.text.length < 1) {
      return  [SVProgressHUD showInfoWithStatus:@"请输入营业执照编号"];
    }


    if (!self.isMicro_Merchants && _zzbhTextF.text.length >= 1) {
        //    // 判断营业执照号,校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”

        //
        if([idNumberTool isInvalidbusiness_license_idNumber:_zzbhTextF.text]){

            return  [SVProgressHUD showInfoWithStatus:@"营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!"];


        }







    }
  • 代码实现
@interface idNumberTool : NSObject
/**
 商户进件(新增、审核通过前编辑),如营业执照号必填则对营业执照编号进行校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”



 */
+(BOOL)isInvalidbusiness_license_idNumber:(NSString*)idNumber;

@end

//
//  idNumberTool.m
//  Housekeeper
//
//  Created by mac on 2021/5/8.
//

#import "idNumberTool.h"

@implementation idNumberTool
/**
 商户进件(新增、审核通过前编辑),如营业执照号必填则对营业执照编号进行校验是否存在“I、O、Z、S、V”,如存在,则提示“营业执照编号不使用字母“I、O、Z、S、V”,请确认修改后提交!”

 */
+(BOOL)isInvalidbusiness_license_idNumber:(NSString*)idNumber{



    if(idNumber.length<1){
        return NO;

    }

    return [self isTrueRule4SNWithRuleStrArr:@[@"I",@"i",@"O",@"o",@"Z",@"z",@"S",@"s",@"V",@"v"] target:idNumber];



}

/**

 RuleStr:@ "||,,\r\n"
 案例:iOS分配终端界面功能实现:1、拆分SN 2、计算SN个数( 号段用‘-’连接;每批号段请用‘,’|‘隔开或分行)




 */
+ (BOOL)isTrueRule4SNWithRuleStrArr:(NSArray*)RuleStr target:(NSString*)event {


    for (NSString* line in RuleStr) {
        if( [event containsString:line]){
            NSLog(@"line:%@",line);
            return  YES;


        }

    }

        return NO;






}


@end

2.2 严格按照18位社会信用代码生成规则验证(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;
}

see also

公号:iOS逆向

iOS 银行卡号有效性校验Luhn算法 (银行卡号码校验算法) & 身份证校验:【校验年龄、校验是否符合身份证号生成规则】 | 蓄力计划

案例:iOS分配终端界面功能实现

1、拆分SN 2、计算SN个数( 号段用‘-’连接;每批号段请用‘,’|‘隔开或分行)