验证信用卡号码

分享于 

5分钟阅读

Web开发

  繁體 雙語

介绍

在使用 ASP.NET 处理在线信用卡订单时,如果你可以在信用卡号码上执行某种验证。 我最近不得不编写一些代码来处理信用卡订单,并认为我将分享我的代码。

幸运的是,信用卡号码是以允许一些基本验证的方式创建的。 这个验证并没有告诉你是否可以在帐户上提供资金,并且它确实没有提交信用卡欺诈。 实际上,卡号是通过这种方式输出的,这种方式刚刚通过验证。 但是,它确实捕捉到大多数打字错误,并在尝试实际处理信用卡之前减少带宽使用。

要验证信用卡号,首先从右部最大数字和工作左边添加它的他数字的值。 接下来,与第一步中跳过的数字相同,但这次双击每个数字的值并添加结果中的值。 如果结果是 10,那么如果结果被平均整除,那么卡号将通过验证。

当然,使用一些代码会更清楚,清单 1显示了我的IsCardNumberValid 方法。

publicstaticbool IsCardNumberValid(string cardNumber)
{
 int i, checkSum = 0;
 // Compute checksum of every other digit starting from right-most digitfor (i = cardNumber.Length - 1; i >= 0; i -= 2)
 checkSum += (cardNumber[i] - '0');
 // Now take digits not included in first checksum, multiple by two,// and compute checksum of resulting digitsfor (i = cardNumber.Length - 2; i >= 0; i -= 2)
 {
 int val = ((cardNumber[i] - '0') * 2);
 while (val >0)
 {
 checkSum += (val % 10);
 val/= 10;
 }
 }
 // Number is valid if sum of both checksums MOD 10 equals 0return ((checkSum % 10) == 0);
}
清单 1: 验证信用卡

IsCardNumberValid 方法假定所有空格和其他非数字字符都已经从卡片编号字符串中删除。 这是一个简单的任务,但是清单 2显示了我用于这里操作的方法。

publicstaticstring NormalizeCardNumber(string cardNumber)
{
 if (cardNumber == null)
 cardNumber = String.Empty;
 StringBuilder sb = new StringBuilder();
 foreach (char c in cardNumber)
 {
 if (Char.IsDigit(c))
 sb.Append(c);
 }
 return sb.ToString();
}
清单 2: 从信用卡号码中删除所有非数字字符

如果你可以避免提交业务不支持的卡,你还可以减少带宽。 因此,另一个有用的任务是确定信用卡类型。

publicenum CardType
{
 Unknown = 0,
 MasterCard = 1,
 VISA = 2,
 Amex = 3,
 Discover = 4,
 DinersClub = 5,
 JCB = 6,
 enRoute = 7}// Class to hold credit card type informationprivateclass CardTypeInfo
{
 public CardTypeInfo(string regEx, int length, CardType type)
 {
 RegEx = regEx;
 Length = length;
 Type = type;
 }
 publicstring RegEx { get; set; }
 publicint Length { get; set; }
 public CardType Type { get; set; }
}// Array of CardTypeInfo objects.// Used by GetCardType() to identify credit card types.privatestatic CardTypeInfo[] _cardTypeInfo =
{
 new CardTypeInfo("^(51|52|53|54|55)", 16, CardType.MasterCard),
 new CardTypeInfo("^(4)", 16, CardType.VISA),
 new CardTypeInfo("^(4)", 13, CardType.VISA),
 new CardTypeInfo("^(34|37)", 15, CardType.Amex),
 new CardTypeInfo("^(6011)", 16, CardType.Discover),
 new CardTypeInfo("^(300|301|302|303|304|305|36|38)", 
 14, CardType.DinersClub),
 new CardTypeInfo("^(3)", 16, CardType.JCB),
 new CardTypeInfo("^(2131|1800)", 15, CardType.JCB),
 new CardTypeInfo("^(2014|2149)", 15, CardType.enRoute),
};publicstatic CardType GetCardType(string cardNumber)
{
 foreach (CardTypeInfo info in _cardTypeInfo)
 {
 if (cardNumber.Length == info.Length && 
 Regex.IsMatch(cardNumber, info.RegEx))
 return info.Type;
 }
 return CardType.Unknown;
}
清单 3: 确定信用卡的信用卡类型

清单 3是确定信用卡信用类型的代码。 当我有意义的时候,我是表驱动代码的狂热者,所以我创建了 CardTypeInfo 对象的array。 GetCardType() 方法只遍历这个 array,寻找将被测试的信用卡号的第一个描述。 以前一样,这个例程假定所有非数字字符都已经从信用卡号码字符串中删除。

我喜欢表驱动代码的主要原因是它使得代码更简单。 这将导致更易于阅读和修改的代码。 GetCardType()CardType enum 返回一个值。 如果卡号不支持表中的任何卡描述,则返回 CardType.Unknown

编写处理信用卡的代码涉及许多需要解决的问题。 希望这些代码能让你在解决几个问题时a。


相关文章