שילוב Apple Pay עם 1C-Bitrix
לעתים קרובות אנו מקבלים בקשות להטמעת Apple Pay בחנויות מקוונות על 1C-Bitrix. Apple Pay אינה מערכת תשלום נפרדת אלא שכבת-על על גבי סליקה קיימת. ללא בנק-סולק או אגרגטור התומך ב-Apple Pay, שום תשלום לא יעבור. מפתחים רבים מזלזלים בצד השרת: אפל דורשת אימות דומיין באמצעות Merchant Identity Certificate, ובלעדיו הכפתור לא יופיע, לא משנה כמה טוב קוד ה-JS כתוב. יתרה מכך, סשן התשלום עצמו דורש לחיצת יד תלת-כיוונית בין דפדפן המשתמש, שרת החנות ושרתי אפל. בואו נפרק את התהליך הזה לפרטים.
תיעוד Apple Developer: "לפני שתוכל לעבד תשלומים, עליך לוודא שאתה שולט בדומיין של הסוחר על ידי העלאת קובץ שיוך דומיין."
בעיות שאנו פותרים
אימות דומיין ב-Apple Pay
- הפרונטאנד בודק זמינות:
ApplePaySession.canMakePayments()— עובד רק ב-Safari במכשירי אפל. - כאשר מתחיל תשלום, הדפדפן מבקש Payment Session משרת החנות.
- שרת החנות מעביר את הבקשה לאפל באמצעות Merchant Identity Certificate.
- אפל מאמתת את הדומיין → מחזירה אובייקט סשן.
- המשתמש מאשר עם Face ID/Touch ID → הדפדפן מקבל טוקן מוצפן.
- הטוקן נשלח לבנק-הסולק להשלמת העסקה.
שלבים 3–4 הם קריטיים — ללא קוד צד-שרת, שום כפתור לא יעבוד.
למה אינטגרציה ישירה לוקחת יותר זמן
עם אינטגרציה ישירה, אתה מנהל את האישורים והסשנים של אפל בעצמך. זה נותן שליטה מלאה אך מגדיל את זמן הפיתוח פי 2-3 בהשוואה לווידג'ט של אגרגטור. ווידג'ט (CloudPayments, YooKassa) מטפל בכל הלוגיקה של צד השרת — רק צריך לרשום את הדומיין בדשבורד ולהוסיף כמה שורות JavaScript.
| שיטה | לוח זמנים | מורכבות | אמינות |
|---|---|---|---|
| ווידג'ט אגרגטור | 1–2 ימים | נמוכה | גבוהה (האגרגטור מטפל באישורים) |
| אינטגרציה ישירה | 3–5 ימים | גבוהה | בינונית (תלויה ביישום) |
איך אנחנו עושים את זה (הוכחת מומחיות)
הכנת Merchant ID ואישורים
- חשבון Apple Developer Program ($99 לשנה) — ליצירת Merchant ID ולהורדת אישורים.
- אימות דומיין: קובץ
.well-known/apple-developer-merchantid-domain-associationבשורש האתר. - בנק-סולק או אגרגטור התומך ב-Apple Pay.
- HTTPS — Apple Pay לא זמין ללא SSL.
- 1C-Bitrix מוגדר עם רכיב התשלום
sale.order.checkout.
אינטגרציה דרך אגרגטור (הנתיב המומלץ)
אם אתה כבר משתמש ב-CloudPayments או YooKassa, ניתן להפעיל את Apple Pay דרך הווידג'ט שלהם. כל הטיפול באישורים בצד השרת נלקח על ידי האגרגטור:
// CloudPayments Widget
const cp = new cp.CloudPayments({
publicId: 'pk_XXXXXX'
});
// Проверяем доступность
if (window.ApplePaySession && ApplePaySession.canMakePaymentsWithActiveCard('merchant.ru.shop')) {
document.getElementById('apple-pay-btn').style.display = 'block';
}
document.getElementById('apple-pay-btn').addEventListener('click', () => {
cp.pay('applepay', {
description: 'Заказ #' + orderId,
amount: orderAmount,
currency: 'RUB',
invoiceId: String(orderId),
accountId: customerEmail,
}, {
onSuccess: () => confirmOrderPaid(orderId),
onFail: (reason) => showError(reason),
});
});יש לרשום את הדומיין בדשבורד של האגרגטור מראש — הוא יוסיף אוטומטית את קובץ האימות. זה הנתיב המהיר ביותר: לפי סטטיסטיקות, שיעור ההמרה של תשלומים עולה ב-10-15%.
אימות דומיין בצד השרת (אינטגרציה ישירה)
אם אתה צריך יישום ללא ווידג'ט אגרגטור:
// local/api/apple-pay-validate.php
$validationUrl = filter_var($_POST['validationUrl'] ?? '', FILTER_VALIDATE_URL);
// Разрешаем только домены Apple
if (!preg_match('#^https://apple-pay-gateway(-cert)?\.apple\.com#', $validationUrl)) {
http_response_code(400);
exit;
}
$ch = curl_init($validationUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'merchantIdentifier' => 'merchant.ru.yourshop',
'domainName' => 'yourshop.ru',
'displayName' => 'Your Shop',
]),
CURLOPT_SSLCERT => APPLE_PAY_CERT_PATH,
CURLOPT_SSLKEY => APPLE_PAY_KEY_PATH,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
]);
$response = curl_exec($ch);
curl_close($ch);
header('Content-Type: application/json');
echo $response; קוד JS בדף התשלום
const session = new ApplePaySession(3, {
countryCode: 'RU',
currencyCode: 'RUB',
supportedNetworks: ['visa', 'masterCard', 'mir'],
merchantCapabilities: ['supports3DS'],
total: {
label: 'Ваш магазин',
amount: String(orderAmount),
},
});
session.onvalidatemerchant = async ({ validationURL }) => {
const resp = await fetch('/api/apple-pay-validate.php', {
method: 'POST',
body: new URLSearchParams({ validationUrl: validationURL }),
});
session.completeMerchantValidation(await resp.json());
};
session.onpaymentauthorized = async ({ payment }) => {
const result = await sendTokenToServer(payment.token);
session.completePayment(
result.success ? ApplePaySession.STATUS_SUCCESS : ApplePaySession.STATUS_FAILURE
);
};
session.begin();
הוספה ל-Bitrix
אנו מוסיפים את הכפתור לתבנית // CloudPayments Widget const cp = new cp.CloudPayments({ publicId: 'pk_XXXXXX' }); // Проверяем доступность if (window.ApplePaySession && ApplePaySession.canMakePaymentsWithActiveCard('merchant.ru.shop')) { document.getElementById('apple-pay-btn').style.display = 'block'; } document.getElementById('apple-pay-btn').addEventListener('click', () => { cp.pay('applepay', { description: 'Заказ #' + orderId, amount: orderAmount, currency: 'RUB', invoiceId: String(orderId), accountId: customerEmail, }, { onSuccess: () => confirmOrderPaid(orderId), onFail: (reason) => showError(reason), }); }); . הוא מוצג רק כאשר // local/api/apple-pay-validate.php $validationUrl = filter_var($_POST['validationUrl'] ?? '', FILTER_VALIDATE_URL); // Разрешаем только домены Apple if (!preg_match('#^https://apple-pay-gateway(-cert)?\.apple\.com#', $validationUrl)) { http_response_code(400); exit; } $ch = curl_init($validationUrl); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode([ 'merchantIdentifier' => 'merchant.ru.yourshop', 'domainName' => 'yourshop.ru', 'displayName' => 'Your Shop', ]), CURLOPT_SSLCERT => APPLE_PAY_CERT_PATH, CURLOPT_SSLKEY => APPLE_PAY_KEY_PATH, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], ]); $response = curl_exec($ch); curl_close($ch); header('Content-Type: application/json'); echo $response; . לאחר קבלת הטוקן, קריאת AJAX ל-handler PHP שולחת את הטוקן לבנק וקוראת ל-const session = new ApplePaySession(3, { countryCode: 'RU', currencyCode: 'RUB', supportedNetworks: ['visa', 'masterCard', 'mir'], merchantCapabilities: ['supports3DS'], total: { label: 'Ваш магазин', amount: String(orderAmount) }, }); session.onvalidatemerchant = async ({ validationURL }) => { const resp = await fetch('/api/apple-pay-validate.php', { method: 'POST', body: new URLSearchParams({ validationUrl: validationURL }), }); session.completeMerchantValidation(await resp.json()); }; session.onpaymentauthorized = async ({ payment }) => { const result = await sendTokenToServer(payment.token); session.completePayment( result.success ? ApplePaySession.STATUS_SUCCESS : ApplePaySession.STATUS_FAILURE ); }; session.begin(); . אירועים מוגדרים כראוי: לאחר תשלום מוצלח, הפנייה לדף ההזמנה.
מה אנחנו עושים (היקף העבודה)
- רישום Merchant ID ויצירת אישורים ב-Apple Developer.
- הצבת קובץ אימות הדומיין.
- הגדרת HTTPS ואישור SSL (במידת הצורך).
- אינטגרציה עם האגרגטור הנבחר או אימות ישיר בצד השרת.
- הטמעת כפתור Apple Pay בתבנית התשלום של 1C-Bitrix.
- בדיקות על מכשירים אמיתיים (iPhone, iPad, Mac).
- תיעוד התהליך לתמיכה.
טעויות אינטגרציה נפוצות
- Merchant ID שגוי או אישור שבוטל → הכפתור לא מופיע.
- קובץ האימות לא הועלה לשורש הדומיין → הדומיין לא מאומת.
- חוסר תמיכה ב-3DS → עסקאות נדחות.
-
בדיקת
sale.order.checkoutגורמת לקריסה בגרסאות iOS ישנות.
לוחות זמנים
| משימה | לוח זמנים |
|---|---|
| רישום Merchant ID, אימות דומיין | 0.5 יום |
| אינטגרציה דרך ווידג'ט אגרגטור | 1–2 ימים |
| אינטגרציה ישירה עם Apple Pay JS API | 3–5 ימים |
צור קשר כדי שנוכל להעריך את הפרויקט שלך ולבחור את שיטת האינטגרציה האופטימלית. בקש הטמעת Apple Pay — הגדל את שיעור ההמרה של תשלומים ב-10–15% ללא השקעת זמן נוספת. לפי סטטיסטיקות, משתמשי Apple Pay מוציאים 20% יותר מאשר משלמים בכרטיס רגיל.
אנו ממליצים גם לעיין בתיעוד Apple Pay (מקורי) ובוויקיפדיה.

