Pular para o conteúdo principal
Nesta página

Utilize o SDK Android da DEUNA para exibir o Checkout completo, Widget de Pagamento, Cofre de Pagamentos, Click to Pay, próxima etapa, voucher e experiências nativas do Google Pay em aplicativos Kotlin. O SDK é compatível com Android API 22 e superior.

Instalação#

Adicione o JitPack para resolução de dependências e especifique uma versão do SDK.

settings.gradle.ktsKotlin
dependencyResolutionManagement {
  repositories {
    google()
    mavenCentral()
    maven(url = "https://jitpack.io")
  }
}
app/build.gradle.ktsKotlin
android {
  defaultConfig {
    minSdk = 22
  }
}

dependencies {
  implementation("com.github.deuna-developers:deunasdk:<version>")
}

Selecione e especifique <version> da lista de releases. Teste as atualizações no ambiente de sandbox antes de implementá-las em produção.

Inicialização#

Crie uma instância do SDK com a chave API pública para o ambiente selecionado e mantenha-a para o fluxo correspondente.

Kotlin
import com.deuna.maven.DeunaSDK
import com.deuna.maven.shared.Environment

val deunaSDK = DeunaSDK(
  environment = Environment.SANDBOX,
  publicApiKey = "YOUR_PUBLIC_API_KEY",
)

Para uma instância em toda a aplicação, inicialize o SDK compartilhado uma única vez:

Kotlin
DeunaSDK.initialize(
  environment = Environment.SANDBOX,
  publicApiKey = "YOUR_PUBLIC_API_KEY",
)

val deunaSDK = DeunaSDK.shared

Abra o Widget de Pagamento em um modal#

Implemente callbacks e passe um Activity ou outro valor válido de UI Context:

Kotlin
import com.deuna.maven.initPaymentWidget
import com.deuna.maven.widgets.payment_widget.PaymentWidgetCallbacks

val callbacks = PaymentWidgetCallbacks().apply {
  onSuccess = { order ->
    deunaSDK.close()
    showConfirmation(order)
  }
  onError = { error -> showRetry(error) }
  onClosed = { action -> showCart(action) }
  onPaymentProcessing = { disablePayButton() }
  onEventDispatch = { event, payload ->
    analytics.track(event.name, payload)
  }
}

deunaSDK.initPaymentWidget(
  context = this,
  orderToken = orderToken,
  callbacks = callbacks,
  language = "en",
)

O host do modal gerencia o widget e as visualizações de redirecionamento. Chame close() quando o fluxo de sucesso ou erro estiver completo; aguarde até que a URL externa esteja ativa antes de liberar o widget.

Experiências disponíveis#

ExperiênciaMétodoEntrada importante
Checkout completoinitCheckout(...)context, orderToken, CheckoutCallbacks
Widget de pagamentoinitPaymentWidget(...)context, orderToken, PaymentWidgetCallbacks
Cofre de PagamentosinitElements(...)context, ElementsCallbacks; types pode ser omitido
Clique para pagarinitElements(...)types = listOf(mapOf("name" to "click_to_pay"))
Próxima AçãoinitNextAction(...)Token para o pedido que requer uma ação adicional
VoucherinitVoucherWidget(...)Token para o pedido de voucher

Todos os métodos do modal aceitam entradas opcionais de idioma, prevenção de fraude, agente de usuário personalizado e domínio, sempre que suportado. Não sobrescreva domain a menos que a DEUNA forneça um host de integração específico.

Incorpore um widget#

O modo embutido utiliza uma configuração definida e DeunaWidget. Este exemplo do Jetpack Compose renderiza o Widget de Pagamento e destrói sua WebView com o ciclo de vida da tela.

Kotlin
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.viewinterop.AndroidView
import com.deuna.maven.web_views.deuna.DeunaWidget
import com.deuna.maven.web_views.deuna.extensions.build
import com.deuna.maven.widgets.configuration.PaymentWidgetConfiguration

val configuration = remember(orderToken) {
  PaymentWidgetConfiguration(
    sdkInstance = deunaSDK,
    orderToken = orderToken,
    callbacks = callbacks,
  )
}

val widget = remember { mutableStateOf<DeunaWidget?>(null) }

AndroidView(
  factory = { context ->
    DeunaWidget(context).apply {
      widgetConfiguration = configuration
      build()
      widget.value = this
    }
  },
)

DisposableEffect(Unit) {
  onDispose { widget.value?.destroy() }
}

Ligar resume() e pause() quando o ciclo de vida contendo o widget começa e termina. Para um widget dentro de uma tela de rolagem vertical, passe AutoResizeConfig na configuração e conexão setOnScrollByCallback para o estado de rolagem do elemento pai.

Se sua aplicação possui o botão de pagamento, defina: hidePayButton = true na configuração e invocar o módulo integrado DeunaWidget extensão submit { result -> ... } a partir do toque no botão.

