.NET Core 如何验证信用卡卡号

2023-11-06 08:08
文章标签 验证 core net 信用卡 卡号

本文主要是介绍.NET Core 如何验证信用卡卡号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

_

点击上方蓝字关注“汪宇杰博客”

导语

最近在家闲的蛋疼需要写点文章。正好我本人在金融科技公司工作,对信用卡业务略有了解。我们看看如何在 .NET Core 里验证一个信用卡的卡号是否合法。

信用卡卡号组成

首先,信用卡的卡号一般为16位,也有少许14或15位的情况。其中,前6-8位用来标识卡片类型和发卡机构,称之为 BIN 码(Bank Identification Number)。有个网站可以查询:https://binlists.com/。万事达(Master Card)以 51-55 开头,例如交行的万事达白金卡 BIN 码为 522964。Visa 卡以 4 开头,例如我司(Green Dot)的 437303。剩余位数由各家发卡机构自己发挥,其中会包含持卡人信息、校验码等,由于不同银行规则不一样,不多介绍。但是,任何卡号都必须满足一个行业内著名的规律:MOD10算法。

Luhn / MOD 10 算法

根据维基百科的描述,Luhn 算法,也叫模10算法,由科学家 Hans Peter Luhn 在1960年发明,广泛用于校验借记卡、信用卡卡号是否正确,其标准为 ISO/IEC 7812-1。它的目的不是用于加密卡号,而是为了防止人为出错。

计算方法如下,比如对于卡号 :

6011000990139424

末尾的数字 4 叫做校验码,剩下的数字为 601100099013942。将他们从右到左排开,得到:

2 4 9 3 1 09 9 0 0 0 1 1 0 6

从第一位 2 开始,相隔一个数字的值 x2,即上面红色标出的奇数位翻倍,得到:

4 4 18 3 2 018 9 0 0 0 1 2 0 12

发现这里面有超过10的两位数,即蓝色标出的18、18、12,对于大于10的数,将其 -9,得到:

4 4 9 3 2 09 9 0 0 0 1 2 0 3

把所有的数加起来,得到:46

将这个结果乘以9,46 x 9 = 414

发现 414个位上的数字 4 和我们在第一步中拿掉的 4 相等,这个就是校验码的作用,相等就对了!最后把校验码也加上,46 + 4 = 50,而 50 % 10 = 0,得出结论 6011000990139424 是一个合法的信用卡卡号。

将这个算法用 C# 代码表示,即:

public static bool IsLuhnValid(int[] digits)

{

    var sum = 0;

    var alt = false;

    for (var i = digits.Length - 1; i >= 0; i--)

    {

        if (alt)

        {

            digits[i] *= 2;

            if (digits[i] > 9)

            {

                digits[i] -= 9;

            }

        }

        sum += digits[i];

        alt = !alt;

    }

    return sum % 10 == 0;

}

对于输入的字符串类型的卡号,也可以用个LINQ技巧一行代码转成 int 数组:

public static int[] GetDigitsArrayFromCardNumber(string cardNumber)

{

    var digits = cardNumber.Select(p => int.Parse(p.ToString())).ToArray();

    return digits;

}

写了个轮子

基于以上的知识,我今天抽空写了个开源库,可用于校验信用卡卡号是否合法,目前还有一些遗漏的场景(比如14、15位信用卡的校验),大家可以参考。

dotnet add package Edi.CreditCardUtils --version 0.1.0-alpha

https://github.com/EdiWang/Edi.CreditCardUtils

这个库的验证步骤为:

  1. 输入的字符串是否为16位数字

  2. 这串数字是否满足 Luhn 算法

  3. 该卡是否为已知的某发行商的BIN (可选参数,也可自己拓展)

验证返回类型为:

public class CreditCardValidationResult

{

    public CreditCardNumberFormat CreditCardNumberFormat { get; set; }

    public string CardType { get; set; }

}

public enum CreditCardNumberFormat

{

    None = 0,

    Valid_LuhnOnly = 100, // 验证通过,仅满足 Luhn

    Valid_BrandTest = 101, // 验证通过,满足 Luhn 并且为已知 BIN

    Invalid_BadStringFormat = 200, // 验证失败,非信用卡卡号格式

    Invalid_LuhnFailure = 201 // 验证失败,不满足 Luhn

}

使用方法可以参考单元测试中的案例,如验证一个卡号 4012888888881881,传入两个已知BIN(Visa、MasterCard)的验证器,会返回是否验证通过以及识别出的卡类型:

var result = CreditCardValidator.ValidCardNumber("4012888888881881", new List<ICreditCardBrandFormatValidator>

{

    new VisaFormatValidator(),

    new MasterCardFormatValidator()

});

Assert.IsTrue(result.CreditCardNumberFormat == CreditCardNumberFormat.Valid_BrandTest && result.CardType == "Visa");

对于自定义的BIN,比如你想写建行的BIN验证器,可以实现 ICreditCardBrandFormatValidator 接口,给个名字和正则就行,就像 Visa 的这个:

public class VisaFormatValidator : ICreditCardBrandFormatValidator

{

    public string BrandName => "Visa";

    public string BrandRegEx => "^4[0-9]{12}(?:[0-9]{3})?$";

}

参考:https://en.wikipedia.org/wiki/Luhn_algorithm

这篇关于.NET Core 如何验证信用卡卡号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355449

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失