Dopo aver creato una tessera e averla codificata in un JWT, puoi emetterla nella tua app per Android. Per farlo, devi verificare che l'API Google Wallet sia disponibile sul dispositivo dell'utente, presentargli un pulsante "Aggiungi a Google Wallet" e salvare la tessera in Google Wallet dopo che l'utente ha toccato il pulsante.
Prerequisiti
Prima di provare a emettere una tessera, assicurati di aver completato quanto segue:
- Hai completato tutti i passaggi descritti nella guida all'onboarding.
- Crea almeno un gruppo di permessi.
- Crea almeno un oggetto Passi.
- Codifica la classe e l'oggetto tessere in un JWT.
1. Installa l'SDK Android di Google Wallet
Per utilizzare l'SDK Android di Google Wallet, aggiungi com.google.android.gms:play-services-pay
alla sezione dependencies
del file build.gradle
a livello di app:
implementation "com.google.android.gms:play-services-pay:16.5.0"
2. Verificare la disponibilità dell'API Google Wallet
Prima di salvare il nuovo oggetto, assicurati che l'API Google Wallet sia disponibile sul dispositivo di destinazione chiamando il metodo getPayApiAvailabilityStatus
nella classe PayClient
.
Inizia aggiungendo una variabile membro all'attività in cui mostrerai il pulsante e la esegui in un'istanza al momento della creazione dell'attività:
Kotlin
import com.google.android.gms.pay.PayClient
private lateinit var walletClient: PayClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
walletClient = Pay.getClient(this)
// Additional logic in your onCreate method
}
Java
import com.google.android.gms.pay.PayClient;
private final PayClient walletClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
walletClient = Pay.getClient(application);
// Additional logic in your onCreate method
}
Se utilizzi altri pattern di progettazione, valuta la possibilità di posizionare la logica di business specifica del dominio in modo appropriato. Ad esempio, se utilizzi il pattern MVVM, colloca la logica di business relativa all'interfaccia utente nell'attività o nel frammento (ad es. Elementi dell'interfaccia utente, risultato dell'attività e logica operativa nel modello di visualizzazione (ad es.: istanza del client, attivatori di chiamate di rete).
A questo punto, utilizza PayClient
per verificare se l'API è disponibile:
Kotlin
import com.google.android.gms.pay.PayApiAvailabilityStatus
private fun fetchCanUseGoogleWalletApi() {
walletClient
.getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES)
.addOnSuccessListener { status ->
if (status == PayApiAvailabilityStatus.AVAILABLE) {
// The API is available, show the button in your UI
} else {
// The user or device is not eligible for using the Pay API
}
}
.addOnFailureListener {
// Hide the button and optionally show an error message
}
}
Java
import com.google.android.gms.pay.PayApiAvailabilityStatus;
private void fetchCanAddPassesToGoogleWallet() {
walletClient
.getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES)
.addOnSuccessListener(status -> {
if (status == PayApiAvailabilityStatus.AVAILABLE) {
// The API is available, show the button in your UI
} else {
// The user or device is not eligible for using the Pay API
};
})
.addOnFailureListener(exception -> {
// Google Play Services is too old, or API availability not verified
// Hide the button and optionally show an error message
});
}
Infine, chiama il metodo che hai appena definito nella tua applicazione quando devi determinare la disponibilità dell'API.
Gestire la situazione in cui l'API non è disponibile
Alcuni motivi per cui l'API potrebbe non essere disponibile includono le versioni di Android o Google Play Services non aggiornate o il fatto che Google Wallet non sia disponibile nel paese dell'utente.
Se l'API non è disponibile, valuta la possibilità di nascondere il pulsante e di utilizzare un'integrazione diversa (ad es. utilizzando un link JWT). Tieni presente che l'utente potrebbe diventare idoneo all'utilizzo dell'API in futuro.
3. Aggiungere il pulsante "Aggiungi a Google Wallet"
Google Wallet fornisce un pulsante familiare che puoi utilizzare per attivare il flusso Aggiungi a Google Wallet nella tua applicazione. Gli asset vettoriali per il pulsante sono disponibili nelle linee guida relative al pulsante.
Puoi importare gli asset vettoriali in Android Studio in File > New > Vector Asset
. Seleziona "File locale" nella procedura guidata, aggiungi un nome (ad es.
add_to_google_wallet_button.xml
) e individua il file nel tuo disco locale per importarlo.
Ora puoi utilizzare l'elemento drawable importato per aggiungere il pulsante all'interfaccia utente:
<ImageButton android:id="@+id/addToGoogleWalletButton" android:layout_width="match_parent" android:layout_height="48dp" android:minWidth="200dp" android:clickable="true" android:src="@drawable/add_to_google_wallet_button" />
Il pulsante ha un layout_height
di 48 dp e deve avere una larghezza di almeno 200 dp.
4. Aggiungere una tessera a Google Wallet di un utente
LoyaltyObject
può essere aggiunto passando un JWT non firmato al metodo savePasses
.
Puoi avviare l'operazione di aggiunta facendo clic sul pulsante Google Wallet.
Kotlin
import android.os.Bundle
import android.view.View
import com.google.android.gms.samples.wallet.databinding.ActivityCheckoutBinding
private val addToGoogleWalletRequestCode = 1000
private lateinit var layout: ActivityCheckoutBinding
private lateinit var addToGoogleWalletButton: View
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Use view binding to access the UI elements
layout = ActivityCheckoutBinding.inflate(layoutInflater)
setContentView(layout.root)
addToGoogleWalletButton = layout.addToGoogleWalletButton
addToGoogleWalletButton.setOnClickListener {
walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
}
// Additional logic in your onCreate method
}
Java
import android.os.Bundle;
import android.view.View;
import com.google.android.gms.samples.wallet.databinding.ActivityCheckoutBinding;
private static final int ADD_TO_GOOGLE_WALLET_REQUEST_CODE = 999;
private ActivityCheckoutBinding layout:
private View addToGoogleWalletButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Use view binding to access the UI elements
layout = ActivityCheckoutBinding.inflate(getLayoutInflater());
setContentView(layout.getRoot());
addToGoogleWalletButton = layout.addToGoogleWalletButton;
addToGoogleWalletButton.setOnClickListener(v -> {
walletClient.savePasses(newObjectJson, this, ADD_TO_GOOGLE_WALLET_REQUEST_CODE);
});
// Additional logic in your onCreate method
}
Gestione dei risultati
Il metodo savePasses
attiva il flusso di salvataggio e invoca il metodo onActivityResult
al termine del flusso di salvataggio. L'implementazione di onActivityResult
dovrebbe essere simile alla seguente:
Kotlin
import android.content.Intent
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == addToGoogleWalletRequestCode) {
when (resultCode) {
RESULT_OK -> {
// Pass saved successfully
}
RESULT_CANCELED -> {
// Save operation canceled
}
PayClient.SavePassesResult.SAVE_ERROR -> data?.let { intentData ->
val errorMessage = intentData.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE)
// Handle error
}
else -> {
// Handle unexpected (non-API) exception
}
}
}
}
Java
import android.content.Intent;
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ADD_TO_GOOGLE_WALLET_REQUEST_CODE) {
switch (resultCode) {
case RESULT_OK: {
// Pass saved successfully
break;
}
case RESULT_CANCELED: {
// Save operation canceled
break;
}
case PayClient.SavePassesResult.SAVE_ERROR: {
if (data != null) {
String apiErrorMessage = data.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE);
// Handle error
}
break;
}
default: {
// Handle unexpected (non-API) exception
}
}
}
}
Quando la tessera viene aggiunta correttamente, resultCode
contiene il valore di Activity.RESULT_OK
.