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

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

引言

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

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

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

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

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

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

[ http://www.sac.gov.cn/gzfw/ggcx/gjbzxgtz/201604/t20160418_206851.htm]( http://www.sac.gov.cn/gzfw/ggcx/gjbzxgtz/201604/t20160418_206851.htm
)

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代码实现

在这里插入图片描述

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.
//  Copyright © 2021 https://kunnan.blog.csdn.net/  . All rights reserved.
//

#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个数( 号段用‘-’连接;每批号段请用‘,’|‘隔开或分行)

 
 //————————————————
 //版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 //原文链接:https://blog.csdn.net/z929118967/article/details/116303608

 
 */
+ (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算法 (银行卡号码校验算法) & 身份证校验:【校验年龄、校验是否符合身份证号生成规则】 | 蓄力计划

https://kunnan.blog.csdn.net/article/details/104943337

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

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

` RuleStr:@ "||,,\r\n"
`
————————————————
版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接: https://blog.csdn.net/z929118967/article/details/116303608
目录
相关文章
|
1月前
|
移动开发 安全 数据安全/隐私保护
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
|
3月前
|
移动开发 前端开发 安全
最强大的 iOS 应用源码保护工具:Ipa Guard,保护你的商业机密代码
最强大的 iOS 应用源码保护工具:Ipa Guard,保护你的商业机密代码
|
3月前
|
移动开发 前端开发 数据安全/隐私保护
【工具】iOS代码混淆工具-iOS源码混淆
【工具】iOS代码混淆工具-iOS源码混淆
43 1
|
6月前
|
移动开发 前端开发 数据安全/隐私保护
iOS代码混淆-从入门到放弃
iOS代码混淆-从入门到放弃
88 0
|
2月前
|
移动开发 安全 数据安全/隐私保护
iOS 代码混淆和加固技术详解
iOS 代码混淆和加固技术详解
|
2月前
|
移动开发 前端开发 数据安全/隐私保护
iOS 代码混淆 - 从入门到放弃
iOS 代码混淆 - 从入门到放弃
|
2月前
|
安全 算法 数据安全/隐私保护
iOS 代码加固与保护方法详解 - 提升 iOS 应用安全性的关键步骤
iOS 代码加固与保护方法详解 - 提升 iOS 应用安全性的关键步骤
|
3月前
|
安全 Java Android开发
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
35 0
|
3月前
|
移动开发 安全 前端开发
iOS代码混淆工具
iOS代码混淆工具
61 1
|
3月前
|
安全 开发工具 Swift
ios-class-guard - iOS代码混淆与加固实践
ios-class-guard - iOS代码混淆与加固实践
48 0