Once you've created a pass and encoded it in a JWT, you are ready to issue it in your Android app. To do this, you will need to check that the Google Wallet API is available on the user's device, present them with an 'Add to Google Wallet' button, then save the pass to their Google Wallet once they tap the button.
Предварительные требования
Прежде чем пытаться выдать пропуск, убедитесь, что вы выполнили следующие действия:
- Выполнены все шаги, описанные в руководстве по адаптации .
- Создайте как минимум один класс Passes .
- Создайте как минимум один объект Passes .
- Закодируйте класс Passes и объект Passes в формате JWT.
1. Установите Android SDK Google Wallet.
Чтобы использовать Android SDK Google Wallet, добавьте com.google.android.gms:play-services-pay в раздел dependencies файла build.gradle на уровне приложения:
implementation "com.google.android.gms:play-services-pay:16.5.0"
2. Проверьте доступность API Google Wallet.
Перед сохранением нового объекта убедитесь, что API Google Wallet доступен на целевом устройстве, вызвав метод getPayApiAvailabilityStatus в классе PayClient .
Для начала добавьте в активность переменную-член, в которой будет отображаться кнопка, и создайте её экземпляр при создании активности:
Котлин
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
}If you are using other design patterns consider placing domain specific business logic appropriately. For example, if you are using the MVVM pattern, place UI related business logic in your Activity or Fragment (eg.: UI elements, activity result), and operational logic in your view model (eg.: client instantiation, network call triggers).
Далее, используйте PayClient , чтобы проверить, доступен ли API:
Котлин
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
});
}Наконец, вызовите только что определенный вами метод в вашем приложении, когда вам потребуется определить доступность API.
Обрабатывать ситуацию, когда API недоступен.
Среди причин недоступности API могут быть устаревшие версии сервисов Android или Google Play, а также недоступность Google Wallet в стране пользователя.
Если API недоступен, рассмотрите возможность скрыть кнопку и использовать другую интеграцию (например, ссылку JWT ). Обратите внимание, что пользователь может получить доступ к API в будущем.
3. Добавьте кнопку «Добавить в Google Wallet».
Google Wallet предоставляет привычную кнопку, которую можно использовать для запуска процесса добавления товара в Google Wallet в вашем приложении. Векторные изображения кнопки доступны в руководстве по использованию кнопок .
You can import vector assets in Android Studio under File > New > Vector Asset . Select "Local file" in the wizard, add a name (eg.: add_to_google_wallet_button.xml ) and locate the file in your local drive to import it.
Теперь вы можете использовать импортированный ресурс drawable, чтобы добавить кнопку в пользовательский интерфейс:
<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" />
Кнопка имеет layout_height 48 dp и должна быть шириной не менее 200 dp.
4. Добавить пароль в Google Wallet пользователя.
Добавить GiftCardObject можно, передав в метод savePasses неподписанный JWT-токен. Операция добавления начинается с нажатия кнопки Google Wallet.
Котлин
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
}Обработка результатов
The savePasses method triggers the save flow and invokes the onActivityResult method after the save flow has completed. The implementation of onActivityResult should be similar to the following:
Котлин
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
}
}
}
} После успешного добавления прохода значение поля resultCode будет содержать значение Activity.RESULT_OK .

