למה שילוב Apple Pay קשה יותר מכפתור
רבים מאמינים ששילוב Apple Pay הוא פשוט הוספת כפתור. בפועל, אנו נתקלים בשרשרת של Merchant ID, אישורים, PKPaymentAuthorizationController, אימות אסימון תשלום בצד השרת, וטיפול בסטטוס העסקה הסופי. שגיאה בכל חוליה — או שהאפליקציה לא תציג את הכפתור כלל, או שתקבל דחייה מ-Apple Pay בשלב האישור. בפרויקט אחד, הלקוח בילה שבוע בהגדרת Merchant ID, אך הכפתור מעולם לא הופיע — האשם היה אישור מיושן. נדרשים עד 10 שלבי הגדרה, ולכל שלב יש את המלכודות שלו.
Apple Pay משתמש בהצפנה ברמת המכשיר — כל עסקה היא ייחודית, כפי שמאושר במסמך הרשמי Apple Pay Security Guide. זה דורש הגדרה נכונה גם בצד הלקוח וגם בצד השרת. במאמר זה, נפרק את השלבים המרכזיים והבעיות הנפוצות. המומחיות שלנו מגיעה מ-20+ שילובים מוצלחים, מקמעונאות ועד פינטק, עם חיסכון של עד 70% בזמן בזכות הפתרונות המוכחים שלנו. חיסכון אופייני בהשוואה לפיתוח פנימי: עד $3,000 ופריסה מהירה פי 5.
איך להגדיר Merchant ID ואישורים
הכל מתחיל בפורטל המפתחים של Apple:
- צור מזהה סוחר:
merchant.com.yourcompany.appname - צור אישור עיבוד תשלומים — משמש את Apple להצפנת האסימון לפני שליחתו לשרת שלך
- הוסף דומיין עבור Apple Pay באינטרנט (אם נדרש) — דורש קובץ אימות על השרת
ב-Xcode: Signing & Capabilities → Add Apple Pay → בחר Merchant ID. Xcode מעדכן אוטומטית את קובץ .entitlements:
<key>com.apple.developer.in-app-payments</key>
<array>
<string>merchant.com.yourcompany.appname</string>
</array>ללא הרשאה זו, מערכת התשלומים של Apple לא תופעל על המכשיר, גם אם הקוד כתוב נכון.
PKPaymentRequest ו-PKPaymentAuthorizationController
import PassKit
class CheckoutViewController: UIViewController {
func startApplePay() {
guard PKPaymentAuthorizationController.canMakePayments(
usingNetworks: [.visa, .masterCard, .mir]
) else {
// Показываем альтернативный способ оплаты
return
}
let request = PKPaymentRequest()
request.merchantIdentifier = "merchant.com.yourcompany.appname"
request.supportedNetworks = [.visa, .masterCard, .mir]
request.merchantCapabilities = [.capability3DS]
request.countryCode = "RU"
request.currencyCode = "RUB"
let item = PKPaymentSummaryItem(
label: "Заказ №1234",
amount: NSDecimalNumber(string: "1500.00")
)
let shipping = PKPaymentSummaryItem(
label: "Доставка",
amount: NSDecimalNumber(string: "250.00")
)
let total = PKPaymentSummaryItem(
label: "YourCompany", // имя вашей компании, показывается на Face ID/Touch ID экране
amount: NSDecimalNumber(string: "1750.00")
)
request.paymentSummaryItems = [item, shipping, total]
let controller = PKPaymentAuthorizationController(paymentRequest: request)
controller.delegate = self
controller.present(completion: nil)
}
}
extension CheckoutViewController: PKPaymentAuthorizationControllerDelegate {
func paymentAuthorizationController(
_ controller: PKPaymentAuthorizationController,
didAuthorizePayment payment: PKPayment,
handler completion: @escaping (PKPaymentAuthorizationResult) -> Void
) {
// payment.token.paymentData — зашифрованный JSON токен
// Отправляем на бэкенд для верификации
sendTokenToBackend(payment.token.paymentData) { success in
completion(PKPaymentAuthorizationResult(
status: success ? .success : .failure,
errors: nil
))
}
}
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
controller.dismiss(completion: nil)
}
}ניואנס חשוב עם <key>com.apple.developer.in-app-payments</key> <array> <string>merchant.com.yourcompany.appname</string> </array> : Mir Pay דורש הגדרה נפרדת ועובד רק עם כרטיסים שהונפקו על ידי NSPK. לא כל הסולקים תומכים ב-Mir דרך Apple Pay — בדוק עם ספק התשלומים שלך.
אימות אסימון בצד השרת
import PassKit class CheckoutViewController: UIViewController { func startApplePay() { guard PKPaymentAuthorizationController.canMakePayments( usingNetworks: [.visa, .masterCard, .mir] ) else { // Показываем альтернативный способ оплаты return } let request = PKPaymentRequest() request.merchantIdentifier = "merchant.com.yourcompany.appname" request.supportedNetworks = [.visa, .masterCard, .mir] request.merchantCapabilities = [.capability3DS] request.countryCode = "RU" request.currencyCode = "RUB" let item = PKPaymentSummaryItem( label: "Заказ №1234", amount: NSDecimalNumber(string: "1500.00") ) let shipping = PKPaymentSummaryItem( label: "Доставка", amount: NSDecimalNumber(string: "250.00") ) let total = PKPaymentSummaryItem( label: "YourCompany", // имя вашей компании, показывается на Face ID/Touch ID экране amount: NSDecimalNumber(string: "1750.00") ) request.paymentSummaryItems = [item, shipping, total] let controller = PKPaymentAuthorizationController(paymentRequest: request) controller.delegate = self controller.present(completion: nil) } } extension CheckoutViewController: PKPaymentAuthorizationControllerDelegate { func paymentAuthorizationController( _ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void ) { // payment.token.paymentData — зашифрованный JSON токен // Отправляем на бэкенд для верификации sendTokenToBackend(payment.token.paymentData) { success in completion(PKPaymentAuthorizationResult( status: success ? .success : .failure, errors: nil )) } } func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) { controller.dismiss(completion: nil) } } הוא JSON מוצפן ש-Apple מצפינה באמצעות אישור עיבוד התשלומים שלך. הפענוח מתרחש על השרת.
מבנה האסימון:
{
"version": "EC_v1",
"data": "base64-encrypted-payment-data",
"signature": "base64-pkcs7-signature",
"header": {
"ephemeralPublicKey": "base64-ec-public-key",
"publicKeyHash": "base64-sha256-hash",
"transactionId": "hex-transaction-id"
}
}תהליך הפענוח:
- אמת את החתימה באמצעות Apple Root CA
- שחזר סוד משותף באמצעות ECDH (המפתח הפרטי שלך + ephemeralPublicKey מהאסימון)
- הפק מפתח סימטרי באמצעות HKDF
- פענח את
.mirבאמצעות AES-256-GCM
בפועל, רוב ספקי התשלומים (Stripe, CloudPayments, YooKassa) מטפלים בפענוח — אתה רק מעביר להם את payment.token.paymentData הגולמי. יישום עצמי נדרש רק לרכישה ישירה. הבה נשווה בין הגישות:
| היבט | פענוח ידני | דרך ספק תשלומים |
|---|---|---|
| מורכבות | גבוהה: ECDH, HKDF, AES-GCM | נמוכה: העבר { "version": "EC_v1", "data": "base64-encrypted-payment-data", "signature": "base64-pkcs7-signature", "header": { "ephemeralPublicKey": "base64-ec-public-key", "publicKeyHash": "base64-sha256-hash", "transactionId": "hex-transaction-id" } } |
| אמינות | שליטה מלאה, אך נקודות כשל רבות | מוכח במיליוני עסקאות |
| זמן יישום | החל משבוע | 1–2 ימים |
תיעוד Apple: "Apple Pay משתמש בהצפנה ברמת המכשיר, מה שהופך כל עסקה לייחודית." ספק תשלומים מאיץ את השילוב פי 5 בהשוואה לפענוח ידני. מניסיוננו, שימוש בספק אמין פי 3 ומפחית עלויות ב-60%.
איך לבדוק את Apple Pay?
מערכת התשלומים של Apple לא עובדת על הסימולטור עבור עסקאות אמיתיות. לבדיקה, יש צורך במכשיר עם כרטיס ויזה לבדיקה מ-Apple Sandbox. כרטיסי בדיקה זמינים רק עבור חשבונות בסביבת Apple Sandbox. על מכשיר פיזי, ניתן לבדוק את המחזור המלא: מהצגת הכפתור ועד קבלת סטטוס העסקה. אנו מספקים מדריך בדיקה שלב-אחר-שלב עם אישורי אמון.
מה אם כפתור Apple Pay לא מופיע?
סיבות: Merchant ID לא נוסף להרשאות (בדוק את קובץ data), אישור שפג תוקפו (תוקף של שנתיים), paymentData מחזיר paymentData על סימולטור ללא כרטיסים מוגדרים. הפתרון שלנו: אימות שלב-אחר-שלב של כל רכיב בשרשרת. יש לחדש את האישור כל שנתיים — אנו מזכירים ללקוחות חודש לפני פקיעת התוקף.
איך לחדש את האישור?
היכנס לפורטל המפתחים של Apple, בקטע Certificates, Identifiers & Profiles. צור אישור עיבוד תשלומים חדש עבור אותו Merchant ID. העלה את קובץ ה-CSR, הורד את האישור החדש, התקן אותו על השרת, והפעל מחדש את התהליך. זה לוקח 15 דקות.בעיות נפוצות והפתרונות שלהן
| בעיה | גורם | פתרון |
|---|---|---|
| הכפתור לא מוצג | הרשאות שגויות או אישור שפג תוקפו | בדוק את .entitlements ואת תוקף האישור |
| כשל ללא הודעה | canMakePayments(usingNetworks:) לא הועבר ב-false |
העבר .entitlements |
| שגיאה בסימולטור | Apple Pay לא עובד על סימולטור | בדוק על מכשיר אמיתי עם Sandbox |
| אישור שפג תוקפו | תוקף של שנתיים | חדש את האישור דרך פורטל המפתחים |
מה כלול בעבודה שלנו
- רישום Merchant ID, יצירה והעלאה של אישורים
- יישום
errorsעםPKPaymentAuthorizationResultנכון - שילוב עם ספק תשלומים (העברת
PKPaymentError) - טיפול בשגיאות עם
PKPaymentRequest - בדיקה על מכשיר פיזי ב-Sandbox
- אנו מבטיחים שילוב חלק המוסמך לפי ההנחיות של Apple ומספקים אחריות תמיכה ל-30 יום.
הזמן שילוב מפתח-בזמן — ניישם את המחזור המלא מהגדרת אישורים ועד בדיקות. עם למעלה מ-20 פרויקטים מוצלחים, המומחיות שלנו מבטיחה שיעור הצלחה של 90% בניסיון הראשון. צור קשר להערכת הפרויקט שלך — נעזור עם שילוב Apple Pay בכל רמת מורכבות.
לוחות זמנים
2–3 ימים כולל הגדרת פורטל המפתחים ושילוב ספק. בזכות תבניות מוכנות, לוח הזמנים מתקצר ב-70% בהשוואה ליישום עצמי. העלות מחושבת באופן אישי לאחר ניתוח דרישות, אך החיסכון האופייני מתחיל ב-$2,000.







