Unity实现验证身份证是否合法

由于国家的相关法律法规,现在的网络游戏要进行实名制认证,当然认证的话肯定是找公安局的接口查询了,查询身份证和姓名,合法之后存储到数据库当中备用,但是调用这个接口是收费的,而且游戏面对很多玩家,他们怎么想的你一个做程序的肯定不知道,玩意给你乱输入,或者输入错的你还要去调用接口么?当然不能,我们需要先在前端进行验证,验证他身份证是否合法,验证的方法也很简单,中国居民的身份证都是唯一的,因为有一个独特的计算公式,这个公式也可以计算你的身份证是否合法,我们就利用这个公式先在前端进行计算,只有通过之后才进行下一步。

公式也很简单:

校验的计算方式:
  1. 对前17位数字本体码加权求和
  公式为:S = Sum(Ai * Wi), i = 0, ... , 16
  其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  2. 以11对计算结果取模
  Y = mod(S, 11)
  3. 根据模的值得到对应的校验码
  对应关系为:
   Y值: 0 1 2 3 4 5 6 7 8 9 10
  校验码: 1 0 X 9 8 7 6 5 4 3 2

也就是说校验之后的数字除以11得到的十个数字,取其余数只能为10个值 分别是 0 1 2 3 4 5 6 7 8 9 10 这十个数字分别对应着1 0 X 9 8 7 6 5 4 3 2 如果最后一位数和这十位数相等,代表着你的身份证号码就合法了!
话不多说,实战最重要。下面进行实战:
第一步:
在unity内建立一个文本框,用于输出验证结果,建立一个输入框,让用户输入身份证号,还有一个按钮,给用户查询
第二步:
写脚本,脚本代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;
/// <summary>
/// 验证身份证是否合法
/// </summary>
public class IdCard : MonoBehaviour {
    public Text Output; //成功失败的回调
    public Text Input;  //用户输入的身份证号码
    private string ID;
    //点击按钮之后验证
    public void Verification()
    {
        //将用户输入的身份证号码赋值到string类型的值上去
        ID = Input.text.ToString();
        if (ID.Length == 18)
        {
            //基本验证位数18位已经通过执行拆分方法
            Resolution();
        }
        else
        {
            //基本验证没有通过,位数多或者少,不合法
            //Debug.Log("身份证验证位数不通过");
            Output.text = "身份证验证不通过,原因:身份证位数不够!";
        }
    }
    //基本位数验证通过之后开始拆分计算
    void Resolution()
    {
        //将所输入的身份证号码进行拆分,拆分为17位,最后一位留着待用
        int Num0 = int.Parse(ID.Substring(0, 1)) * 7;
        int Num1 = int.Parse(ID.Substring(1, 1)) * 9;
        int Num2 = int.Parse(ID.Substring(2, 1)) * 10;
        int Num3 = int.Parse(ID.Substring(3, 1)) * 5;
        int Num4 = int.Parse(ID.Substring(4, 1)) * 8;
        int Num5 = int.Parse(ID.Substring(5, 1)) * 4;
        int Num6 = int.Parse(ID.Substring(6, 1)) * 2;
        int Num7 = int.Parse(ID.Substring(7, 1)) * 1;
        int Num8 = int.Parse(ID.Substring(8, 1)) * 6;
        int Num9 = int.Parse(ID.Substring(9, 1)) * 3;
        int Num10 = int.Parse(ID.Substring(10, 1)) * 7;
        int Num11 = int.Parse(ID.Substring(11, 1)) * 9;
        int Num12 = int.Parse(ID.Substring(12, 1)) * 10;
        int Num13 = int.Parse(ID.Substring(13, 1)) * 5;
        int Num14 = int.Parse(ID.Substring(14, 1)) * 8;
        int Num15 = int.Parse(ID.Substring(15, 1)) * 4;
        int Num16 = int.Parse(ID.Substring(16, 1)) * 2;
        int allNum = Num0 + Num1 + Num2 + Num3 + Num4 + Num5 + Num6 + Num7 + Num8 + Num9 + Num10 + Num11 + Num12 + Num13 + Num14 + Num15 + Num16;
        Judge(allNum,ID.Substring(17, 1));
    }
/// <summary>
/// 计算身份证号码是否合法
/// </summary>
/// <param 前17位相加之和="allNum"></param>
/// <param 身份证号码最后一位="LastNum"></param>
    void Judge(int allNum,string LastNum)
    {
        
        int Remainder = allNum % 11;
        //如果最后一位数不是X的时候将最后一位数转换为int
        if (Remainder == 0)
        {
            if (int.Parse(LastNum)==1)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 1)
        {
            if (int.Parse(LastNum) == 0)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 2)
        {
            Debug.Log("最后一位数是X");
            if (LastNum != "x" && LastNum != "X")
            {
                Debug.Log(LastNum);
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
            else
            {        
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
        }
        if (Remainder==3)
        {
            if (int.Parse(LastNum) == 9)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 4)
        {
            if (int.Parse(LastNum) == 8)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 5)
        {
            if (int.Parse(LastNum) == 7)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 6)
        {
            if (int.Parse(LastNum) == 6)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 7)
        {
            if (int.Parse(LastNum) == 5)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 8)
        {
            if (int.Parse(LastNum) == 4)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 9)
        {
            if (int.Parse(LastNum) == 3)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
        if (Remainder == 10)
        {
            if (int.Parse(LastNum) == 2)
            {
                Debug.Log("身份证合法,已经通过验证");
                Output.text = "恭喜验证通过";
            }
            else
            {
                Debug.Log("身份证填写错误");
                Output.text = "您的身份证号不码合法";
            }
        }
    }
}
行数有点多,验证的也多Verification这个方法给按钮的点击事件
第三步:
运行检测身份证是否合法

每次检测都会输出是否合法,当然可能有更简单的方法,方法很多,看你怎么去验证,验证通过之后调用接口再次验证姓名是否相符,这样你的实名认证就大功告成了!

方法很多,我这个不是最简便的,如果哪位有更简单的方法,欢迎私聊讨论,大神勿喷,后辈献丑了!

猜你喜欢

转载自blog.csdn.net/Superficialtise/article/details/78594369