Skip to content

Commit

Permalink
ObjC support.
Browse files Browse the repository at this point in the history
  • Loading branch information
diegotl committed Aug 30, 2019
1 parent 8eec06e commit 6545c56
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 35 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
42 changes: 33 additions & 9 deletions DirectCheckout/SDK/DirectCheckout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,18 @@
// Copyright © 2019 Juno Pagamentos. All rights reserved.
//

@objc public class DirectCheckout: NSObject {
public class DirectCheckout: NSObject {

private static var publicToken: String?

// MARK: - Initialization

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

// MARK: - Get hash

@objc public static func getCardHash(card: Card, success: (_ hash: String) -> Void, error: (_ error: Error) -> Void) {

}
// MARK: - Get card hash

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

Expand Down Expand Up @@ -64,16 +62,42 @@
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)
}
}
}

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

@objc public class Card: NSObject, Codable {
public class Card: NSObject, Codable {

let cardNumber: String
let holderName: String
Expand Down Expand Up @@ -34,21 +34,21 @@

// 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):

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

[DirectCheckout initializeWithPublicToken:@"AC2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5"];

return YES;
}
```

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

```objc
[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:
```objc
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:

```objc
/* 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:
```objc
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
29 changes: 16 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@

# 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 Objective-C](https://github.com/tamojuno/direct-checkout-ios/blob/master/README-OBJC.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)
[Integração via API](https://www.boletobancario.com/boletofacil/integration/integration.html)

## Instalação

Expand All @@ -30,16 +35,16 @@ Na inicialização do aplicativo, preferencialmente na classe `AppDelegate`, fa
```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {

DirectCheckout.initialize(publicToken: "AF2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5")
DirectCheckout.initialize(publicToken: "AC2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5")

return true
}
```

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

```swift
DirectCheckout.initialize(publicToken: "AF2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5", environment: .sandbox)
DirectCheckout.initialize(publicToken: "AC2261A2ECC7FD90D205502092571F5C1C0831935E35073AA95AEBEB68D7E5C5", environment: .sandbox)
```

## Utilização
Expand All @@ -52,12 +57,12 @@ let card = Card(cardNumber: "5448280000000007",
securityCode: "123",
expirationMonth: "01",
expirationYear: "2020")

DirectCheckout.getCardHash(card) { result in
do {
let hash = try result.get()
/* Sucesso - A variável hash conterá o hash do cartão de crédito */

} catch let error {
/* Erro - A variável error conterá o erro ocorrido ao obter o hash */
}
Expand All @@ -69,11 +74,11 @@ DirectCheckout.getCardHash(card) { result in
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:

```swift
/* isValidSecurityCode: Valida número do cartão de crédito (retorna true se for válido) */
/* 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("9999999999999999", "111")
DirectCheckout.isValidSecurityCode("111", "9999999999999999")

/* isValidExpireDate: Valida data de expiração do cartão de crédito (retorna true se for válido) */
DirectCheckout.isValidExpireDate(month: "05", year: "2021")
Expand All @@ -90,7 +95,7 @@ let card = Card(cardNumber: "5448280000000007",
securityCode: "123",
expirationMonth: "01",
expirationYear: "2020")

/* getType: Obtém o tipo de cartão de crédito (bandeira) */
card.getType()

Expand All @@ -108,10 +113,8 @@ card.validate()

```

## Contato
## Contato

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

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


0 comments on commit 6545c56

Please sign in to comment.