updated cc cardType logic

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-05-09 11:39:09 -05:00
parent 7965d4056f
commit 4519c7af15

View File

@ -52,26 +52,33 @@ extension InputField {
} }
} }
static func from(iin: Int) -> CreditCardType? { static func from(cardNumber: String) -> CreditCardType {
switch iin { let clean = cardNumber.filter { $0.isNumber }
case 4000...4999: let firstNum = Int(clean.prefix(1)) ?? 0
let twoChar = Int(clean.prefix(2)) ?? 0
let threeChar = Int(clean.prefix(3)) ?? 0
let fourChar = Int(clean.prefix(4)) ?? 0
let sixChar = Int(clean.prefix(6)) ?? 0
if firstNum == 4 {
return .visa return .visa
case 5100...5599, 2221...2720: } else if twoChar == 34 || twoChar == 37 {
return .mastercard
case 3400...3499, 3700...3799:
return .amex return .amex
case 6011, 6221...6229, 6440...6499, 6500...6599: } else if (twoChar == 62 && !(sixChar >= 622126 && sixChar <= 622925)) || twoChar == 81 || (twoChar == 60 && fourChar != 6011) {
return .discover
case 3600...3699, 3800...3999:
return .dinersClub
case 3528...3589:
return .jcb
case 6200...6299, 6000...6010, 8100...8199:
return .unionPay return .unionPay
default: } else if (threeChar > 299 && threeChar <= 305) || threeChar == 309 || twoChar == 36 || twoChar == 38 || twoChar == 39 {
return nil return .dinersClub
} else if fourChar == 6011 || (sixChar >= 622126 && sixChar <= 622925) || (threeChar >= 644 && threeChar <= 649) || twoChar == 65 {
return .discover
} else if fourChar >= 3528 && fourChar <= 3589 {
return .jcb
} else if (twoChar >= 51 && twoChar <= 55) || (sixChar >= 222100 && sixChar <= 272099) {
return .mastercard
} else {
return .generic
} }
} }
} }
class CreditCardHandler: FieldTypeHandler { class CreditCardHandler: FieldTypeHandler {
@ -171,13 +178,13 @@ extension InputField {
defer { inputField.setNeedsUpdate() } defer { inputField.setNeedsUpdate() }
guard rawNumber.count >= 4, guard rawNumber.count >= 4,
let firstFourDigits = Int(String(rawNumber.prefix(4))), let firstFourDigits = Int(String(rawNumber.prefix(4)))
let creditCardType = CreditCardType.from(iin: firstFourDigits) else { else {
inputField.cardType = .generic inputField.cardType = .generic
return return
} }
inputField.cardType = creditCardType inputField.cardType = CreditCardType.from(cardNumber: rawNumber)
} }
internal func maskCreditCardNumber(_ cardType: CreditCardType, number: String) -> String { internal func maskCreditCardNumber(_ cardType: CreditCardType, number: String) -> String {