创建卡券并将其编码到 JWT 后,您就可以在 Android 应用中发出该卡券了。为此,您需要检查 Google Wallet API 在用户设备上是否可用,然后向他们显示“添加到 Google 钱包”按钮,然后在用户点按该按钮后将卡券保存到 Google 钱包。
前提条件
在尝试发放卡券之前,请确保您已完成以下操作:
。1. 安装 Google 钱包 Android SDK
如需使用 Google Wallet Android SDK,请将 com.google.android.gms:play-services-pay
添加到应用级 build.gradle
文件的 dependencies
部分:
implementation "com.google.android.gms:play-services-pay:16.5.0"
2. 检查 Google Wallet API 的可用性
在保存新对象之前,请确保已安装了 Google Wallet API
。getPayApiAvailabilityStatus
PayClient
首先将成员变量添加到 您将在该 activity 中显示该按钮,并在 activity 被 创建时间:
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
}
如果您使用的是其他设计模式,请考虑适当地放置特定于网域的业务逻辑。例如,如果您使用的是 MVVM 模式, 将与界面相关的业务逻辑放在您的 activity 或 fragment 中(例如:界面元素 活动结果),以及视图模型中的操作逻辑(例如 实例化、网络调用触发器)。
接下来,使用 PayClient
检查 API 是否可用:
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
});
}
最后,当需要确定 API 的可用性时,请调用您刚刚在应用中定义的方法。
在 API 不可用时处理
该 API 不可用的一些原因包括:Android 或 Google Play 服务版本过旧,或 Google 钱包版本太旧 在用户所在的国家/地区不可用。
如果该 API 不可用 您可以考虑隐藏该按钮并回退到其他集成(例如, 使用 JWT 链接)。请注意,该用户将来可能有资格使用该 API。
3. 将“添加到 Google 钱包”按钮
Google 电子钱包提供了一个熟悉的按钮,您可以使用该按钮触发 在您的应用中“添加到 Google 钱包”流程。该按钮的矢量资源为 可在 按钮指南。
您可以在 Android Studio 中的 File > New > Vector Asset
下导入矢量资源。选择“本地文件”在向导中,添加一个名称(例如:
add_to_google_wallet_button.xml
)并从本地硬盘找到该文件,然后将其导入。
现在,您可以使用导入的可绘制对象将按钮添加到界面中:
<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
为 48dp,宽度必须至少为 200dp。
4. 将卡券添加到用户的 Google 钱包
您可以通过将未签名的 JWT 传递给 savePasses
方法来添加 TransitObject
。
点击 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
}
结果处理
savePasses
方法会触发保存流程,并调用
onActivityResult
方法。onActivityResult
的实现应与以下代码类似:
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
}
}
}
}
成功添加卡券后,resultCode
会包含 Activity.RESULT_OK
的值。