Giter VIP home page Giter VIP logo

direct-checkout-android's Introduction

DirectCheckout Android

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

Setup

Adicione o JitPack repository em seu build.gradle (top level module):

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

Adicione o SDK nas dependências do seu aplicativo

dependencies {
    implementation "com.github.tamojuno:direct-checkout-android:1.0.2"
}

No arquivo Manifest adicione a permissão de acesso à internet, e seu token público que pode ser obtido em nossa página de integração

<manifest>

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
           ...
           android:name=".MyApplication"
           ...>

        <meta-data
                android:name="br.com.juno.directcheckout.public_token"
                android:value="YOUR_PUBLIC_TOKEN"/>
        <meta-data
                android:name="br.com.juno.directcheckout.public_token_sandbox"
                android:value="YOUR_PUBLIC_TOKEN_SANDBOX"/>

            ...

    </application>

</manifest>

Na sua classe application inicialize o SDK:

class MyApplication:Application(){

    override fun onCreate() {
        super.onCreate()
        DirectCheckout.initialize(this)
    }
}

Para utilizar o ambiente de testes (Sandbox) basta passar false no segundo parâmetro (prod):

class MyApplication:Application(){

    override fun onCreate() {
        super.onCreate()
        DirectCheckout.initialize(this, prod = false)
    }
}

Utilização

Detalhamos a seguir um exemplo de utilização de nossa biblioteca de como obter o hash do cartão de crédito:

  val card = Card(
      cardNumber = "999999999",
      holderName = "Teste",
      securityCode = "111",
      expirationMonth = "6",
      expirationYear = "2022"
  )

  DirectCheckout.getCardHash(card, object : DirectCheckoutListener<String> {
      
      override fun onSuccess(cardHash: String) {
          /* Sucesso - A variável cardHash conterá o hash do cartão de crédito */
      }

      override fun onFailure(exception: DirectCheckoutException) {
          /* Erro - A variável exception conterá o erro ocorrido ao obter o hash */
      }
  })

Caso esteja utilizando a linguagem Java:

  Card card  = new Card(
      "9999 9999 9999 9999",
      "Teste",
      "111",
      "6",
      "2022"
  );


  DirectCheckout.getCardHash(card, new DirectCheckoutListener<String>() {
      @Override
      public void onSuccess(@NotNull String cardHash) {
          /* Sucesso - A variável cardHash conterá o hash do cartão de crédito */
      }

      @Override
      public void onFailure(@NotNull DirectCheckoutException exception) {
          /* Erro - A variável exception 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:

  /* isValidSecurityCode: 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")

  /* isValidExpireDate: Valida data de expiração do cartão de crédito (retorna true se for válido) */
  DirectCheckout.isValidExpireDate("05", "2021")

  /* isValidCardData: Validação dos dados do cartão de crédito(retorna true se for válido) */
  DirectCheckout.isValidCardData(card)

  /* getCardType: Obtém o tipo de cartão de crédito (bandeira) */
  DirectCheckout.getCardType("9999999999999999")}

Algumas funções também podem ser acessadas diretamente da classe Card:

  val card = Card(
    cardNumber = "999999999",
    holderName = "Teste",
    securityCode = "111",
    expirationMonth = "6",
    expirationYear = "2022"
  )

  /* isValidSecurityCode: Valida número do cartão de crédito (retorna true se for válido) */
  card.validateNumber()

  /* isValidSecurityCode: Valida código de segurança do cartão de crédito (retorna true se for válido) */
  card.validateCVC()

  /* isValidExpireDate: Valida data de expiração do cartão de crédito (retorna true se for válido) */
  card.validateExpireDate()

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

Proguard

-keep class br.com.juno.** { *; }

Contato

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

direct-checkout-android's People

Contributors

diefferson avatar rafaeldalbosco avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

direct-checkout-android's Issues

Lib para flutter

Pretendem criar uma lib para flutter/dart também? É o que mais está sendo usado no momento

A propriedade address não faz parte do JSON esperado - errorCode":"351003"

I'm getting this error with payments api - production environment:

INPUT:
{"chargeId": "chr_C71C075A6DA54BCB464110578184AE15", "address": {"street": "Av Paulista", "number": "100", "complement": "123", "city": "Sao Paulo", "state": "SP", "postCode": "01048-000", },"creditCardDetails": {"creditCardHash": "85813c0f-4887-4e20-b3c8-ee402e713149"}}

RESULT:

E/Volley: [1347] BasicNetwork.performRequest: Unexpected response code 422 for https://api.juno.com.br/payments
E/error: {"timestamp":"2020-08-26T01:34:53.025-03:00","status":422,"error":"Unprocessable Entity","details":[{"message":"A propriedade address não faz parte do JSON esperado","errorCode":"351003"}],"path":"/payments"}

Other Endpoints?

There any plan to implement the rest of the endpoints?

  • /credit-cards/tokenization
  • /payments
  • /payments/{id}/refunds
  • /payments/{id}/capture
  • /payments/{id}/cancelation
  • /charges/{id}/split

I would like to add this to my app using this lib, but need to know if there is some work on it already going.

tks

Error on DirectCheckout.initialize

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.guincho7.customer, PID: 32517
java.lang.NoClassDefFoundError: Failed resolution of: Lretrofit2/Retrofit$Builder;
at br.com.juno.directcheckout.api.ApiFactory.makeRetrofitService(JunoApi.kt:32)
at br.com.juno.directcheckout.DirectCheckout.loadPublicKey(DirectCheckout.kt:134)
at br.com.juno.directcheckout.DirectCheckout.initialize(DirectCheckout.kt:38)
at br.com.juno.directcheckout.DirectCheckout.initialize$default(DirectCheckout.kt:32)
at com.guincho7.payment.Juno.(Juno.kt:15)
at com.guincho7.customer.PaymentActivity.onCreate(PaymentActivity.kt:49)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2905)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1818)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6762)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "retrofit2.Retrofit$Builder" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.guincho7.customer-Q9sYnzjvZBN6OXlX3RT-hg==/base.apk"],nativeLibraryDirectories=[/data/app/com.guincho7.customer-Q9sYnzjvZBN6OXlX3RT-hg==/lib/arm64, /data/app/com.guincho7.customer-Q9sYnzjvZBN6OXlX3RT-hg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at br.com.juno.directcheckout.api.ApiFactory.makeRetrofitService(JunoApi.kt:32) 
at br.com.juno.directcheckout.DirectCheckout.loadPublicKey(DirectCheckout.kt:134) 
at br.com.juno.directcheckout.DirectCheckout.initialize(DirectCheckout.kt:38) 
at br.com.juno.directcheckout.DirectCheckout.initialize$default(DirectCheckout.kt:32) 
at com.guincho7.payment.Juno.(Juno.kt:15) 
at com.guincho7.customer.PaymentActivity.onCreate(PaymentActivity.kt:49) 
at android.app.Activity.performCreate(Activity.java:7136) 
at android.app.Activity.performCreate(Activity.java:7127) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2905) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1818) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:193) 
at android.app.ActivityThread.main(ActivityThread.java:6762) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

