Інтеграція 1С-Бітрікс з платіжною системою Apple Pay
Apple Pay на сайті — це не окрема платіжна система, а спосіб підтвердження оплати карткою через пристрій Apple. Технічно це означає: покупець не вводить номер картки, а авторизує платіж через Face ID або Touch ID, а токенізовані дані картки передаються у ваш еквайринг. Поширена помилка — що потрібно «підключити Apple Pay окремо». Ні: Apple Pay працює поверх уже підключеного еквайрингу, який підтримує цей метод (ЮКаса, Тінькофф, Сбер, Stripe та інші).
Попередні вимоги
Для роботи Apple Pay на сайті необхідно:
- Еквайринг з підтримкою Apple Pay — перевірте договір з банком або агрегатором
- HTTPS — обов'язково; Apple Pay не працює по HTTP
-
Верифікація домену — Apple вимагає розмістити файл за шляхом
/.well-known/apple-developer-merchantid-domain-association - Merchant ID — створюється в Apple Developer Console, прив'язується до домену та сертифікату
Верифікація домену
# nginx: віддаємо файл без розширення
location /.well-known/apple-developer-merchantid-domain-association {
default_type text/plain;
alias /var/www/myshop/.well-known/apple-developer-merchantid-domain-association;
}
Файл верифікації завантажується з Apple Developer Console. У більшості випадків еквайринг (ЮКаса, Тінькофф) проводить верифікацію через свої сервіси — достатньо вказати домен в особистому кабінеті агрегатора.
Кнопка Apple Pay у 1С-Бітрікс
Apple Pay відображається лише в Safari на пристроях Apple. Для інших браузерів — стандартна форма оплати. У шаблоні компонента sale.order.checkout або на сторінці оплати:
// Перевіряємо підтримку перед відображенням кнопки
if (window.ApplePaySession && ApplePaySession.canMakePayments()) {
document.querySelector('.apple-pay-button').style.display = 'block';
}
function startApplePay(orderTotal, orderId) {
const request = {
countryCode: 'RU',
currencyCode: 'RUB',
supportedNetworks: ['visa', 'masterCard', 'mir'],
merchantCapabilities: ['supports3DS'],
total: { label: 'Мій магазин', amount: String(orderTotal) },
};
const session = new ApplePaySession(6, request);
// Валідація мерчанта — запит до Apple через ваш сервер
session.onvalidatemerchant = async (event) => {
const res = await fetch('/bitrix/tools/apple_pay_validate.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ validationURL: event.validationURL }),
});
session.completeMerchantValidation(await res.json());
};
// Отримали токен платежу
session.onpaymentauthorized = async (event) => {
const res = await fetch('/bitrix/tools/apple_pay_charge.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ token: event.payment.token, orderId }),
});
const data = await res.json();
session.completePayment(
data.success ? ApplePaySession.STATUS_SUCCESS : ApplePaySession.STATUS_FAILURE
);
if (data.success) window.location.href = data.redirect;
};
session.begin();
}
Серверна валідація мерчанта
// /bitrix/tools/apple_pay_validate.php
$body = json_decode(file_get_contents('php://input'), true);
$validationUrl = filter_var($body['validationURL'] ?? '', FILTER_VALIDATE_URL);
$ch = curl_init($validationUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'merchantIdentifier' => APPLE_MERCHANT_ID,
'displayName' => 'Мій магазин',
'initiative' => 'web',
'initiativeContext' => $_SERVER['HTTP_HOST'],
]),
CURLOPT_SSLCERT => APPLE_CERT_PATH, // .pem файл сертифіката мерчанта
CURLOPT_SSLKEY => APPLE_CERT_KEY_PATH, // приватний ключ
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
]);
$merchantSession = curl_exec($ch);
curl_close($ch);
header('Content-Type: application/json');
echo $merchantSession; // передаємо безпосередньо в session.completeMerchantValidation
Обробка токена через еквайринг
Apple Pay передає зашифрований PKPaymentToken. Його потрібно передати у ваш еквайринг:
// Приклад для ЮКаси: /bitrix/tools/apple_pay_charge.php
$input = json_decode(file_get_contents('php://input'), true);
$token = $input['token'];
$orderId = (int)$input['orderId'];
$payment = $yookassaClient->createPayment([
'amount' => ['value' => getOrderAmount($orderId), 'currency' => 'RUB'],
'payment_method_data' => [
'type' => 'apple_pay',
'payment_data' => base64_encode(json_encode($token['paymentData'])),
],
'capture' => true,
'description' => 'Замовлення №' . $orderId,
], uniqid('', true));
// Оновлюємо статус у 1С-Бітрікс при успіху
if ($payment->getStatus() === 'succeeded') {
$bitrixPayment->setPaid('Y');
$bitrixPayment->save();
}
Терміни
| Завдання | Термін |
|---|---|
| Верифікація домену, Merchant ID | 0.5 дня |
| JS-кнопка + серверна валідація мерчанта | 1 день |
| Інтеграція токена з еквайрингом та тестування | 1 день |







