Вы не можете полагаться на регулярное выражение для проверки номеров карт. Вам нужна последняя таблица проверки карты, которая включает длины для диапазонов и сопоставления диапазонов для типов. Ваш провайдер платежного шлюза должен быть в состоянии предоставить вам обновленную таблицу проверки.
Вы часто можете полагаться на Luhn для проверки типа, составленного по этому номеру, но для того, чтобы пройти тесты ответственности вашего шлюза, вам необходимо подтвердить, что пользователь ввел тип карты записи для номера и если провайдер требует дату начала, она должна быть указана и т. д.
Вот пример Luhn в C #:
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);
}