Armazenamento de Pagamentos e Pagamento com Clique#

O Armazenamento de Pagamentos é a experiência padrão do Elements. Forneça um usuário autenticado userToken ou informações suficientes UserInfo para identificar o cliente.

Kotlin
import com.deuna.maven.initElements
import com.deuna.maven.shared.ElementsCallbacks
import com.deuna.maven.shared.domain.UserInfo

val elementsCallbacks = ElementsCallbacks().apply {
  onSuccess = { credential -> useSavedCredential(credential) }
  onError = { error -> showRetry(error) }
  onClosed = { action -> showPaymentMethods(action) }
}

deunaSDK.initElements(
  context = this,
  orderToken = orderToken,
  userInfo = UserInfo(email = "ada@example.com"),
  types = listOf(mapOf("name" to "vault")),
  callbacks = elementsCallbacks,
)

Uso "click_to_pay" em vez de "vault" para o Click to Pay.

Google Pay nativo#

Verifique tanto a configuração do comerciante quanto o suporte do dispositivo antes de exibir o botão do Google Pay. O resultado é armazenado em cache pelo SDK.

Kotlin
import com.deuna.maven.wallets.GetWalletsAvailableParams
import com.deuna.maven.wallets.WalletProvider
import com.deuna.maven.wallets.getWalletsAvailable

val userInfo = UserInfo(email = "ada@example.com")

deunaSDK.getWalletsAvailable(
  context = this,
  params = GetWalletsAvailableParams(
    orderToken = orderToken,
    userInfo = userInfo,
  ),
) { wallets, error ->
  if (error != null) {
    showWalletError(error)
    return@getWalletsAvailable
  }

  googlePayButton.isVisible = WalletProvider.GOOGLE_PAY in wallets
}

Após a verificação de disponibilidade, inicie a página a partir do toque no botão. initElements requer a chamada de disponibilidade primeiro.

Kotlin
googlePayButton.setOnClickListener {
  deunaSDK.initElements(
    context = this,
    orderToken = orderToken,
    userInfo = userInfo,
    types = listOf(mapOf("name" to WalletProvider.GOOGLE_PAY.name)),
    callbacks = elementsCallbacks,
  )
}

Consulte Google Pay para detalhes de inscrição, testes e tokenização.

Continue uma ação pendente#

Utilize o mesmo token de pedido quando a DEUNA informar que o pagamento requer um desafio ou redirecionamento 3DS suportado.

Kotlin
deunaSDK.initNextAction(
  context = this,
  orderToken = orderToken,
  callbacks = nextActionCallbacks,
)

O SDK abre URLs externas suportadas e retorna para o widget ativo. Utilize o estado de callback para a interface e um webhook verificado para a conclusão.

Abra um cupom#

Kotlin
deunaSDK.initVoucherWidget(
  context = this,
  orderToken = orderToken,
  callbacks = voucherCallbacks,
)

As chamadas de retorno (callbacks) para vouchers seguem o mesmo ciclo de sucesso, erro, fechamento e envio de eventos como as outras experiências de pagamento.

Dados de dispositivos para prevenção de fraudes#

Inicialize os provedores de prevenção de fraudes nativos configurados antecipadamente, por exemplo, em Application.onCreate, para reduzir a latência mais tarde no fluxo de pagamento.

Kotlin
DeunaSDK.initializeFraudProviders(
  context = applicationContext,
  params = mapOf("MERCADOPAGO" to emptyMap<String, Any>()),
  onError = { message -> logFraudError(message) },
)

Gere o identificador combinado quando necessário:

Kotlin
deunaSDK.generateFraudId(
  context = this,
  callback = { fraudId -> attachFraudId(fraudId) },
)

Inclua apenas as dependências e a configuração do provedor de fraudes atribuídas à sua conta. Consulte Integrar impressão digital do dispositivo.

Referência do ciclo de vida e callbacks#

Callback ou métodoUtilize-o para
onSuccessAtualize a interface após a conclusão da experiência.
onErrorLide com um tipo de PaymentsError ou ElementsError.
onClosedDiferencie o fechamento controlado pelo cliente e pelo SDK.
onEventDispatchMonitore os eventos de ciclo de vida suportados para checkout ou Elements.
onCardBinDetectedReaja à detecção do BIN do cartão no Payment Widget ou Elements.
onInstallmentSelectedReaja à seleção de um plano de parcelamento.
onPaymentProcessingImpede ações de pagamento duplicadas.
close()Feche o modal ativo após o fechamento de visualizações externas.

Exemplos e código-fonte oficiais#

Consulte o arquivo ExploreViewModel.kt para fábricas de configuração e EmbeddedScreen.kt para o gerenciamento do ciclo de vida do WebView.