Manejar el retorno del navegador externo (callback_url)

Visión general

Cuando un flujo de pago requiere que el usuario complete una acción en un navegador externo (por ejemplo, desafío 3DS, redirección bancaria), es esencial utilizar la función callback_url para garantizar que el usuario vuelva a tu aplicación sin problemas.


1. Establezca la callback_url al crear la sesión de pago

Envía el callback_url al crear la sesión de pago:

{
  "callback_url": "myapp://return"
}
❗️

Importante

Sin callback_url, el usuario puede quedarse en el navegador sin forma de volver a tu aplicación.

2. Configure tu aplicación Android para manejar el enlace profundo

Añadir un intent-filter a su actividad principal en AndroidManifest.xml:

<activity android:name=".YourMainActivity">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="myapp"
            android:host="return" />
    </intent-filter>
</activity>
  • El régimen (myapp) y anfitrión (return) deben coincidir con su callback_url

3. Maneje la intención en su actividad

En su actividad, gestione la intención de devolución:

intent.data?.let { uri ->
    val url = uri.toString()
    if (url.contains("myapp://return")) {
        // Handle the return, e.g., show a message or navigate
        Toast.makeText(this, "Returned from payment flow", Toast.LENGTH_SHORT).show()
    }
}
  • Adapta esta lógica a las necesidades de tu aplicación

4. Ejemplo completo: integración con el SDK de Yuno

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    startCheckout(
        callbackPaymentState = {
            Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
        }
    )

    if (intent?.data != null) {
        intent.data?.let {
            if (it.toString().contains(URI_INTENT_CONTINUE)) {
                val sessionId = extractCheckoutSessionFromIntent(intent)

                continuePayment(
                    showPaymentStatus = configuration.showStatusYuno,
                    checkoutSession = sessionId,
                    countryCode = configuration.country,
                ) { result ->
                    result?.let {
                        Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
    } else {
        setContent {
            YunoContent(configuration) {
                initYuno()
            }
        }
    }
}

private fun extractCheckoutSessionFromIntent(intent: Intent?): String? {
    return intent?.data?.getQueryParameter("checkoutSession")
}

Buenas prácticas

  • Defina y utiliza siempre callback_url en tu flujo de pago
  • Configura el intent-filter correctamente en su manifiesto
  • Manejar la intención de retorno para actualizar el estado de pago o navegar por el usuario
  • Pruebe el flujo en varios dispositivos y navegadores

Resumen

  • Usar callback_url para que los usuarios vuelvan a tu aplicación
  • Configurar la gestión de enlaces profundos en Android
  • Manejar la intención de completar el flujo de pago