После создания пропуска и его кодирования в JWT, вы готовы выпустить его в своем Android-приложении. Для этого вам нужно убедиться, что API Google Wallet доступен на устройстве пользователя, показать ему кнопку «Добавить в Google Wallet», а затем сохранить пропуск в его Google Wallet после нажатия этой кнопки.
Предварительные требования
Прежде чем пытаться выдать пропуск, убедитесь, что вы выполнили следующие действия:
- Выполнены все шаги, описанные в руководстве по адаптации .
- Создайте как минимум один класс 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
}Если вы используете другие шаблоны проектирования, подумайте о том, как правильно разместить бизнес-логику, специфичную для предметной области. Например, если вы используете шаблон MVVM, разместите бизнес-логику, связанную с пользовательским интерфейсом, в Activity или Fragment (например, элементы пользовательского интерфейса, результат действия), а операционную логику — в ViewModel (например, создание экземпляра клиента, запуск сетевых вызовов).
Далее, используйте 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 в вашем приложении. Векторные изображения кнопки доступны в руководстве по использованию кнопок .
В Android Studio можно импортировать векторные ресурсы через меню File > New > Vector Asset . В мастере выберите «Локальный файл», задайте имя (например: add_to_google_wallet_button.xml ) и найдите файл на локальном диске для импорта.
Теперь вы можете использовать импортированный ресурс 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
}Обработка результатов
Метод savePasses запускает процесс сохранения и вызывает метод onActivityResult после его завершения. Реализация метода onActivityResult должна быть аналогична следующей:
Котлин
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 .

