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

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”,请确认修改后提交!"];


        }







    }
  • 代码实现
    ```objectivec
    @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)

判断是否为社会信用代码


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

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

目录
相关文章
|
移动开发 安全 数据安全/隐私保护
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
|
移动开发 前端开发 数据安全/隐私保护
【工具】iOS代码混淆工具-iOS源码混淆
【工具】iOS代码混淆工具-iOS源码混淆
175 1
|
移动开发 前端开发 安全
最强大的 iOS 应用源码保护工具:Ipa Guard,保护你的商业机密代码
最强大的 iOS 应用源码保护工具:Ipa Guard,保护你的商业机密代码
|
12月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
缓存 开发工具 iOS开发
优化iOS中Objective-C代码调起支付流程的速度
优化iOS中Objective-C代码调起支付流程的速度
241 2
|
移动开发 安全 数据安全/隐私保护
iOS 代码混淆和加固技术详解
iOS 代码混淆和加固技术详解
|
移动开发 前端开发 数据安全/隐私保护
iOS 代码混淆 - 从入门到放弃
iOS 代码混淆 - 从入门到放弃
|
移动开发 安全 前端开发
iOS代码混淆工具
iOS代码混淆工具
187 1
|
移动开发 安全 数据安全/隐私保护
iOS代码混淆工具
🔒 这是一篇介绍iOS代码混淆工具的技术博客,旨在帮助开发者提高代码安全性。本工具来自于Github的混淆词库和代码,通过差异化处理和代码合并生成数亿种用于混淆的单词和垃圾代码,确保每次混淆不会出现重复,混淆后的代码跟手写没有任何区别,完美解决代码4.3和2.3.1问题。
|
安全 算法 数据安全/隐私保护
iOS 代码加固与保护方法详解 - 提升 iOS 应用安全性的关键步骤
iOS 代码加固与保护方法详解 - 提升 iOS 应用安全性的关键步骤

热门文章

最新文章