Перейти к основному содержимому
Версия: 1.0.0

ApplePayWeb

Операция покупки через Apple Pay

Для интеграции кнопки Apple Pay на платежную страницу интернет магазина необходимо реализовать метод ApplePaySession.canMakePaymentsWithActiveCard, этот метод определяет поддерживает ли данное устройство оплату с помощью Apple Pay.

Если поддерживает оплата - необходимо отрисовать кнопку “Купить с помощью Apple Pay”.

Далее необходимо создать объект ApplePaySession, с параметрами покупки:

  countryCode: 'UA',
currencyCode: 'UAH',
supportedNetworks: ['visa', 'masterCard'],
merchantCapabilities: ['supports3DS'],
total: { label: 'Your Merchant Name', amount: '10.00' },

Описание полей можно посмотреть в документации Apple Pay on Web.

На событие onvalidatemerchant необходимо назначить обработчик, в котором будет вызываться API “api/apple/validate”. Описание метода будет ниже.

На событие onpaymentauthorized необходимо назначить обработчик, который будет вызывать API “api/apple/payment”.

После подтверждения платежа в onpaymentauthorized необходимо вызвать метод

ApplePaySession.completePayment.

Документацию по ApplePaySession можно найти на оф. сайте Apple.

Валидация мерчанта Apple Pay (api/apple/validate)

Production url: https://****.procard-ltd.com/api/apple/validate

POST параметры:

ПараметрОписаниеТипЗначение
operationТип операцииStringPurchase
apple_validation_urlДанный параметр приходит в событии onvalidatemerchant, event.validationURLString
Пример:
session.onvalidatemerchant = (event) => {
  console.log(event.validationURL);
}
merchant_idID мерчанта, выдается процесcингомString
amountСумма операции. Пример 500.00Float
signatureВ целях подтверждения валидности данных должна быть сгенерирована и передана в запросе HMAC_SHA512 контрольная подпись с использованием SecretKey торговца.String
Строка, подлежащая HMAC_SHA512, генерируется путем конкатенации параметров merchant_id, order_id, amount, currency_iso, description разделенных “;” (точка с запятой) в кодировке UTF-8.
Порядок параметров при конкатенации важен!
order_idУникальный номер операции на стороне торговца. Если операция дублируется - торговец получает ошибку.String
currency_isoВалюта платежаStringUAH
descriptionНазначение платежа. Выводится на платежной странице, при вводе платежных реквизитов. Отображается в выписке по счету и реестрахString
add_paramsМассив с дополнительными параметрами. Дополнительные параметры потом возвращаются мерчанту в callback вызовеArray
callback_urlURL на который придет информация о результате выполнения платежаString

В ответ приходят следующие параметры:

ПараметрОписаниеТип
apple_validate_dataДанные которые необходимо передать в метод session.completeMerchantValidationString
order_keyИдентификатор заказа в платежной системеString
codeКод ответа (0 - успех)Integer
messageРасшифровка кода ответаString

Подтверждение платежа Apple Pay (api/apple/payment)

Система сама определяет по какому пути идет аутентификация с 3DS или без в зависимости от данных полученных от Apple.

Production url: https://****.procard-ltd.com/api/apple/payment

POST параметры:

НазваниеОписаниеТип
order_keyИдентификатор заказа в платежной системеString
apple_pay_payment_dataДанные закодированные в base64, полученные в новом событии onpaymentauthorized в параметре event.payment.String
Пример:
session.onpaymentauthorized = (event) => {
  console.log(event.payment);
}
apple_pay_payment_data_decryptedПараметр передается вместо apple_pay_payment_data, если используется оплата с расшифрованным токеном. Данные закодированные в base64, полученные в новом событии onpaymentauthorized в параметре event.payment.String

В ответ приходит:

ПараметрОписаниеТипЗначения
transactionStatusСтатус операцииStringApproved - Успешно
Declined - Отказ
reasonТекстовая причина отказаString
reasonCodeКод ошибки при отказеString

После вызова этого метода приходит callback в backend торговца.

Пример запроса на оплату с расшифрованным токеном:

{
"order_key": "9910ae2538be76b828f63a08f14ddf4a267d5148713cb2bb2742848fd622cfd266d86cab7f44b",
"apple_pay_payment_data_decrypted": "ewoiYXBwbGljYXRpb25QcmltYXJ5QWNjb3VudE51bWJlciI6ICI0MDEyMDAwMDAwMDAzMTE5IiwKImFwcGxpY2F0aW9uRXhwaXJhdGlvbkRhdGUiOiAiMjgxMTMwIiwKImN1cnJlbmN5Q29kZSI6ICI5ODAiLAoidHJhbnNhY3Rpb25BbW91bnQiOiAxMDAwMCwKImRldmljZU1hbnVmYWN0dXJlcklkZW50aWZpZXIiOiAiMDQwMDEwMDMwMjczIiwKInBheW1lbnREYXRhVHlwZSI6ICIzRFNlY3VyZSIsCiJwYXltZW50RGF0YSI6ewoib25saW5lUGF5bWVudENyeXB0b2dyYW0iOiIxMjMiLAoiZWNpSW5kaWNhdG9yIjoiNSIKfQp9Cg=="
}

Структура расшифрованного токена:

ПараметрОписаниеТип
applicationPrimaryAccountNumberТокенизированный номер картыString
applicationExpirationDateДата окончания срока действия карты (формат YYMMDD)String
currencyCodeВалюта платежаString
transactionAmountСумма транзакции. Пример 500.00Float
deviceManufacturerIdentifierУникальный идентификатор производителя устройстваString
paymentDataTypeТип платежных данныхString
paymentData
onlinePaymentCryptogramКриптограмма для безопасных онлайн-транзакцийString
eciIndicatorИндикатор электронной торговли, показывает уровень безопасности транзакцииString

Пример расшифрованного токена:

{
"applicationPrimaryAccountNumber": "4012000000003119",
"applicationExpirationDate": "281130",
"currencyCode": "980",
"transactionAmount": 10000,
"deviceManufacturerIdentifier": "040010030273",
"paymentDataType": "3DSecure",
"paymentData": {
"onlinePaymentCryptogram": "123",
"eciIndicator": "5"
}
}