Advertisement
MrFan

Check Credit Card Valid

Nov 22nd, 2016
2,907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.84 KB | None | 0 0
  1. //newway :
  2.  
  3. //http://stackoverflow.com/questions/33137885/validating-credit-cards-using-stripe-with-ios
  4.  
  5.  
  6.  
  7. extension ViewController: UITextFieldDelegate {
  8.     internal func textFieldDidEndEditing(_ textField: UITextField) {
  9.         //let (type, formatted, valid) = checkCardNumber(stringWithCardNumber)
  10.         print(checkCardNumber(input: textField.text!))
  11.     }
  12.    
  13. }
  14.  
  15. enum CardType: String {
  16.     case Unknown, Amex, Visa, MasterCard, Diners, Discover, JCB, Elo, Hipercard, UnionPay
  17.    
  18.     static let allCards = [Amex, Visa, MasterCard, Diners, Discover, JCB, Elo, Hipercard, UnionPay]
  19.     static let imgCards = ["stp_card_amex", "stp_card_visa", "stp_card_mastercard", "stp_card_diners", "stp_card_discover", "stp_card_jcb", "stp_card_visa", "stp_card_visa", "stp_card_visa"]
  20.    
  21.     var regex : String {
  22.         switch self {
  23.         case .Amex:
  24.             return "^3[47][0-9]{5,}$"
  25.         case .Visa:
  26.             return "^4[0-9]{6,}([0-9]{3})?$"
  27.         case .MasterCard:
  28.             return "^(5[1-5][0-9]{4}|677189)[0-9]{5,}$"
  29.         case .Diners:
  30.             return "^3(?:0[0-5]|[68][0-9])[0-9]{4,}$"
  31.         case .Discover:
  32.             return "^6(?:011|5[0-9]{2})[0-9]{3,}$"
  33.         case .JCB:
  34.             return "^(?:2131|1800|35[0-9]{3})[0-9]{3,}$"
  35.         case .UnionPay:
  36.             return "^(62|88)[0-9]{5,}$"
  37.         case .Hipercard:
  38.             return "^(606282|3841)[0-9]{5,}$"
  39.         case .Elo:
  40.             return "^((((636368)|(438935)|(504175)|(451416)|(636297))[0-9]{0,10})|((5067)|(4576)|(4011))[0-9]{0,12})$"
  41.         default:
  42.             return ""
  43.         }
  44.     }
  45. }
  46.  
  47. func matchesRegex(regex: String!, text: String!) -> Bool {
  48.         do {
  49.             let regex = try NSRegularExpression(pattern: regex, options: [.caseInsensitive])
  50.             let nsString = text as NSString
  51.             let match = regex.firstMatch(in: text, options: [], range: NSMakeRange(0, nsString.length))
  52.             return (match != nil)
  53.         } catch {
  54.             return false
  55.         }
  56.     }
  57.     func luhnCheck(number: String) -> Bool {
  58.         var sum = 0
  59.         let digitStrings = number.characters.reversed().map { String($0) }
  60.        
  61.         for tuple in digitStrings.enumerated() {
  62.             guard let digit = Int(tuple.element) else { return false }
  63.             let odd = Int(tuple.element)! % 2 == 1
  64.            
  65.             switch (odd, digit) {
  66.             case (true, 9):
  67.                 sum += 9
  68.             case (true, 0...8):
  69.                 sum += (digit * 2) % 9
  70.             default:
  71.                 sum += digit
  72.             }
  73.         }
  74.        
  75.         return sum % 10 == 0
  76.     }
  77.    
  78.     func checkCardNumber(input: String) -> (type: CardType, formatted: String, valid: Bool) {
  79.         // Get only numbers from the input string
  80.         //let numberOnly = input.stringByReplacingOccurrencesOfString("[^0-9]", withString: "", options: .RegularExpressionSearch)
  81.         let numberOnly = input.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression)
  82.         var type: CardType = .Unknown
  83.         var formatted = ""
  84.         var valid = false
  85.        
  86.         // detect card type
  87.         for card in CardType.allCards {
  88.             if (matchesRegex(regex: card.regex, text: numberOnly)) {
  89.                 type = card
  90.                 break
  91.             }
  92.         }
  93.        
  94.         // check validity
  95.         valid = luhnCheck(number: numberOnly)
  96.        
  97.         // format
  98.         var formatted4 = ""
  99.         for character in numberOnly.characters {
  100.             if formatted4.characters.count == 4 {
  101.                 formatted += formatted4 + " "
  102.                 formatted4 = ""
  103.             }
  104.             formatted4.append(character)
  105.         }
  106.        
  107.         formatted += formatted4 // the rest
  108.        
  109.         // return the tuple
  110.         return (type, formatted, valid)
  111.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement