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