BTCardNonce.m 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #import "BTCardNonce_Internal.h"
  2. #import "BTAuthenticationInsight_Internal.h"
  3. #if __has_include(<Braintree/BraintreeCard.h>)
  4. #import <Braintree/BTThreeDSecureInfo.h>
  5. #else
  6. #import <BraintreeCard/BTThreeDSecureInfo.h>
  7. #endif
  8. @implementation BTCardNonce
  9. - (instancetype)initWithNonce:(NSString *)nonce
  10. cardNetwork:(BTCardNetwork)cardNetwork
  11. expirationMonth:(NSString *)expirationMonth
  12. expirationYear:(NSString *)expirationYear
  13. cardholderName:(NSString *)cardholderName
  14. lastTwo:(NSString *)lastTwo
  15. lastFour:(NSString *)lastFour
  16. isDefault:(BOOL)isDefault
  17. cardJSON:(BTJSON *)cardJSON
  18. authInsightJSON:(BTJSON *)authInsightJSON {
  19. self = [super initWithNonce:nonce
  20. type:[BTCardNonce typeStringFromCardNetwork:cardNetwork]
  21. isDefault:isDefault];
  22. if (self) {
  23. _cardNetwork = cardNetwork;
  24. _expirationMonth = expirationMonth;
  25. _expirationYear = expirationYear;
  26. _cardholderName = cardholderName;
  27. _lastTwo = lastTwo;
  28. _lastFour = lastFour;
  29. _binData = [[BTBinData alloc] initWithJSON:cardJSON[@"binData"]];
  30. if ([cardJSON[@"details"][@"bin"] asString]) {
  31. _bin = [cardJSON[@"details"][@"bin"] asString];
  32. } else if ([cardJSON[@"bin"] asString]) {
  33. _bin = [cardJSON[@"bin"] asString];
  34. }
  35. _threeDSecureInfo = [[BTThreeDSecureInfo alloc] initWithJSON:cardJSON[@"threeDSecureInfo"]];
  36. if (authInsightJSON) {
  37. _authenticationInsight = [[BTAuthenticationInsight alloc] initWithJSON:authInsightJSON];
  38. }
  39. }
  40. return self;
  41. }
  42. + (NSString *)typeStringFromCardNetwork:(BTCardNetwork)cardNetwork {
  43. switch (cardNetwork) {
  44. case BTCardNetworkAMEX:
  45. return @"AMEX";
  46. case BTCardNetworkDinersClub:
  47. return @"DinersClub";
  48. case BTCardNetworkDiscover:
  49. return @"Discover";
  50. case BTCardNetworkMasterCard:
  51. return @"MasterCard";
  52. case BTCardNetworkVisa:
  53. return @"Visa";
  54. case BTCardNetworkJCB:
  55. return @"JCB";
  56. case BTCardNetworkLaser:
  57. return @"Laser";
  58. case BTCardNetworkMaestro:
  59. return @"Maestro";
  60. case BTCardNetworkUnionPay:
  61. return @"UnionPay";
  62. case BTCardNetworkHiper:
  63. return @"Hiper";
  64. case BTCardNetworkHipercard:
  65. return @"Hipercard";
  66. case BTCardNetworkSolo:
  67. return @"Solo";
  68. case BTCardNetworkSwitch:
  69. return @"Switch";
  70. case BTCardNetworkUKMaestro:
  71. return @"UKMaestro";
  72. case BTCardNetworkUnknown:
  73. default:
  74. return @"Unknown";
  75. }
  76. }
  77. + (BTCardNetwork)cardNetworkFromGatewayCardType:(NSString *)string {
  78. // Normalize the card network string in cardJSON to be lowercase so that our enum mapping is case insensitive
  79. BTJSON *cardType = [[BTJSON alloc] initWithValue:string.lowercaseString];
  80. return [cardType asEnum:@{
  81. @"american express": @(BTCardNetworkAMEX),
  82. @"diners club": @(BTCardNetworkDinersClub),
  83. @"unionpay": @(BTCardNetworkUnionPay),
  84. @"discover": @(BTCardNetworkDiscover),
  85. @"maestro": @(BTCardNetworkMaestro),
  86. @"mastercard": @(BTCardNetworkMasterCard),
  87. @"jcb": @(BTCardNetworkJCB),
  88. @"hiper": @(BTCardNetworkHiper),
  89. @"hipercard": @(BTCardNetworkHipercard),
  90. @"laser": @(BTCardNetworkLaser),
  91. @"solo": @(BTCardNetworkSolo),
  92. @"switch": @(BTCardNetworkSwitch),
  93. @"uk maestro": @(BTCardNetworkUKMaestro),
  94. @"visa": @(BTCardNetworkVisa),}
  95. orDefault:BTCardNetworkUnknown];
  96. }
  97. + (instancetype)cardNonceWithJSON:(BTJSON *)cardJSON {
  98. BTJSON *authInsightJson;
  99. if ([cardJSON[@"authenticationInsight"] asDictionary]) {
  100. authInsightJson = cardJSON[@"authenticationInsight"];
  101. }
  102. return [[self.class alloc] initWithNonce:[cardJSON[@"nonce"] asString]
  103. cardNetwork:[self.class cardNetworkFromGatewayCardType:[cardJSON[@"details"][@"cardType"] asString]]
  104. expirationMonth:[cardJSON[@"details"][@"expirationMonth"] asString]
  105. expirationYear:[cardJSON[@"details"][@"expirationYear"] asString]
  106. cardholderName:[cardJSON[@"details"][@"cardholderName"] asString]
  107. lastTwo:[cardJSON[@"details"][@"lastTwo"] asString]
  108. lastFour:[cardJSON[@"details"][@"lastFour"] asString]
  109. isDefault:[cardJSON[@"default"] isTrue]
  110. cardJSON:cardJSON
  111. authInsightJSON:authInsightJson];
  112. }
  113. + (instancetype)cardNonceWithGraphQLJSON:(BTJSON *)json {
  114. NSString *lastFour = @"";
  115. if ([json[@"creditCard"][@"last4"] asString]) {
  116. lastFour = [json[@"creditCard"][@"last4"] asString];
  117. }
  118. NSString *lastTwo = lastFour.length == 4 ? [lastFour substringFromIndex:2] : @"";
  119. BTJSON *authInsightJson;
  120. if ([json[@"authenticationInsight"] asDictionary]) {
  121. authInsightJson = json[@"authenticationInsight"];
  122. }
  123. return [[self.class alloc] initWithNonce:[json[@"token"] asString]
  124. cardNetwork:[self.class cardNetworkFromGatewayCardType:[json[@"creditCard"][@"brand"] asString]]
  125. expirationMonth:[json[@"creditCard"][@"expirationMonth"] asString]
  126. expirationYear:[json[@"creditCard"][@"expirationYear"] asString]
  127. cardholderName:[json[@"creditCard"][@"cardholderName"] asString]
  128. lastTwo:lastTwo
  129. lastFour:lastFour
  130. isDefault:NO
  131. cardJSON:json[@"creditCard"]
  132. authInsightJSON:authInsightJson];
  133. }
  134. @end