Почему интеграция Apple Pay сложнее кнопки
Многие считают, что интеграция Apple Pay — это просто добавить кнопку. На практике мы сталкиваемся с цепочкой из Merchant ID, сертификатов, PKPaymentAuthorizationController, серверной верификации платёжного токена и обработки финального статуса транзакции. Ошибка в любом звене — и либо приложение не покажет кнопку вовсе, либо получит отказ от Apple Pay на этапе авторизации. На одном проекте клиент потратил неделю на настройку Merchant ID, а кнопка так и не появилась — причина была в устаревшем сертификате. Требуется до 10 шагов настройки, и каждый шаг имеет свои подводные камни.
Apple Pay использует шифрование на уровне устройства — каждая транзакция уникальна, что подтверждает официальная документация Apple Pay Security Guide. Это требует корректной настройки как на клиенте, так и на сервере. В этой статье разберём ключевые шаги и частые проблемы. Наш опыт — 20+ успешных интеграций, от retail до fintech, с экономией времени до 70% за счёт готовых решений.
Как настроить Merchant ID и сертификаты
Всё начинается в Apple Developer Portal:
- Создаём Merchant ID:
merchant.com.yourcompany.appname - Генерируем Payment Processing Certificate — используется Apple для шифрования токена перед отправкой вашему серверу
- Добавляем домен для Apple Pay on the Web (если нужен) — требует верификационного файла на сервере
В Xcode: Signing & Capabilities → Добавить Apple Pay → выбрать Merchant ID. Xcode автоматически обновит .entitlements файл:
<key>com.apple.developer.in-app-payments</key> <array> <string>merchant.com.yourcompany.appname</string> </array> Без этого entitlement Apple Pay не активируется на устройстве, даже если код написан правильно.
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) } } Важный нюанс с .mir: Mir Pay требует отдельной настройки и работает только на картах, выпущенных в НСПК. Не все эквайеры поддерживают Mir через Apple Pay — нужно уточнять у платёжного провайдера.
Серверная верификация токена
payment.token.paymentData — это зашифрованный JSON, который Apple зашифровала вашим Payment Processing Certificate. Расшифровывается на сервере.
Структура токена:
{ "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
- Восстановить shared secret через ECDH (ваш приватный ключ + ephemeralPublicKey из токена)
- Получить симметричный ключ через HKDF
- Расшифровать
dataчерез AES-256-GCM
На практике большинство платёжных провайдеров (Stripe, CloudPayments, ЮKassa) берут на себя расшифровку — вы просто передаёте им сырой paymentData. Самостоятельная реализация нужна только при прямом эквайринге. Сравним подходы:
| Аспект | Ручная расшифровка | Через платёжного провайдера |
|---|---|---|
| Сложность | Высокая: ECDH, HKDF, AES-GCM | Низкая: передаём paymentData |
| Надёжность | Полный контроль, но много точек отказа | Проверено миллионами транзакций |
| Время реализации | От недели | 1–2 дня |
Apple документация: «Apple Pay использует шифрование на уровне устройства, что делает каждую транзакцию уникальной». Платёжный провайдер ускоряет интеграцию в 5 раз по сравнению с ручной расшифровкой.
Как протестировать Apple Pay?
Apple Pay не работает на симуляторе для реальных транзакций. Для тестирования нужно устройство с тестовой картой Visa из Apple Sandbox. Тестовые карты доступны только аккаунтам в Apple Sandbox environment. На физическом устройстве можно проверить полный цикл: от отображения кнопки до получения статуса транзакции.
Что делать, если кнопка Apple Pay не появляется?
Причины: Merchant ID не добавлен в entitlements (проверьте .entitlements файл), сертификат истёк (срок 2 года), canMakePayments(usingNetworks:) возвращает false на симуляторе без настроенных карт. Наше решение: последовательная проверка каждого элемента цепочки. Сертификат нужно обновлять раз в два года — напоминаем клиентам за месяц до истечения.
Как обновить сертификат?
Зайдите в Apple Developer Portal, в раздел Certificates, Identifiers & Profiles. Создайте новый Payment Processing Certificate для того же Merchant ID. Загрузите CSR-файл, скачайте новый сертификат, установите на сервер и перезапустите процесс. Всё занимает 15 минут.Типичные проблемы и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| Кнопка не отображается | Неверный entitlements или истёк сертификат | Проверьте .entitlements и срок сертификата |
| Failure без сообщения | errors не передан в PKPaymentAuthorizationResult |
Передавайте PKPaymentError |
| Ошибка на симуляторе | Apple Pay не работает на симуляторе | Тестируйте на реальном устройстве с Sandbox |
| Сертификат истёк | Срок действия 2 года | Обновите сертификат через Developer Portal |
Что входит в нашу работу
- Регистрация Merchant ID, генерация и загрузка сертификатов
- Реализация
PKPaymentRequestс корректнымиpaymentSummaryItems - Интеграция с платёжным провайдером (передача token.paymentData)
- Обработка ошибок с
PKPaymentError - Тестирование на физическом устройстве в Sandbox
Закажите интеграцию под ключ — мы реализуем полный цикл от настройки сертификатов до тестирования. Свяжитесь с нами для оценки вашего проекта — мы поможем с интеграцией Apple Pay любой сложности.
Сроки
2–3 дня включая настройку в Developer Portal и интеграцию с провайдером. Благодаря готовым шаблонам срок сокращается на 70% по сравнению с самостоятельной реализацией. Стоимость рассчитывается индивидуально после анализа требований.







