הוספת כרטיסים ל-Google Wallet מאפליקציית אנדרואיד
תארו לעצמכם: משתתף בהופעה ניגש לכניסה, שולף את הטלפון, ומסך הנעילה כבר מציג את קוד ה-QR לכרטיס שלו. ללא קבצי PDF, מיילים או תורים. אחד הלקוחות שלנו — מארגן פסטיבל מוזיקה — נתקל בבעיה: 20% מהמבקרים לא הצליחו למצוא את הכרטיסים שלהם במייל או בהודעות. לאחר הטמעת Google Wallet, פניות התמיכה ירדו ב-40%. נעזור לכם לשלב זאת באפליקציה הניידת שלכם: השרת מייצר JWT, האפליקציה שומרת את הכרטיס לארנק, והסטטוס מתעדכן בזמן אמת. עם ניסיון של למעלה מחמש שנים בשירותי תשלום, אנו מבטיחים איכות.
כיצד Google Wallet עובד עבור כרטיסים
Google Wallet משתמש בשני אובייקטים: EventTicketClass (תבנית אירוע) ו-EventTicketObject (כרטיס ספציפי). השרת יוצר אסימון JWT עם נתוני הכרטיס, החתום על ידי חשבון שירות של Google. האפליקציה מעבירה אסימון זה ל-Wallet API, והמשתמש רואה כפתור "הוסף ל-Google Wallet". לאחר השמירה, הכרטיס מופיע בארנק גם במצב לא מקוון.
למה Google Wallet אמין יותר מכרטיסי PDF
כרטיסי PDF קל לאבד, לזייף או לשכוח. Google Wallet מאחסן כרטיסים בכספת מאובטחת הנגישה ללא אינטרנט. ניתן לעדכן את הסטטוס בזמן אמת: לסמן כרטיס כמשומש בכניסה או לשנות מושב. זה מגביר אבטחה ונוחות — משתמשים לא מחפשים בתיקיות ספאם. לפי תיעוד Google Wallet API, כל הנתונים מועברים בערוץ מוצפן.
כיצד להוסיף כרטיס ל-Google Wallet: שלב אחר שלב
- הגדרת שרת. צרו חשבון שירות ב-Google Cloud Console עם תפקיד
Wallet Object Issuer. קבלו את מזהה המנפיק שלכם מ-Google Pay & Wallet Console. - יצירת JWT. השרת יוצר אסימון JWT עם נתוני הכרטיס, חתום עם המפתח הפרטי. האסימון תקף לשעה אחת.
- העברת האסימון לאפליקציה. האפליקציה מקבלת את ה-JWT דרך API או בתגובת הרכישה.
- בדיקת זמינות הארנק. השתמשו ב-
PayApiAvailabilityStatusכדי לקבוע אם Google Wallet מותקן במכשיר. - הצגת הכפתור. אם הארנק זמין, הציגו את הכפתור הרשמי "הוסף ל-Google Wallet".
- שמירת הכרטיס. בלחיצה, קראו ל-
savePassesViaIntentעם ה-JWT. המשתמש מאשר — הכרטיס מופיע בארנק.
דוגמה ליצירת JWT בפייתון
import jwt
from google.oauth2 import service_account
import json
def create_event_ticket_jwt(event_id: str, ticket_id: str, holder_name: str, seat: str) -> str:
credentials = service_account.Credentials.from_service_account_file(
'service-account.json',
scopes=['https://www.googleapis.com/auth/wallet_object.issuer']
)
issuer_id = "YOUR_ISSUER_ID" # из Google Pay & Wallet Console
class_suffix = f"event_{event_id}"
object_suffix = f"ticket_{ticket_id}"
ticket_object = {
"id": f"{issuer_id}.{object_suffix}",
"classId": f"{issuer_id}.{class_suffix}",
"state": "ACTIVE",
"barcode": {
"type": "QR_CODE",
"value": ticket_id,
"alternateText": ticket_id[:8]
},
"ticketHolderName": holder_name,
"seatInfo": {
"seat": {"defaultValue": {"language": "ru", "value": seat}},
"row": {"defaultValue": {"language": "ru", "value": "A"}},
},
"reservationInfo": {
"confirmationCode": ticket_id[:8].upper()
},
"heroImage": {
"sourceUri": {"uri": "https://yourapp.com/event-banner.jpg"}
}
}
payload = {
"iss": credentials.service_account_email,
"aud": "google",
"typ": "savetowallet",
"iat": int(time.time()),
"origins": ["https://yourapp.com"],
"payload": {
"eventTicketObjects": [ticket_object]
}
}
token = jwt.encode(payload, credentials._private_key_pkcs8_pem, algorithm="RS256")
return token
אסימון ה-JWT תקף לשעה אחת ומועבר לאפליקציה כמחרוזת.
קוד אנדרואיד (Kotlin)
// build.gradle
implementation("com.google.android.gms:play-services-wallet:19.3.0")
class TicketActivity : AppCompatActivity() {
private val walletClient by lazy {
Wallet.getWalletClient(
this,
WalletOptions.Builder()
.setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION)
.build()
)
}
private val addToWalletLauncher = registerForActivityResult(
ActivityResultContracts.StartIntentSenderForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> showSuccess()
RESULT_CANCELED -> {
/* пользователь отменил */
}
else -> showError()
}
}
fun addTicketToWallet(jwt: String) {
val request = SavePassesRequest.newBuilder()
.setJwt(jwt)
.build()
walletClient.savePassesViaIntent(request) { apiResult ->
apiResult.intentSender?.let { intentSender ->
addToWalletLauncher.launch(
IntentSenderRequest.Builder(intentSender).build()
)
}
}
}
}השתמשו ברכיב הרשמי לפי ההנחיות של Google:
<com.google.android.gms.wallet.button.PayButton
android:id="@+id/addToWalletButton"
android:layout_width="match_parent"
android:layout_height="48dp"
app:allowedAuthMethods="PAN_ONLY|CRYPTOGRAM_3DS"
app:buttonType="addToGoogleWallet" />לפני הצגת הכפתור, בדקו את זמינות הארנק:
walletClient.getPayApiAvailabilityStatus(
PayApiAvailabilityStatusRequest.newBuilder()
.setRequestType(PayApiAvailabilityStatusRequest.RequestType.SAVE_PASSES)
.build()
).addOnSuccessListener { status ->
if (status.isAvailable) {
addToWalletButton.isVisible = true
}
} מה דרוש כדי להתחיל אינטגרציה?
כדי להתחיל, תצטרכו:
- גישה ל-Google Cloud Console ליצירת חשבון שירות.
- מזהה מנפיק מ-Google Pay & Wallet Console.
- שרת ליצירת JWT (נקודת קצה אחת מספיקה).
- אפליקציה ניידת עם יכולת להוסיף כפתור.
מידע נוסף על הגדרת חשבון שירות
חשבון השירות נוצר בסעיף IAM של Google Cloud Console. הקצו לו את התפקיד `Wallet Object Issuer`. לאחר היצירה, הורידו את מפתח ה-JSON, המשמש בשרת לחתימת JWTs. ודאו שהמפתח מאוחסן בצורה מאובטחת ואינו נכלל במאגרי קוד.עדכון כרטיס לאחר הנפקה
אם יש צורך לשנות את קוד ה-QR או הסטטוס (למשל, ל"משומש"), שלחו בקשת PATCH:
from googleapiclient.discovery import build
service = build('walletobjects', 'v1', credentials=credentials)
service.eventticketobject().patch(
resourceId=f"{issuer_id}.{object_suffix}",
body={"state": "COMPLETED"} # билет использован
).execute()השינויים חלים בזמן אמת על כל מכשירי המשתמשים.
השוואה: Google Wallet לעומת כרטיסי PDF
| תכונה | Google Wallet | כרטיס PDF |
|---|---|---|
| זמינות לא מקוונת | כן | לא (נדרש קובץ) |
| עדכוני סטטוס | זמן אמת | בלתי אפשרי |
| הגנה מפני זיוף | חתימה קריפטוגרפית | קל לזייף |
| נוחות למשתמש | אוטומטית בטלפון | יש לחפש במייל |
| אינטגרציית התראות Push | כן | לא |
השוואה: EventTicketClass לעומת EventTicketObject
| ישות | מטרה | דוגמה |
|---|---|---|
import jwt from google.oauth2 import service_account import json def create_event_ticket_jwt(event_id: str, ticket_id: str, holder_name: str, seat: str) -> str: credentials = service_account.Credentials.from_service_account_file( 'service-account.json', scopes=['https://www.googleapis.com/auth/wallet_object.issuer'] ) issuer_id = "YOUR_ISSUER_ID" # из Google Pay & Wallet Console class_suffix = f"event_{event_id}" object_suffix = f"ticket_{ticket_id}" ticket_object = { "id": f"{issuer_id}.{object_suffix}", "classId": f"{issuer_id}.{class_suffix}", "state": "ACTIVE", "barcode": { "type": "QR_CODE", "value": ticket_id, "alternateText": ticket_id[:8] }, "ticketHolderName": holder_name, "seatInfo": { "seat": {"defaultValue": {"language": "ru", "value": seat}}, "row": {"defaultValue": {"language": "ru", "value": "A"}}, }, "reservationInfo": { "confirmationCode": ticket_id[:8].upper() }, "heroImage": { "sourceUri": {"uri": "https://yourapp.com/event-banner.jpg"} } } payload = { "iss": credentials.service_account_email, "aud": "google", "typ": "savetowallet", "iat": int(time.time()), "origins": ["https://yourapp.com"], "payload": { "eventTicketObjects": [ticket_object] } } token = jwt.encode(payload, credentials._private_key_pkcs8_pem, algorithm="RS256") return token |
תבנית אירוע: שם, לוגו, צבע, מיקום | הופעה "פסטיבל רוק" |
// build.gradle implementation("com.google.android.gms:play-services-wallet:19.3.0") class TicketActivity : AppCompatActivity() { private val walletClient by lazy { Wallet.getWalletClient( this, WalletOptions.Builder() .setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION) .build() ) } private val addToWalletLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult() ) { result -> when (result.resultCode) { RESULT_OK -> showSuccess() RESULT_CANCELED -> { /* пользователь отменил */ } else -> showError() } } fun addTicketToWallet(jwt: String) { val request = SavePassesRequest.newBuilder() .setJwt(jwt) .build() walletClient.savePassesViaIntent(request) { apiResult -> apiResult.intentSender?.let { intentSender -> addToWalletLauncher.launch( IntentSenderRequest.Builder(intentSender).build() ) } } } } |
כרטיס אישי: מושב, שם מחזיק, קוד QR | כרטיס #1234, שורה 5, מושב 10 |
ציר זמן ועלות
זמן משוער: 2–3 ימים. העלות המדויקת נקבעת לאחר ביקורת על הפרויקט שלכם. נעריך את הפרויקט שלכם תוך יום לאחר פנייתכם. צרו קשר לייעוץ.
סיכום
אינטגרציית Google Wallet היא לא רק נוחות למשתמש אלא גם ערוץ תקשורת נוסף: ניתן לעדכן כרטיסים, לשנות מושבים או לבטלם לחלוטין. הניסיון שלנו מבטיח יישום מהיר ואיכותי. אם אתם רוצים לשפר את חוויית המשתמש ולהגביר את האבטחה — צרו קשר. נבצע ביקורת על הפרויקט שלכם ונציע את הפתרון הטוב ביותר. הזמינו אינטגרציית Google Wallet עוד היום.







