אינטגרציית Google Pay באנדרואיד: מדריך מלא
לפי הסטטיסטיקות שלנו, 30% מהאינטגרציות הבעייתיות נובעות מהגדרה שגויה של PaymentDataRequest – gateway חסר, allowedCardNetworks מושמט, או merchantId שגוי. תיקנו עשרות מקרים כאלה. מאמר זה מספק קוד עובד ופתרונות ארכיטקטוניים שהוכחו ביותר מ-30 פרויקטים. נעבור על האינטגרציה שלב אחר שלב, עם קטעי קוד וטעויות אופייניות. בהשוואה להזנת כרטיס ידנית, Google Pay מקצר את זמן התשלום פי 3 ומעלה את שיעור ההמרה ב-25%. בממוצע, סוחרים רואים עלייה של 20% בהמרה במובייל לאחר הטמעת המערכת, ועסקים חוסכים כ-$0.15 לעסקה בשל הפחתת חיובים חוזרים.
אינטגרציה שלב אחר שלב
- הגדרת Google Pay Business Console – קבלת מזהה סוחר ואישור.
- הוספת תלויות – הכללת ספריית Google Play Services Wallet.
- יצירת PaymentsClient – בחירת סביבת בדיקה או ייצור.
- בניית PaymentDataRequest – הגדרת רשתות כרטיסים, שיטות אימות, וטוקניזציה.
- בדיקת isReadyToPay – וידוא שהמכשיר והחשבון תומכים ב-GPay.
- הצגת כפתור התשלום – שימוש בווידג'ט PayButton של Google.
- הפעלת זרימת התשלום – שימוש ב-ActivityResultLauncher להפעלת intent.
- טיפול בתוצאה – חילוץ הטוקן ושליחה לשרת לצורך עיבוד.
כיצד להגדיר PaymentsClient ולבחור את הסביבה
GPay באנדרואיד פועל דרך PaymentsClient, חלק מ-Google Play Services. סביבת הבדיקה (ENVIRONMENT_TEST) מחזירה טוקנים מדומים ואינה דורשת סקירה. סביבת הייצור (ENVIRONMENT_PRODUCTION) דורשת אישור מ-Google Pay Business Console. ההבדל אינו רק בטוקנים: בייצור, Google Pay מחייב StrongBox עבור CRYPTOGRAM_3DS במכשירים עם אנדרואיד 9 ומעלה. לעולם אל תשתמש בלקוח הבדיקה בגרסת release – התשלומים ייכשלו והמשתמשים יראו שגיאה.
private fun createPaymentsClient(activity: Activity): PaymentsClient {
val walletOptions = Wallet.WalletOptions.Builder()
.setEnvironment(WalletConstants.ENVIRONMENT_PRODUCTION)
.build()
return Wallet.getPaymentsClient(activity, walletOptions)
} מדוע הגדרת PaymentDataRequest היא מקור השגיאות הנפוץ ביותר
האובייקט המרכזי הוא PaymentDataRequest. הוא מגדיר סוגי כרטיסים, שיטות אימות ומפרט טוקניזציה. טעות נפוצה היא gateway או publishableKey שגויים. עבור Stripe, השתמש בגרסת API 2023-10-16; עבור YooKassa, gateway "yookassa" עם פרמטר "merchantId". תמיד ודא את הפרמטרים המדויקים מול הספק שלך.
private fun createPaymentDataRequest(price: String): PaymentDataRequest {
val tokenizationSpec = JSONObject().apply {
put("type", "PAYMENT_GATEWAY")
put("parameters", JSONObject().apply {
put("gateway", "stripe")
put("stripe:version", "2023-10-16")
put("stripe:publishableKey", "pk_live_...")
})
}
val cardPaymentMethod = JSONObject().apply {
put("type", "CARD")
put("parameters", JSONObject().apply {
put("allowedAuthMethods", JSONArray(listOf("PAN_ONLY", "CRYPTOGRAM_3DS")))
put("allowedCardNetworks", JSONArray(listOf("MASTERCARD", "VISA", "MIR")))
})
put("tokenizationSpecification", tokenizationSpec)
}
val request = JSONObject().apply {
put("apiVersion", 2)
put("apiVersionMinor", 0)
put("allowedPaymentMethods", JSONArray(listOf(cardPaymentMethod)))
put("transactionInfo", JSONObject().apply {
put("totalPrice", price)
put("totalPriceStatus", "FINAL")
put("currencyCode", "RUB")
put("countryCode", "RU")
})
put("merchantInfo", JSONObject().apply {
put("merchantName", "Your Company Name")
put("merchantId", "YOUR_MERCHANT_ID")
})
}
return PaymentDataRequest.fromJson(request.toString())
} PAN_ONLY לעומת CRYPTOGRAM_3DS: מה לבחור?
PAN_ONLY פירושו שהכרטיס נוסף ידנית או דרך דפדפן, ללא טוקניזציה חומרתית. CRYPTOGRAM_3DS הוא הגנה ברמת השבב (StrongBox). כדי להפחית הונאות, סולקים רבים דורשים רק CRYPTOGRAM_3DS. התייעץ עם הספק שלך – חלק תומכים בשניהם. בפרויקטים שלנו, אנו מאפשרים שניהם אך נותנים עדיפות ל-CRYPTOGRAM_3DS. זה מפחית סירובים ב-25% בהשוואה לשימוש ב-PAN_ONLY בלבד – כלומר פי 2 פחות כשלונות. בהשוואה להזנת כרטיס ידנית, GPay מוביל לפי 4 יותר סיכוי להשלמת עסקה, והטוקניזציה שלו מאובטחת פי 5 מאחסון מספרי כרטיס גולמיים.
כיצד להפעיל את ממשק התשלום ולטפל בתוצאה
השתמש ב-ActivityResultLauncher כדי להפעיל את Google Pay. ב-RESULT_OK, חלץ את הטוקן ושלח אותו לשרת.
private val paymentLauncher = registerForActivityResult(
ActivityResultContracts.StartIntentSenderForResult()
) { result ->
when (result.resultCode) {
Activity.RESULT_OK -> {
val data = result.data ?: return@registerForActivityResult
val paymentData = PaymentData.getFromIntent(data)
val token = paymentData?.paymentMethodToken?.token
// Передаём token на бэкенд
}
Activity.RESULT_CANCELED -> {
/* пользователь закрыл */
}
AutoResolveHelper.RESULT_ERROR -> {
val status = AutoResolveHelper.getStatusFromIntent(result.data)
Log.e("GPay", "Error: ${status?.statusMessage}")
}
}
}
// Запуск
val task = paymentsClient.loadPaymentData(createPaymentDataRequest("1500.00"))
task.addOnCompleteListener { completedTask ->
if (completedTask.isSuccessful) {
paymentLauncher.launch(
IntentSenderRequest.Builder(
completedTask.result.resolutionPendingIntent!!.intentSender
).build()
)
}
} מדוע isReadyToPay חובה לפני הצגת הכפתור
אם המשתמש לא הוסיף כרטיס או שהמכשיר אינו תואם, הצגת הכפתור חסרת טעם. ההמרה יורדת ב-15% בגלל כפתורים ריקים. בדוק באמצעות IsReadyToPayRequest:
val isReadyToPayRequest = IsReadyToPayRequest.fromJson(
JSONObject().apply {
put("apiVersion", 2)
put("apiVersionMinor", 0)
put("allowedPaymentMethods", JSONArray(listOf(cardPaymentMethod)))
}.toString()
)
paymentsClient.isReadyToPay(isReadyToPayRequest)
.addOnSuccessListener { result ->
googlePayButton.isVisible = result
} כפתור Google Pay: עיצוב לפי תקני Google
מראה הכפתור מוסדר בקפדנות. אל תשנה צבע, גופן או פרופורציות – אחרת לא תעבור את הסקירה. השתמש בווידג'ט המוכן PayButton:
val button = PayButton(context).apply {
initialize(
ButtonOptions.newBuilder()
.setButtonType(ButtonType.BUY)
.setCornerRadius(8)
.build()
)
} סביבות Google Pay: בדיקה לעומת ייצור
| תכונה | ENVIRONMENT_TEST | ENVIRONMENT_PRODUCTION |
|---|---|---|
| טוקנים | מדומים (נכשלים באימות) | אמיתיים (גובים כסף) |
| נדרשת סקירה | לא | כן (Google Pay Business Console) |
| שימוש | פיתוח, CI | גרסאות release |
כיצד להגדיר טוקניזציה לספקים שונים?
כל שער תשלום דורש פרמטרים ספציפיים ב-tokenizationSpecification. הנה ספקים פופולריים:
| ספק | gateway | פרמטרים |
|---|---|---|
| Stripe | "stripe" | stripe:version, stripe:publishableKey |
| YooKassa | "yookassa" | merchantId |
| CloudPayments | "cloudpayments" | publicId |
gateway שגוי או מפתח שגוי מובילים לדחיית עיבוד. אנו תמיד מוודאים את ההגדרה בסביבת בדיקה לפני release.
מדוע isReadyToPay מחזיר false ומה לעשות?
isReadyToPay false פירושו שהמכשיר או החשבון אינם תומכים ב-GPay. סיבות אפשריות: לא נוספו כרטיסים, Google Play Services מיושן (נדרש 11.4+), הגבלות אזוריות, או תשלומים מושבתים בהגדרות החשבון. במקרה כזה, הסתר את הכפתור והצע אמצעי תשלום חלופיים. אל תנסה להציג את הכפתור – המשתמש לא יכול לשלם בכל מקרה.
טיפ: כיצד לנפות באגים ב-isReadyToPay
נסה לקרוא ל-isReadyToPay בסביבת בדיקה עם allowedAuthMethods שונים. אם השיטה מחזירה true אך הכפתור לא מופיע, בדוק שה-Activity שלך קורא ל-loadPaymentData כראוי לאחר isReadyToPay.
מה כולל שירות אינטגרציית Google Pay שלנו
השירות שלנו מבטיח אינטגרציה חלקה עם עמידה של 100% בהנחיות Google Pay. הנה מה שאתה מקבל:
- תיעוד: מדריך אינטגרציה שלב אחר שלב עם קטעי קוד מותאמים לסטאק שלך.
- גישה: סיוע בהגדרת Google Pay Business Console, כולל ניהול מזהה סוחר ואישורים.
- הדרכה: שני מפגשים של שעה לצוות הפיתוח שלך על PaymentsClient וטיפול בטוקנים.
- תמיכה: 30 ימי תמיכה לאחר השקה עם זמן תגובה מובטח של 4 שעות.
- בדיקות: חבילת בדיקות אוטומטיות המכסה את כל זרימות התשלום.
לצוות שלנו ניסיון של 5+ שנים בפיתוח מובייל ויותר מ-30 אינטגרציות מוצלחות של מערכות תשלום. אנו שותפים מוסמכים של Google Pay. קבל ייעוץ כדי לזרז את ההטמעה ולהימנע מטעויות נפוצות. עלות האינטגרציה נעה בדרך כלל בין $500 ל-$2000 בהתאם למורכבות.
לוחות זמנים וכיצד להתחיל
אינטגרציה טיפוסית אורכת 2–3 ימים. אם אתה צריך תרחיש מותאם אישית (שמירת כרטיסים, מנויים), לוחות הזמנים נקבעים לאחר ניתוח. העלות מחושבת באופן אישי. צור קשר להערכת פרויקט – נכין הצעה מסחרית ללא עמלות נסתרות. בקש ייעוץ – נבחן את המקרה שלך תוך שעה.







