מדריך אינטגרציה לתשלומים ניידים של T-Kassa: iOS ו-Android מקורי
חשוב על זה: כשהלקוח לוחץ על "שלם" והאפליקציה קופאת על מסך ריק — זו קטסטרופה. מעבר מתשלום מבוסס WebView לאינטגרציה מקורית של T-Kassa יכול לחסוך לעסקים 5,000–20,000 דולר בחודש בהכנסות אבודות עקב המרה גבוהה יותר. הצוות שלנו שילב את T-Kassa (לשעבר Tinkoff Cash Desk) ביותר מ-50 פרויקטים עם קהלים של 1,000 עד 100,000 משתמשים בחמש השנים האחרונות. להלן תכנית מוכחת שעובדת מהניסיון הראשון.
למה לבחור באינטגרציה מקורית של T-Kassa?
T-Kassa מספקת SDK מקורי מוכן ל-iOS ו-Android. בניגוד לעטיפות WebView, מסך התשלום המקורי נטען תוך פחות משנייה אחת (פי 2–5 מהר יותר מ-WebView), תומך ב-Face ID/Touch ID לאימות, ומטפל נכון בהחזרות לאחר תשלום. ה-SDK כולל גם הגנה מפני הונאה וממלא אוטומטית כרטיסים שמורים. זה מניב המרת תשלום גבוהה ב-20–30% מהגרסה מבוססת הדפדפן — שיפור של פי 2–3. לפי תיעוד רשמי של Tinkoff Acquiring SDK, הגישה המקורית ממזערת את מספר הצעדים של המשתמש.
איך הזרימה המרכזית עובדת?
T-Kassa משתמשת בתכנית דו-שלבית: ראשית השרת מאתחל את התשלום (אתחול בצד השרת) ומקבל paymentId, ולאחר מכן ה-SDK בצד הלקוח מעבד אותו. זוהי תכנית סטנדרטית של שער תשלום, אבל דווקא כאן השגיאות נפוצות ביותר.
אתחול שרת:
POST https://securepay.tinkoff.ru/v2/Init
{
"TerminalKey": "your_terminal_key",
"Amount": 150000,
"OrderId": "ORDER-1234",
"Description": "Оплата заказа",
"Token": "sha256_signature"
}התשובה מכילה POST https://securepay.tinkoff.ru/v2/Init { "TerminalKey": "your_terminal_key", "Amount": 150000, "OrderId": "ORDER-1234", "Description": "Оплата заказа", "Token": "sha256_signature" } ו-PaymentId. PaymentURL מועבר ל-SDK לעיבוד התשלום בממשק המקורי.
מדריך אינטגרציה שלב אחר שלב
שלב 1: אתחול בצד השרת
ודא שהשרת מייצר PaymentId תקין — גיבוב SHA-256 של פרמטרים משורשרים (בסדר אלפביתי של מפתחות) עם Token שנוסף בסוף. השתמש בספריות רשמיות ליצירה. שלב זה קריטי לעיבוד תשלום ללא שגיאות.
שלב 2: הפעלת מסך התשלום בצד הלקוח
לאחר קבלת Password, העבר אותו ל-SDK. דוגמה ל-Android:
val tinkoffAcquiring = TinkoffAcquiring(
context,
terminalKey = "your_terminal_key",
publicKey = "your_public_key"
)
val paymentOptions = PaymentOptions().setOptions {
setTerminalParams(
terminalKey = "your_terminal_key",
publicKey = "your_public_key"
)
orderOptions {
orderId = "ORDER-1234"
amount = Money.ofRubles(1500)
title = "Заказ №1234"
description = "Оплата заказа"
savingAsParentPayment = false
}
featuresOptions {
useSecureKeyboard = true
cameraCardScanner = CameraCardIOScanner()
fpsEnabled = true
tinkoffPayEnabled = true
}
}
val launcher = registerForActivityResult(TinkoffAcquiring.createPaymentContract(context)) { result ->
when (result.status) {
AsdkState.Success -> handleSuccess(result.paymentId)
AsdkState.Cancelled -> {}
AsdkState.Error -> handleError(result.error)
else -> {}
}
}
tinkoffAcquiring.openPaymentScreen(
activity = this,
paymentOptions = paymentOptions,
launcher = launcher
)ל-iOS (AcquiringUISDK):
import TinkoffASDKUI
let credential = AcquiringSdkCredential(
terminalKey: "your_terminal_key",
publicKey: "your_public_key"
)
let acquiringSDK = try AcquiringUISDK(credential: credential)
let paymentData = PaymentInitData(
amount: 150000,
orderId: "ORDER-1234",
customerKey: "user_123"
)
acquiringSDK.presentPaymentView(
on: self,
paymentData: paymentData,
configuration: AcquiringViewConfiguration()
) { result in
switch result {
case .success(let paymentInfo):
print("Payment ID: \(paymentInfo.paymentId)")
case .failure(let error):
print("Error: \(error)")
case .cancelled:
break
}
} שלב 3: טיפול בקריאות חוזרות ואימות תשלום
לאחר התשלום, T-Kassa שולחת קריאה חוזרת (webhook) לשרת שלך. עליך להגדיר כתובת URL לקריאה חוזרת בחשבון T-Kassa שלך. הקריאה החוזרת כוללת PaymentId, val tinkoffAcquiring = TinkoffAcquiring( context, terminalKey = "your_terminal_key", publicKey = "your_public_key" ) val paymentOptions = PaymentOptions().setOptions { setTerminalParams( terminalKey = "your_terminal_key", publicKey = "your_public_key" ) orderOptions { orderId = "ORDER-1234" amount = Money.ofRubles(1500) title = "Заказ №1234" description = "Оплата заказа" savingAsParentPayment = false } featuresOptions { useSecureKeyboard = true cameraCardScanner = CameraCardIOScanner() fpsEnabled = true tinkoffPayEnabled = true } } val launcher = registerForActivityResult(TinkoffAcquiring.createPaymentContract(context)) { result -> when (result.status) { AsdkState.Success -> handleSuccess(result.paymentId) AsdkState.Cancelled -> {} AsdkState.Error -> handleError(result.error) else -> {} } } tinkoffAcquiring.openPaymentScreen( activity = this, paymentOptions = paymentOptions, launcher = launcher ) וחתימה דיגיטלית. אמת את החתימה כדי לאשר את האותנטיות. לאחר מכן עדכן את סטטוס ההזמנה. לאימות תשלום, ניתן גם להשתמש ב-API של import TinkoffASDKUI let credential = AcquiringSdkCredential( terminalKey: "your_terminal_key", publicKey: "your_public_key" ) let acquiringSDK = try AcquiringUISDK(credential: credential) let paymentData = PaymentInitData( amount: 150000, orderId: "ORDER-1234", customerKey: "user_123" ) acquiringSDK.presentPaymentView( on: self, paymentData: paymentData, configuration: AcquiringViewConfiguration() ) { result in switch result { case .success(let paymentInfo): print("Payment ID: \(paymentInfo.paymentId)") case .failure(let error): print("Error: \(error)") case .cancelled: break } } כדי לבדוק את מצב התשלום.
מקרה בוחן: איך הגדלנו המרה מ-12% ל-28%
אשתף מקרה ספציפי. הלקוח שלנו היה מרקטפלייס עם אפליקציית Android מקורית. לפנינו, התשלום עבר דרך WebView ואיבד 30% מההזמנות בשלב האישור. העברנו הכל ל-SDK של T-Kassa, הגדרנו הגדרת SBP ו-Tinkoff Pay, הוספנו מסך בחירת אמצעי תשלום מותאם אישית. תוצאה: ההמרה עלתה מ-12% ל-28%, שיפור של פי 2.3. התמיכה הפסיקה לקבל תלונות על "תשלומים תקועים". נקודות אינטגרציה מרכזיות:
- אתחול תשלום בצד השרת עם Token תקין (SHA-256).
- שימוש ב-
CameraCardIOScannerב-iOS ו-ML Kit ב-Android להזנת כרטיס. - הגדרת קריאות חוזרות דרך webhook: אנו מקבלים סטטוס תשלום בזמן אמת ומעדכנים את ההזמנה ללא מעורבות משתמש.
הגדרות נוספות
Tinkoff Pay
Tinkoff Pay פותח את אפליקציית T-Bank לאישור תשלום. אפליקציית T-Bank חייבת להיות מותקנת במכשיר כדי שזה יעבוד. ה-SDK בודק אוטומטית דרך UIApplication.canOpenURL (iOS) או PackageManager.getLaunchIntentForPackage (Android) ומסתיר את הכפתור אם האפליקציה לא נמצאה.
חתימת בקשה (Token)
כל בקשות השרת ל-API של T-Kassa נחתמות באמצעות SHA-256: שרשור של ערכי פרמטרים + Password בסדר אלפביתי של מפתחות. Token שגוי הוא גורם נפוץ לשגיאה 0 (Invalid Token) במהלך אתחול תשלום. אנו ממליצים בחום לאמת יצירת token בצד השרת באמצעות ספריות רשמיות.
השוואה בין אינטגרציה מקורית ל-WebView
| קריטריון | SDK מקורי של T-Kassa | עטיפת WebView |
|---|---|---|
| מהירות טעינה | < שנייה אחת | 2–5 שניות (פי 2–5 איטי יותר) |
| המרת תשלום | 25–35% | 10–18% (פי 2–3 נמוך יותר) |
| תמיכה בביומטריה | כן | לא |
| טיפול בשגיאות | התראות מקוריות | שגיאות דפדפן |
| היענות ממשק | 60fps | 30fps (פיגור פי 2) |
הטבלה מראה שה-SDK המקורי מהיר פי 2–5, מספק המרה גבוהה פי 2–3, ומציע חוויית משתמש טובה משמעותית.
שגיאות נפוצות והפתרונות שלהן
| שגיאה | פתרון |
|---|---|
| Invalid Token | בדוק את סדר הפרמטרים ואת ערך ה-Password. |
| PaymentId null | ודא שהשרת מחזיר תשובת Init תקינה. |
| המקלדת נעלמת | השבת את useSecureKeyboard = true לצורך ניפוי שגיאות. |
| SBP לא מוצג | הגדר fpsEnabled = true ועדכן את ה-SDK. |
מה כלול בעבודה
- חיבור SDK ל-iOS / Android
- אתחול תשלום בצד השרת עם חתימה תקינה
- הגדרת אפשרויות: SBP, Tinkoff Pay, שמירת כרטיסים
- טיפול בסטטוסים ואישור webhook
- בדיקה באמצעות טרמינל בדיקה (השתמש בפרטי טרמינל בדיקה מהדשבורד שלך)
- אימות תשלום דרך קריאות חוזרות
לוחות זמנים ומחירים
אינטגרציה בסיסית אורכת 1–2 ימים. אם נדרש ממשק משתמש מותאם אישית או שיטות נוספות — עד 5 ימים. עלות טיפוסית נעה בין 500 ל-2000 דולר, תלוי במורכבות. לצוות שלנו יש ניסיון של 5+ שנים עם T-Kassa והוא השלים בהצלחה מעל 200 אינטגרציות תשלום. אנו מבטיחים שמסך התשלום יעבוד ביציבות גם תחת עומס גבוה. צור קשר לייעוץ עם מהנדס — נעריך את הפרויקט שלך ונספק פתרון אופטימלי.
לפי נתונים מ-Tinkoff Developer Portal, ה-SDK המקורי מגדיל את המרת התשלום ב-20–30%. קבל ייעוץ עם מהנדס — נעזור לך לחבר את T-Kassa ללא שגיאות.







