Saltar al contenido principal
En esta página

Utilice el SDK de Android de DEUNA para mostrar experiencias completas de Checkout, Widget de Pago, Almacen de Pagos, Click to Pay, siguiente acción, voucher y Google Pay nativo en aplicaciones Kotlin. El SDK es compatible con Android API 22 y versiones posteriores.

Instalación#

Añada JitPack a la resolución de dependencias y especifique una versión del 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>")
}

Seleccione y especifique <version> de las versiones del repositorio.Pruebe las actualizaciones en el entorno de prueba antes de implementarlas en producción.

Inicialización#

Cree una instancia del SDK con la clave API pública para el entorno seleccionado y guárdela para el flujo correspondiente.

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

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

Para una instancia a nivel de aplicación, inicialice el SDK compartido una vez:

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

val deunaSDK = DeunaSDK.shared

Abra el Widget de Pago en un modal#

Crear llamadas de retorno con tipos y pasar un Activity o cualquier otra interfaz de usuario válida. 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",
)

El host modal gestiona las vistas del widget y la redirección. Llamar a close() Cuando el flujo de éxito o error se ha completado, espera a que la URL externa activa se cierre antes de liberar el widget.

Experiencias disponibles#

ExperienciaMétodoInformación necesaria
Finalizar comprainitCheckout(...)context, orderToken, CheckoutCallbacks
Widget de PagoinitPaymentWidget(...)context, orderToken, PaymentWidgetCallbacks
Caja de PagoinitElements(...)context, ElementsCallbacks; types puede omitirse
Haga clic para pagarinitElements(...)types = listOf(mapOf("name" to "click_to_pay"))
Siguiente AccióninitNextAction(...)Token para el pedido que requiere una acción adicional
valeinitVoucherWidget(...)Token para el pedido de vale

Todos los métodos modales aceptan entradas opcionales de idioma, fraude, agente de usuario personalizado y dominio, siempre que sea compatible. No se deben modificar domain a menos que DEUNA le proporcione un host de integración específico.

Integrar un widget#

El modo integrado utiliza una configuración de tipo y DeunaWidget. Este ejemplo de Jetpack Compose renderiza el Widget de Pago y destruye su WebView con el ciclo de vida de la pantalla.

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() }
}

llamar resume() y pause() cuando el ciclo de vida que lo contiene comienza y termina. Para un widget dentro de una pantalla que se desplaza verticalmente, pase AutoResizeConfig en la configuración y conéctelo setOnScrollByCallback al estado de desplazamiento del padre.

Si su aplicación posee el botón de pago, configure hidePayButton = true en la configuración y llamar al módulo integrado DeunaWidget extensión submit { result -> ... } Desde el toque del botón.

Almacén de pagos y Pago con un clic#

El Almacén de pagos es la experiencia predeterminada de Elements. Proporcione una autenticación userToken o la información necesaria UserInfo para identificar al 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" en lugar de "vault" para Click to Pay.

Google Pay nativo#

Verifique tanto la configuración del comerciante como el soporte del dispositivo antes de mostrar su botón de Google Pay. El resultado se almacena en caché por el 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
}

Después de que la disponibilidad tenga éxito, inicie la hoja al hacer clic en el botón. initElements requiere que se realice la llamada de disponibilidad primero.

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

Consulta pago de google para los detalles de registro, pruebas y tokenización.

Continúe con una acción pendiente#

Utilice el mismo token de pedido cuando DEUNA informe que el pago requiere un desafío o redirección 3DS compatible.

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

El SDK abre las URL externas compatibles y regresa al widget activo. Utilice el estado de llamada de retorno para la interfaz y un webhook verificado para la ejecución.

Abrir un cupón#

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

Las llamadas de retorno de los vouchers siguen el mismo ciclo de éxito, error, cierre y envío de eventos que las otras experiencias de pago.

Datos de fraude del dispositivo#

Inicialice las proveedores de fraude nativos configurados, como en Application.onCreate, con antelación, para reducir la latencia más adelante en el flujo de pago.

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

Genere el identificador combinado cuando lo necesite su pedido o flujo de riesgo:

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

Incluya solo las dependencias y la configuración del proveedor de fraude asignadas a su cuenta. Consulte Integrar la huella digital del dispositivo.

Referencia del ciclo de vida y llamadas de retorno#

Llamada de retorno o métodoÚselo para
onSuccessActualice la interfaz después de que la experiencia haya tenido éxito.
onErrorManeje un tipo de PaymentsError o ElementsError.
onClosedDistinga entre el cierre controlado por el cliente y el SDK.
onEventDispatchObserve los eventos de ciclo de vida de checkout o Elements.
onCardBinDetectedReaccione a la detección de BIN de tarjeta en el Widget de Pago o Elements.
onInstallmentSelectedReaccione a la selección de un plan de cuotas.
onPaymentProcessingEvite acciones de pago duplicadas.
close()Cierre el modal activo después de que las vistas externas se hayan cerrado.

Ejemplos y código fuente oficiales#

Consulta ExploreViewModel.kt para fábricas de configuración y EmbeddedScreen.kt para el manejo del ciclo de vida de WebView.