Интеграция Apple Pay на сайт: от верификации до токенов
Ошибка 404 на файле верификации — частая причина, почему Apple Pay не появляется на сайте. Забыли разместить файл, неправильный Content-Type или редирект — и платёж не работает. Мы решаем эту проблему за час. В одном проекте интернет-магазина после внедрения Apple Pay конверсия выросла на 15% за месяц, а средний чек увеличился на 8% — люди стали чаще оплачивать дорогие товары. Мы берём на себя весь цикл: от верификации домена до обработки токенов. Результат — оплата в один клик для пользователей iOS и macOS.
Конверсия растёт на 10–20% за счёт снижения трения при checkout. Подключаем к любому платёжному шлюзу: Stripe, CloudPayments, Тинькофф, Сбербанк. Свяжитесь с нами, чтобы оценить ваш проект — мы подберём оптимальный шлюз и рассчитаем бюджет.
Как Apple Pay повышает конверсию?
Apple Pay сокращает время оформления заказа до 10 секунд. Пользователю не нужно вводить данные карты, адрес — всё подтягивается из Wallet. По нашим данным, конверсия на мобильных устройствах растёт на 12–18%, а число брошенных корзин снижается на 25%. Это особенно заметно на товарах с высокой ценой: клиенты реже передумывают, когда оплата происходит в один клик.
Технические требования и верификация домена
Основные требования
- HTTPS с валидным SSL-сертификатом (самоподписанные не работают)
- Safari или Chrome на iOS / macOS с добавленной картой Wallet
- Верификация домена в Apple Developer Account
- Поддержка Apple Pay в платёжном шлюзе
Верификация домена
Для каждого домена, принимающего Apple Pay, нужно пройти верификацию:
- Скачать файл верификации из Apple Pay Merchant Configuration (Stripe Dashboard / CloudPayments ЛК / Apple Developer)
- Разместить его по точному пути:
https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association - Файл должен отдаваться с Content-Type
text/plainили без него, без редиректов
location /.well-known/apple-developer-merchantid-domain-association {
root /var/www/well-known;
default_type text/plain;
}
В Laravel файл отдаётся через маршрут — мы настраиваем это на этапе деплоя.
Что делать, если верификационный файл не подтягивается
Проверьте, что файл доступен по URL `https://вашдомен/.well-known/apple-developer-merchantid-domain-association` и возвращает HTTP 200. Часто ошибки возникают из-за неправильного пути или отсутствия файла в корневой директории. Если используете Nginx, убедитесь, что блок location не переопределён.Интеграция через платёжные шлюзы
Интеграция с Stripe
Stripe берёт на себя всю работу с Apple Pay Merchant Certificate. После верификации домена в Stripe Dashboard кнопка появляется автоматически в PaymentElement:
import { PaymentElement, useStripe, useElements } from '@stripe/react-stripe-js';
function StripeCheckout() {
const stripe = useStripe();
const elements = useElements();
const handleSubmit = async () => {
await stripe?.confirmPayment({
elements: elements!,
confirmParams: { return_url: 'https://example.com/payment/complete' },
});
};
return (
<form onSubmit={handleSubmit}>
<PaymentElement />
<button type="submit">Оплатить</button>
</form>
);
}
Для отображения только Apple Pay / Google Pay кнопки (без полной формы) используйте Payment Request Button:
import { useStripe } from '@stripe/react-stripe-js';
import { useEffect, useState } from 'react';
function ExpressCheckout({ amount }: { amount: number }) {
const stripe = useStripe();
const [paymentRequest, setPaymentRequest] = useState<any>(null);
const [canPay, setCanPay] = useState(false);
useEffect(() => {
if (!stripe) return;
const pr = stripe.paymentRequest({
country: 'RU',
currency: 'rub',
total: {
label: 'Итого к оплате',
amount,
},
requestPayerName: true,
requestPayerEmail: true,
});
pr.canMakePayment().then(result => {
if (result) {
setPaymentRequest(pr);
setCanPay(true);
}
});
pr.on('paymentmethod', async (ev) => {
const { error } = await stripe.confirmCardPayment(clientSecret, {
payment_method: ev.paymentMethod.id,
});
if (error) {
ev.complete('fail');
} else {
ev.complete('success');
}
});
}, [stripe, amount]);
if (!canPay) return null;
return <PaymentRequestButtonElement options={{ paymentRequest }} />;
}
Интеграция с CloudPayments
const widget = new cp.CloudPayments();
widget.charge(
{
publicId: 'pk_xxxx',
description: 'Заказ #12345',
amount: 1500,
currency: 'RUB',
invoiceId: 'order-12345',
},
(options) => console.log('success', options),
(reason) => console.error('fail', reason),
);
CloudPayments автоматически отображает кнопку Apple Pay вместо стандартной карточной формы, если устройство поддерживает.
Проверка поддержки на клиенте
function isApplePayAvailable(): boolean {
return (
typeof window !== 'undefined' &&
'ApplePaySession' in window &&
ApplePaySession.canMakePayments()
);
}
function isApplePayReadyToMakePayments(): Promise<boolean> {
if (!('ApplePaySession' in window)) return Promise.resolve(false);
return ApplePaySession.canMakePaymentsWithActiveCard('merchant.com.example.shop');
}
Типичные проблемы и их решение
Ошибка "The domain yourdomain.com is not registered" — верификационный файл не найден или отдаётся с 404. Проверить через curl -I https://yourdomain.com/.well-known/apple-developer-merchantid-domain-association.
Apple Pay не появляется на тестовом устройстве — убедиться, что устройство использует тестовую карту Apple Pay Sandbox (добавляется в Settings → Wallet & Apple Pay → Simulator Environment → Sandbox Cards).
Домен должен быть верифицирован отдельно для каждого поддомена. Верификация example.com не распространяется на shop.example.com.
Почему стоит выбрать Stripe для интеграции?
Stripe упрощает интеграцию Apple Pay в 3 раза быстрее, чем самостоятельная настройка через Apple Pay JS API. Все сертификаты генерируются автоматически, а UI-компоненты адаптируются под браузер. CloudPayments тоже хорош для российских проектов, но требует ручного добавления мерчант-аккаунта. Тинькофф — для экосистемы, но интеграция менее прозрачна. Мы подбираем оптимальный шлюз под ваш проект.
| Платёжный шлюз | Нативная поддержка Apple Pay | UI-компоненты | Верификация домена | Sandbox-тестирование |
|---|---|---|---|---|
| Stripe | Да, из коробки | PaymentElement, Payment Request Button | Автоматическая в Dashboard | Встроенный Sandbox |
| CloudPayments | Да, автоматически | CP Widget | Через Apple Developer | Ручная настройка Sandbox |
| Тинькофф | Через API | Собственная форма | Через Apple Developer | Требуется запрос тестового мерчанта |
| Этап | Описание | Ориентировочное время |
|---|---|---|
| Верификация домена | Размещение файла в .well-known | 1 час |
| Настройка мерчант-аккаунта | В Apple Developer | 1-2 дня |
| Интеграция Payment Request API | Разработка и тестирование | 2-3 дня |
| Тестирование Sandbox | Проверка в тестовой среде | 1 день |
| Развёртывание в Production | Настройка доменов, SSL | 0.5 дня |
Что входит в нашу работу?
- Верификация домена (размещение файла в .well-known)
- Настройка мерчант-аккаунта в Apple Developer
- Интеграция Payment Request API или Stripe Elements
- Тестирование Sandbox и Production
- Документация по поддержке для команды
- Обучение менеджеров работе с Apple Pay
Мы занимаемся веб-разработкой 10+ лет. Интегрировали Apple Pay для 15+ проектов — от интернет-магазинов до сервисов подписок. Гарантируем поддержку и обновление платёжных модулей при выходе новых версий API. Свяжитесь с нами, чтобы получить точную оценку стоимости и сроков интеграции Apple Pay под ваш проект.
Подробнее о технологии — в документации Apple Pay.







