您不能依赖正则表达式来验证卡号。您需要一个最近的卡片验证表,其中包括范围的长度和范围到类型的映射。您的支付网关提供商应该能够为您提供最新的验证表。
您通常可以依靠 Luhn 进行 is-this-number-made-up 类型的验证,但为了通过网关的责任测试,您需要验证用户是否输入了号码的写卡类型,以及是否开始提供者需要日期,必须输入,等等...
这是C# 中的Luhn示例:
public static bool IsLuhnValid(string cardNumber) {
if (string.IsNullOrEmpty(cardNumber))
return false;
Int64 cardNumberAsBigInt;
if (!Int64.TryParse(cardNumber, out cardNumberAsBigInt) || (cardNumberAsBigInt == 0))
return false;
int indicator = 1;
int firstNumberToAdd = 0;
int secondNumberToAdd = 0;
for (int i = cardNumber.Length - 1; i >= 0; i--) {
int currentNumber = int.Parse(cardNumber[i].ToString());
if (indicator == 1) {
firstNumberToAdd += currentNumber;
indicator = 0;
}
else {
int doubleCurrentNumber = currentNumber + currentNumber;
if (doubleCurrentNumber >= 10) {
int num1 = Convert.ToInt32(doubleCurrentNumber.ToString().Substring(0, 1));
int num2 = Convert.ToInt32(doubleCurrentNumber.ToString().Substring(1, 1));
secondNumberToAdd += num1 + num2;
}
else {
secondNumberToAdd += doubleCurrentNumber;
}
indicator = 1;
}
}
return ((firstNumberToAdd + secondNumberToAdd) % 10 == 0);
}