Po utworzeniu karty i zakodowaniu jej w formacie JWT możesz ją wydać w aplikacji na Androida. Aby to zrobić, sprawdź, czy interfejs Google Wallet API jest dostępny na urządzeniu użytkownika, wyświetl przycisk „Dodaj do Portfela Google”, a gdy użytkownik go kliknie, zapisz kartę w Portfelu Google.
Wymagania wstępne
Zanim spróbujesz wydać kartę, wykonaj te czynności:
- Wykonano wszystkie czynności opisane w przewodniku po rejestracji.
- Utwórz co najmniej 1 klasę z przeszklonieniami.
- Utwórz co najmniej 1 obiekt Paszportów.
- Zakoduj klasę kart i obiekt kart w tokenie JWT.
1. Instalowanie pakietu SDK Portfel Google na Androida
Aby korzystać z pakietu SDK Portfela Google na Androida, dodaj element com.google.android.gms:play-services-pay
do sekcji dependencies
w pliku build.gradle
na poziomie aplikacji:
implementation "com.google.android.gms:play-services-pay:16.5.0"
2. Sprawdzanie dostępności Google Wallet API
Zanim zapiszesz nowy obiekt, upewnij się, że interfejs Google Wallet API jest dostępny na urządzeniu docelowym. Aby to sprawdzić, wywołaj metodę getPayApiAvailabilityStatus
w klasie PayClient
.
Najpierw dodaj zmienną członkowską do aktywności, w której będziesz wyświetlać przycisk, i utwórz jego instancję po utworzeniu aktywności:
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
}
Jeśli używasz innych wzorów projektowania, zastanów się, gdzie umieścić logikę biznesową związaną z danym domeną. Jeśli na przykład używasz wzorca MVVM, umieść logikę biznesową związaną z UI w aktywności lub fragmencie (np. elementy interfejsu użytkownika, wyniki działania i logika operacyjna w Twoim modelu widoku (np. wywoływanie klienta, wywołania sieci).
Następnie użyj PayClient
, aby sprawdzić, czy interfejs API jest dostępny:
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
});
}
Na koniec, gdy chcesz określić dostępność interfejsu API, wywołaj metodę zdefiniowaną w aplikacji.
Obsługa sytuacji, gdy interfejs API jest niedostępny
Interfejs API może być niedostępny z różnych powodów, np. ze względu na nieaktualne wersje usług Androida lub Google Play albo niedostępność Portfela Google w kraju użytkownika.
Jeśli interfejs API jest niedostępny, rozważ ukrycie przycisku i przejście na inną integrację (np. za pomocą linku JWT). Pamiętaj, że użytkownik może w przyszłości uzyskać uprawnienia do korzystania z interfejsu API.
3. Dodawanie przycisku „Dodaj do Portfela Google”
Portfel Google udostępnia znajomy przycisk, za pomocą którego możesz wywołać w aplikacji proces „Dodaj do Portfela Google”. Zasoby wektorowe przycisku znajdziesz we wytycznych dotyczących przycisku.
Zasoby wektorowe możesz importować w Android Studio w sekcji File > New > Vector Asset
. W kreatorze wybierz „Plik lokalny”, dodaj nazwę (np.
add_to_google_wallet_button.xml
) i znajdź plik na dysku lokalnym, aby go zaimportować.
Teraz możesz użyć zaimportowanego obiektu graficznego, aby dodać przycisk do interfejsu użytkownika:
<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" />
Przycisk ma parametr layout_height
48 dp i musi mieć co najmniej 200 dp szerokości.
4. Dodawanie dokumentu do Portfela Google użytkownika
TransitObject
można dodać, przekazując nieprzypisany token JWT do metody savePasses
.
Operację dodawania możesz rozpocząć, klikając przycisk Portfela Google.
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
}
Obsługa wyników
Metoda savePasses
uruchamia proces zapisywania i po jego zakończeniu wywołuje metodę onActivityResult
. Implementacja onActivityResult
powinna wyglądać mniej więcej tak:
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
}
}
}
}
Gdy karta zostanie dodana, parametr resultCode
będzie zawierać wartość Activity.RESULT_OK
.