Integrating Apple Pay with 1C-Bitrix
We often receive requests to implement Apple Pay in online stores on 1C-Bitrix. Apple Pay is not a separate payment system but an overlay on existing acquiring. Without a bank-acquirer or aggregator supporting Apple Pay, no payment will go through. Many developers underestimate the server part: Apple requires domain verification via a Merchant Identity Certificate, and without it the button won't appear no matter how well the JS code is written. Moreover, the payment session itself requires a three-way handshake between the user's browser, the store's server, and Apple's servers. Let's break down this process in detail.
Apple Developer documentation: "Before you can process payments, you must verify that you control the merchant's domain by uploading a domain association file."
Problems We Solve
Domain Verification in Apple Pay
- The frontend checks availability:
ApplePaySession.canMakePayments()— works only in Safari on Apple devices. - When a payment is initiated, the browser requests a Payment Session from the store's server.
- The store server proxies the request to Apple using the Merchant Identity Certificate.
- Apple verifies the domain → returns a session object.
- The user confirms with Face ID/Touch ID → the browser receives an encrypted token.
- The token is sent to the bank-acquirer to complete the transaction.
Steps 3–4 are critical — without server-side code, no button will work.
Why Direct Integration Takes Longer
With direct integration, you manage Apple certificates and sessions yourself. This gives full control but increases development time 2-3 times compared to an aggregator widget. A widget (CloudPayments, YooKassa) handles all server-side logic — just register the domain in your dashboard and add a few lines of JavaScript.
| Method | Timeline | Complexity | Reliability |
|---|---|---|---|
| Aggregator widget | 1–2 days | Low | High (aggregator handles certificates) |
| Direct integration | 3–5 days | High | Medium (depends on implementation) |
How We Do It (Proof of Expertise)
Preparing Merchant ID and Certificates
- Apple Developer Program account ($99/year) — to create Merchant ID and download certificates.
- Domain verification: file
.well-known/apple-developer-merchantid-domain-associationin the site root. - Bank-acquirer or aggregator supporting Apple Pay.
- HTTPS — Apple Pay is unavailable without SSL.
- Configured 1C-Bitrix with the payment component
sale.order.checkout.
Integration via Aggregator (Recommended Path)
If you already use CloudPayments or YooKassa, Apple Pay can be enabled through their widget. All server-side certificate handling is taken over by the aggregator:
// CloudPayments Widget
const cp = new cp.CloudPayments({
publicId: 'pk_XXXXXX'
});
// Check availability
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: 'Order #' + orderId,
amount: orderAmount,
currency: 'RUB',
invoiceId: String(orderId),
accountId: customerEmail,
}, {
onSuccess: () => confirmOrderPaid(orderId),
onFail: (reason) => showError(reason),
});
});You need to register the domain in the aggregator's dashboard beforehand — it will automatically add the verification file. This is the fastest path: according to statistics, payment conversion increases by 10-15%.
Server-Side Domain Validation (Direct Integration)
If you need an implementation without an aggregator widget:
// local/api/apple-pay-validate.php
$validationUrl = filter_var($_POST['validationUrl'] ?? '', FILTER_VALIDATE_URL);
// Allow only Apple domains
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 Code on the Payment Page
const session = new ApplePaySession(3, {
countryCode: 'RU',
currencyCode: 'RUB',
supportedNetworks: ['visa', 'masterCard', 'mir'],
merchantCapabilities: ['supports3DS'],
total: {
label: 'Your Store',
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();
Adding to Bitrix
We add the button to the sale.order.checkout template. It is displayed only when canMakePayments() === true. After receiving the token, an AJAX call to a PHP handler sends the token to the bank and calls $payment->setPaid('Y'). Proper events are configured: after successful payment, redirect to the order page.
What We Do (Scope of Work)
- Registration of Merchant ID and certificate generation in Apple Developer.
- Placement of the domain verification file.
- HTTPS and SSL certificate setup (if needed).
- Integration with the chosen aggregator or direct server-side validation.
- Implementation of the Apple Pay button in the 1C-Bitrix payment template.
- Testing on real devices (iPhone, iPad, Mac).
- Documentation of the process for support.
Common Integration Mistakes
- Incorrect Merchant ID or revoked certificate → the button does not appear.
- Verification file not uploaded to the domain root → domain is not verified.
- Missing 3DS support → transactions are declined.
-
canMakePaymentscheck causes crash on older iOS versions.
Timelines
| Task | Timeline |
|---|---|
| Merchant ID registration, domain verification | 0.5 day |
| Integration via aggregator widget | 1–2 days |
| Direct integration with Apple Pay JS API | 3–5 days |
Contact us so we can evaluate your project and choose the optimal integration method. Request Apple Pay implementation — increase payment conversion by 10–15% without extra time investment. According to statistics, Apple Pay users spend 20% more than regular card payers.
We also recommend reviewing the Apple Pay documentation (original) and Wikipedia.

