Skip to content

Commit

Permalink
Merge pull request #2 from tamojuno/feature/ObjcSupport
Browse files Browse the repository at this point in the history
Feature/objc support
  • Loading branch information
diegotl committed Aug 30, 2019
2 parents 16dd7a4 + 74d1e5e commit 20f9e0a
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 40 deletions.
2 changes: 1 addition & 1 deletion DirectCheckout.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |spec|

spec.name = "DirectCheckout"
spec.version = "0.0.2"
spec.version = "0.0.3"
spec.summary = "SDK para criptografia e validação de dados do cartão de crédito para integração com a API de pagamentos da Juno/BoletoBancário."
spec.homepage = "http://www.juno.com.br"
spec.author = { "Diego Trevisan Lara" => "diego@juno.com.br" }
Expand Down
23 changes: 16 additions & 7 deletions DirectCheckout/Dependencies/APIClient/Endpoint/URLs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,33 @@
// MARK: - Enums

struct APIEndpointUrl {
let base: APIEnvionment
let environment: APIEnvionment
let path: EndpointPath

init(base: APIEnvionment = .current, path: EndpointPath) {
self.base = base
init(environment: APIEnvionment = .current, path: EndpointPath) {
self.environment = environment
self.path = path
}

var url: String {
return "\(base.rawValue)\(path.value)"
return "\(environment.baseUrl)\(path.value)"
}
}

// MARK: - Environment

public enum APIEnvionment: String {
case production = "https://www.boletobancario.com/boletofacil/integration/api"
case sandbox = "https://sandbox.boletobancario.com/boletofacil/integration/api"
@objc public enum APIEnvionment: Int {
case production
case sandbox

var baseUrl: String {
switch self {
case .production:
return "https://www.boletobancario.com/boletofacil/integration/api"
case .sandbox:
return "https://sandbox.boletobancario.com/boletofacil/integration/api"
}
}

static var current: APIEnvionment = .production
}
Expand Down
40 changes: 34 additions & 6 deletions DirectCheckout/SDK/DirectCheckout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
// Copyright © 2019 Juno Pagamentos. All rights reserved.
//

public class DirectCheckout {
public class DirectCheckout: NSObject {

private static var publicToken: String?

public static func initialize(publicToken: String, environment: APIEnvionment = .production) {
// MARK: - Initialization

@objc public static func initialize(publicToken: String, environment: APIEnvionment = .production) {
self.publicToken = publicToken
APIEnvionment.current = environment
}

// MARK: - Get hash
// MARK: - Get card hash

public static func getCardHash(_ card: Card, completion: @escaping (Result<String, DirectCheckoutError>) -> Void) {

Expand Down Expand Up @@ -60,16 +62,42 @@ public class DirectCheckout {
return CardUtils.getCardType(cardNumber)
}

public static func isValidCardNumber(_ cardNumber: String) -> Bool {
@objc public static func isValidCardNumber(_ cardNumber: String) -> Bool {
return CardUtils.validateNumber(cardNumber)
}

public static func isValidSecurityCode(_ cardNumber: String, _ securityCode: String) -> Bool {
return CardUtils.validateCVC(cardNumber, securityCode)
@objc(isValidSecurityCode:cardNumber:)
public static func isValidSecurityCode(_ securityCode: String, _ cardNumber: String) -> Bool {
return CardUtils.validateCVC(securityCode, cardNumber)
}

@objc(isValidExpireDateMonth:year:)
public static func isValidExpireDate(month: String, year: String) -> Bool {
return CardUtils.validateExpireDate(month, year)
}

}

// MARK: - Objective-C Support

extension DirectCheckout {

@available(swift, obsoleted: 0.1)
@objc public static func initialize(publicToken: String) {
initialize(publicToken: publicToken, environment: .production)
}

@available(swift, obsoleted: 0.1)
@objc(getCardHash:success:failure:)
public static func getCardHash(card: Card, success: @escaping (_ hash: String) -> Void, failure: @escaping (_ error: Error) -> Void) {
getCardHash(card) { result in
switch result {
case .success(let hash):
success(hash)
case .failure(let error):
failure(error)
}
}
}

}
30 changes: 23 additions & 7 deletions DirectCheckout/SDK/Entities/Response/Card.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
// Copyright © 2019 Juno Pagamentos. All rights reserved.
//

public struct Card: Codable {
public class Card: NSObject, Codable {

let cardNumber: String
let holderName: String
let securityCode: String
let expirationMonth: String
let expirationYear: String

public init(cardNumber: String, holderName: String, securityCode: String, expirationMonth: String, expirationYear: String) {
@objc public init(cardNumber: String, holderName: String, securityCode: String, expirationMonth: String, expirationYear: String) {
self.cardNumber = cardNumber.onlyNumbers
self.holderName = holderName
self.securityCode = securityCode.onlyNumbers
Expand All @@ -34,21 +34,21 @@ public struct Card: Codable {

// MARK: - Aux functions

extension Card {
public extension Card {

func getType() -> CardType? {
return CardUtils.getCardType(cardNumber)
}

func validateNumber() -> Bool {
@objc func validateNumber() -> Bool {
return CardUtils.validateNumber(cardNumber)
}

func validateCVC() -> Bool {
return CardUtils.validateCVC(cardNumber, securityCode)
@objc func validateCVC() -> Bool {
return CardUtils.validateCVC(securityCode, cardNumber)
}

func validateExpireDate() -> Bool {
@objc func validateExpireDate() -> Bool {
return CardUtils.validateExpireDate(expirationMonth, expirationYear)
}

Expand Down Expand Up @@ -98,3 +98,19 @@ public enum CardError: LocalizedError {
}
}
}

// MARK: - Objective-C Support

public extension Card {

@available(swift, obsoleted: 0.1)
@objc func validate(success: (Card) -> Void, failure: (Error) -> Void) {
do {
_ = try validate()
success(self)
} catch {
failure(error)
}
}

}
2 changes: 1 addition & 1 deletion DirectCheckout/SDK/Entities/Response/CardType.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ struct CardTypeAssets {
}
}

enum CardType: String, CaseIterable {
public enum CardType: String, CaseIterable {
case visa
case masterCard
case amex
Expand Down
2 changes: 1 addition & 1 deletion DirectCheckout/SDK/Utils/CardUtils.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class CardUtils {
return cardType?.cardLength == clearCardNumber.count && luhnCheck(clearCardNumber)
}

static func validateCVC(_ cardNumber: String, _ securityCode: String) -> Bool {
static func validateCVC(_ securityCode: String, _ cardNumber: String) -> Bool {
let cardType = getCardType(cardNumber)?.assets()
return cardType?.cvcLength == securityCode.count
}
Expand Down
8 changes: 4 additions & 4 deletions DirectCheckoutTests/DirectCheckoutTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,11 @@ class DirectCheckoutTests: XCTestCase {
}

func test_valid_security_code() {
XCTAssertTrue(DirectCheckout.isValidSecurityCode("4111111111111111", "123")) //visa
XCTAssertTrue(DirectCheckout.isValidSecurityCode("5105105105105100", "987")) //master
XCTAssertTrue(DirectCheckout.isValidSecurityCode("123", "4111111111111111")) //visa
XCTAssertTrue(DirectCheckout.isValidSecurityCode("987", "5105105105105100")) //master

XCTAssertFalse(DirectCheckout.isValidSecurityCode("4111111111111111", "1234")) //visa
XCTAssertFalse(DirectCheckout.isValidSecurityCode("5105105105105100", "98")) //master
XCTAssertFalse(DirectCheckout.isValidSecurityCode("1234", "4111111111111111")) //visa
XCTAssertFalse(DirectCheckout.isValidSecurityCode("98", "5105105105105100")) //master
}

func test_card_valid_security_code() {
Expand Down
122 changes: 122 additions & 0 deletions README-OBJC.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# DirectCheckout iOS

![CocoaPods Compatible](https://img.shields.io/cocoapods/v/DirectCheckout.svg)
![Platforms](https://img.shields.io/badge/platforms-iOS-333333.svg)
![Languages](https://img.shields.io/badge/languages-Swift%20%7C%20ObjC-333333.svg)

>_Caso necessite, [confira a documentação para Swift](https://github.com/tamojuno/direct-checkout-ios/blob/master/README.md)._
SDK para criptografia e validação de dados de cartão de crédito para integração com a API de pagamentos da Juno/BoletoBancário.

Visando garantir a segurança das transações realizadas em nossa plataforma, a API da Juno adota uma política de criptografia dos dados de cartão de crédito de ponta-a-ponta.

Para mais informações acesse nossa página de integração:

[Integração via API](https://www.boletobancario.com/boletofacil/integration/integration.html)

## Instalação

### Cocoapods

Adicione o SDK nas dependências do seu aplicativo inserindo a seguinte linha no arquivo `Podfile`:

```
pod 'DirectCheckout'
```

Em seguida, instale as dependências pelo comando:

```bash
pod install
```

Na inicialização do aplicativo, preferencialmente na classe `AppDelegate`, faça a inicialização do SDK passando como parâmetro o seu token público, que pode ser obtido em nossa [página de integração](https://www.boletobancario.com/boletofacil/integration/integration.html):

```objective-c
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[DirectCheckout initializeWithPublicToken:@"AC2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5"];

return YES;
}
```

Opcionalmente também é possível escolher o ambiente de testes (Sandbox):

```objective-c
[DirectCheckout initializeWithPublicToken:@"AC2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5" environment:APIEnvionmentSandbox];
```
## Utilização
Detalhamos a seguir um exemplo de utilização de nossa biblioteca de como obter o hash do cartão de crédito:
```objective-c
Card *card = [[Card alloc] initWithCardNumber:@"5448280000000007"
holderName:@"Antônio"
securityCode:@"123"
expirationMonth:@"01"
expirationYear:@"2020"];
[DirectCheckout getCardHash:card success:^(NSString *hash) {
/* Sucesso - A variável hash conterá o hash do cartão de crédito */
} failure:^(NSError *error) {
/* Erro - A variável error conterá o erro ocorrido ao obter o hash */
}];
```

## Funções Auxiliares

A biblioteca disponibilizada também possui uma série de métodos auxiliares para a validação de dados do cartão de crédito, conforme demonstrado a seguir:

```objective-c
/* isValidCardNumber: Valida número do cartão de crédito (retorna true se for válido) */
[DirectCheckout isValidCardNumber:@"9999999999999999"];

/* isValidSecurityCode: Valida código de segurança do cartão de crédito (retorna true se for válido) */
[DirectCheckout isValidSecurityCode:@"111" cardNumber:@"9999999999999999"];

/* isValidExpireDate: Valida data de expiração do cartão de crédito (retorna true se for válido) */
[DirectCheckout isValidExpireDateMonth:@"05" year:@"2021"];
```
Algumas funções também podem ser acessadas diretamente da classe Card:
```objective-c
Card *card = [[Card alloc] initWithCardNumber:@"5448280000000007"
holderName:@"Antônio"
securityCode:@"123"
expirationMonth:@"01"
expirationYear:@"2020"];
/* validateNumber: Valida número do cartão de crédito (retorna true se for válido) */
[card validateNumber];
/* validateCVC: Valida código de segurança do cartão de crédito (retorna true se for válido) */
[card validateCVC];
/* validateExpireDate: Valida data de expiração do cartão de crédito (retorna true se for válido) */
[card validateExpireDate];
/* validate: Realiza todas as validações do cartão de crédito (executando bloco success se for válido ou bloco failure com um erro especificando a falha) */
[card validateWithSuccess:^(Card *card) {
/* Sucesso */
} failure:^(NSError *error) {
/* Erro */
}];
```

## Contato

Para mais informações entre em contato com a Juno:

* https://juno.com.br/contato.html
Loading

0 comments on commit 20f9e0a

Please sign in to comment.