שילוב כרטיסים ל-Google Wallet עבור אפליקציות אנדרואיד

מבקרים מאבדים כרטיסים באימייל ובהודעות, מה שגורם לכאוס בכניסה ולהעמסה על התמיכה. אנו משלבים את Google Wallet באפליקציית האנדרואיד שלכם כך שהכרטיסים תמיד בהישג יד על מסך הסמארטפון. הצוות שלנו מספק את הפרויקט במפתח מלא—מהגדרת הצד השרת ועד לשמירה ועדכון הכרטיסים בארנק—ומבטיח פעולה אמינה ותמיכה מתמשכת.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
שילוב כרטיסים ל-Google Wallet עבור אפליקציות אנדרואיד
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

הוספת כרטיסים ל-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: שלב אחר שלב

  1. הגדרת שרת. צרו חשבון שירות ב-Google Cloud Console עם תפקיד Wallet Object Issuer. קבלו את מזהה המנפיק שלכם מ-Google Pay & Wallet Console.
  2. יצירת JWT. השרת יוצר אסימון JWT עם נתוני הכרטיס, חתום עם המפתח הפרטי. האסימון תקף לשעה אחת.
  3. העברת האסימון לאפליקציה. האפליקציה מקבלת את ה-JWT דרך API או בתגובת הרכישה.
  4. בדיקת זמינות הארנק. השתמשו ב-PayApiAvailabilityStatus כדי לקבוע אם Google Wallet מותקן במכשיר.
  5. הצגת הכפתור. אם הארנק זמין, הציגו את הכפתור הרשמי "הוסף ל-Google Wallet".
  6. שמירת הכרטיס. בלחיצה, קראו ל-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 עוד היום.