Manipular o retorno do navegador externo (callback_url)

Visão geral

Quando um fluxo de payment exige que o usuário conclua uma ação em um navegador externo (por exemplo, desafio 3DS, redirecionamento bancário), é essencial usar o callback_url para garantir que o usuário retorne ao seu aplicativo sem problemas.


1. Defina o callback_url ao criar a sessão de checkout

Enviar o callback_url ao criar a sessão de checkout:

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

Importante

Sem callback_urlSe o usuário não conseguir acessar o aplicativo, ele poderá ser deixado no navegador sem nenhuma maneira de retornar ao aplicativo.

2. Configure seu aplicativo Android para lidar com o deep link

Adicionar um intent-filter para sua atividade principal em 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>
  • O esquema (myapp) e host (return) deve corresponder ao seu callback_url

3. Lidar com a intenção em sua atividade

Em sua atividade, trate a intenção de retorno:

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()
    }
}
  • Adapte essa lógica às necessidades de seu aplicativo

4. Exemplo completo: integração com o Yuno SDK

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

Práticas recomendadas

  • Sempre defina e use callback_url em seus fluxos de payment
  • Configurar o intent-filter corretamente em seu manifesto
  • Tratar a intenção de retorno para atualizar o status payment ou navegar com o usuário
  • Teste o fluxo em vários dispositivos e navegadores

Resumo

  • Uso callback_url para garantir que os usuários retornem ao seu aplicativo
  • Configurar o tratamento de links diretos no Android
  • Lidar com a intenção de concluir o fluxo de payment