Android - merci-app/whatsapp-pay-docs GitHub Wiki

No Android, o WPP transmite os dados para o app do emissor através de um intent.
O app do emissor responde utilizando Activity.setResult.

Seguem abaixo as etapas para implementar a ativação de token WPP + App2App@Android.


1) Criar uma activity para tratar o intent enviado pelo WPP

Abaixo um exemplo de como obter o payload enviado pelo WPP.

/**
 * This activity is exported and therefore must be public.
 */
class App2AppActivity : Activity()

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

        val encodedPayload = intent.getStringExtra(Intent.EXTRA_TEXT)
        // TODO: decode payload (see step #2)
    }

}

A activity criada acima precisa ser configurada com o intent-filter demandado pelo WPP.
O nome da action do intent-filter deve ser declarado como application_id.a2a.

Utilizando as configurações de exemplo, a activity deve ser declarada no manifest conforme segue:

<activity
    android:name=".App2AppActivity"
    android:exported="true">

    <intent-filter>
        <action android:name="com.bank.app.a2a" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Observação: para que a activity fique visível ao WPP, é importante que o atributo android:exported seja declarado como true.


2) Decode do payload de ativação de token

O próximo passo é decodificar o payload de ativação de token.

Para isso, é útil criar um model para armazenar os dados:

data class App2AppActivationPayload(
    val panReferenceID: String?,
    val tokenRequestorID: String?,
    val tokenReferenceID: String?,
    val walletAccountID: String?,
    val deviceID: String?,
    val deviceIndex: String?,
    val reasonCode: String?
)

Assim podemos implementar a função que decodifica o payload enviado pelo WPP:

fun decode(payloadBase64: String?): App2AppActivationPayload? {
    return runCatching {
        val json = Base64.decode(payloadBase64.orEmpty(), Base64.DEFAULT)
            .toString(StandardCharsets.UTF_8)

        // Use Gson, Moshi, etc or manual parse to create the App2AppActivationPayload instance from the json
        Gson().fromJson(json, App2AppActivationPayload::class.java)
    }.onFailure {
        // Error while decoding
    }.getOrNull()
}

3) Executar a API de ativação de token

Com as informações obtidas na etapa 2, o próximo passo é se comunicar com o BFF para que o mesmo execute a API de ativação de token.

Observaçao: antes de prosseguir com esta etapa, uma boa prática e apresentar uma tela pedindo a confirmação do usuário e requisitar autenticação com senha/biometria.


4) Enviar resultado para o WPP

Após executar a API de ativação de token com sucesso, é necessário enviar o resultado para o WPP.
Dessa forma, o fluxo de ativação de token é encerrado e o controle retorna para o WPP.

Pseudo-code dos passos 3 e 4:

// Call BFF API that execute Token activation (TODO MAKE link)
ActivateToken(payload = App2AppTokenActivationPayload)
    .onFailure {
        val intent = Intent().apply {
            putExtra("STEP_UP_RESPONSE", "failure")
        }
        setResult(Activity.RESULT_OK, intent)
        finish()
    }
    .onSuccess {
        val intent = Intent().apply {
            putExtra("STEP_UP_RESPONSE", "approved")
        }
        setResult(Activity.RESULT_OK, intent)
        finish()
    }
}
⚠️ **GitHub.com Fallback** ⚠️