`package com.guincho7.payment

import android.content.Context
import android.text.TextUtils
import android.util.Log
import br.com.juno.directcheckout.DirectCheckout
import br.com.juno.directcheckout.model.Card
import br.com.juno.directcheckout.model.DirectCheckoutException
import br.com.juno.directcheckout.model.DirectCheckoutListener

class Juno(context : Context, production : Boolean) {
private val TAG : String = "DEVS"

init {
   DirectCheckout.initialize(context, production)
}

fun createCreditCard(card : CreditCard, callback : CreditCardCallback) {
    val card = Card(
        cardNumber = card.number.toString(),
        holderName = card.name.toString(),
        securityCode = card.cvc.toString(),
        expirationMonth = card.month.toString(),
        expirationYear = card.year.toString()
    )

    if(!(card.validateNumber() and card.validateCVC() and card.validateExpireDate())) {
        Log.d(TAG, "createCreditCard - Extra verification, card is not valid")
        return
    }

    DirectCheckout.getCardHash(card, object : DirectCheckoutListener<String> {

        override fun onSuccess(cardHash: String) {
           callback.onSuccess(cardHash)
        }

        override fun onFailure(exception: DirectCheckoutException) {
            callback.onFailure()
        }
    })

}

fun checkCreditCard(card : CreditCard) : CreditCardVerification {
    val verification = CreditCardVerification(
        number = false,
        name = false,
        cvc = false,
        month = false,
        year = false
    )

    verification.number = DirectCheckout.isValidCardNumber(card.number.toString())
    verification.name = DirectCheckout.isValidCardNumber(card.name.toString())
    verification.cvc = DirectCheckout.isValidCardNumber(card.cvc.toString())
    verification.month = DirectCheckout.isValidCardNumber(card.month.toString())
    verification.year = DirectCheckout.isValidCardNumber(card.year.toString())

    return verification
}


data class CreditCard(
    var number: String?,
    var name: String?,
    var cvc: String?,
    var month: String?,
    var year: String?
)

data class CreditCardVerification(
    var number: Boolean,
    var name: Boolean,
    var cvc: Boolean,
    var month: Boolean,
    var year: Boolean
)

}`

Error instantiate class

Calling juno = Juno(this, false) from the right Activity (Payment Activity)

React Native checkout

Hello, I am developing a mobile application, with React Native, and I need to use JUNO as a gateway, because the web version we are already using. Is there any solution for react-native?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.