אחרי שתיצרו כרטיס ותקודדו אותו ב-JWT, תוכלו להנפיק אותו באפליקציה ל-Android. כדי לעשות זאת, עליך לבדוק ש-Google Wallet API זמין במכשיר של המשתמש ולהציג לו את האפשרות 'הוספה ל-Google Wallet'. ולאחר מכן לשמור את הכרטיס ב-Google Wallet אחרי שהוא מקיש על הלחצן.
דרישות מוקדמות
לפני שתנסו להנפיק כרטיס, ודאו שהשלמתם את הפעולות הבאות:
- השלמת את כל השלבים במדריך ההדרכה למשתמשים חדשים.
- צריך ליצור כיתה אחת לפחות.
- יוצרים לפחות אובייקט 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. בדוק את הזמינות של Google Wallet API
לפני ששומרים את האובייקט החדש, צריך לוודא ש-Google Wallet API
זמין במכשיר היעד על ידי הפעלה של השיטה getPayApiAvailabilityStatus
במחלקה PayClient
.
בתור התחלה, מוסיפים משתנה חבר פעילות שבה תציג את הלחצן ותפעיל אותו כשהפעילות נוצר:
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, להציב לוגיקה עסקית שקשורה לממשק המשתמש בפעילות או במקטע (למשל: רכיבי ממשק משתמש, תוצאת הפעילות) והלוגיקה התפעולית במודל התצוגה המפורטת (למשל: לקוח) יצירת אובייקטים או טריגרים לשיחת רשת).
אחר כך משתמשים ב-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 Services לא עדכניות, או ש-Google Wallet לא זמינות במדינה של המשתמש.
אם ה-API לא זמין כדאי להסתיר את הלחצן ולחזור לשילוב אחר (למשל, באמצעות קישור JWT). הערה: יכול להיות שהמשתמש יהיה זכאי להשתמש ב-API בעתיד.
3. הוספת האפשרות 'הוספה ל-Google Wallet' לחצן
ב-Google Wallet יש לחצן מוכר שבו אפשר להשתמש כדי להפעיל את הוסף לתהליך של Google Wallet באפליקציה. נכסים וקטוריים של הלחצן הם זמינה הנחיות לגבי לחצנים.
אפשר לייבא נכסי וקטורים ב-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 Wallet של המשתמש
אפשר להוסיף את TransitObject
על ידי העברת JWT לא חתום ל-method savePasses
.
ניתן להתחיל את פעולת ההוספה כתוצאה מלחיצה על 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
}
טיפול בתוצאות
ה-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
.