Полная проверка работоспособности Apple Pay отменяет сеанс

#applepay #applepayjs

#applepay #applepayjs

Вопрос:

Мой серверный сервер успешно проверяет продавца, и сеанс возвращается, но когда я завершаю проверку в браузере, транзакция немедленно отменяется. На форуме разработчиков Apple есть несколько похожих жалоб, но, похоже, ни на одну из них не было получено ответа; Я надеюсь, что вы, ребята, сможете помочь!

Из всех обработчиков событий для ApplePaymentSession объекта вызывается только onvalidatemerchant, затем, как только completeMerchantValidation с допустимым объектом сеанса (см. Полезную нагрузку ниже), oncancel запускается.

Настройка сеанса (в браузере)

 const session = new ApplePaySession(3, {
  currencyCode: 'GBP',
  countryCode: 'GB',
  merchantCapabilities: [ 'supports3DS' ],
  supportedNetworks: ['visa', 'masterCard', 'amex', 'discover' ],
  total: {
    type: 'final',
    label: 'My Product',
    amount: 9.99,
  },       
});
  

Запрос (на серверной части)

 {
  merchantIdentifier: 'merchant.MY.FQDN',
  displayName: 'My Company Name',
  initiative: 'web',
  initiativeContext: 'MY.VERIFIED.FQDN',
}
  

Ответ (от Apple на серверную часть, затем отправляется на completeMerchantValidation

 {
  "epochTimestamp": 1552090296444,
  "expiresAt": 1552093896444,
  "merchantSessionIdentifier": "LONG_STRING",
  "nonce": "XXXX",
  "merchantIdentifier": "SAME_AS_IN_MY_MERCHANT_ID_CERT",
  "domainName": "MY.VERIFIED.FQDN",
  "signature": "XXXXXX-VERY-LONG-STRING-XXXXX"
}
  

Я определенно отправляю этот ответ в completeMerchantValidation как объект JSON, а не строку, вот так:

 console.log('session is a', typeof(result), result); // says: object
session.completeMerchantValidation(result);
  

Доменное имя, с которого все это происходит (и размещено на Firebase), проверяется на соответствие этому идентификатору продавца, и я не получаю никаких ошибок ни в серверной части, ни в консоли браузера, для перехвата не генерируется исключение, оно просто показывает панель Apple Pay, затем говорит «Платеж не завершен» и очень быстро скрывает панель. Помогите!

Обновление: глядя на документы, похоже, что startSession (который возвращается по onvalidatemerchant сворачивается, поэтому я попытался заменить его paymentSession (например https://apple-pay-gateway-nc-pod5.apple.com/paymentservices/paymentSession ), но я все еще получаю такую же реакцию и поведение.

Комментарии:

1. Вы решили эту проблему?

2. Нет, я этого не делал : (

Ответ №1:

Это решение может работать, а может и не работать для вас, но я столкнулся с той же проблемой, из-за которой сеанс отменялся сразу после session.completeMerchantValidation() вызова.

Это сводилось к тому, что merchantSession создавалось со domainName значением, которое не было проверено (см.: https://developer.apple.com/documentation/apple_pay_on_the_web/configuring_your_environment )

Я использовал локальный веб-сервер, транслирующий через Ngrok, для проверки временного URL-адреса, поместив apple-developer-merchantid-domain-association.txt файл туда, где он должен был быть основан на документации Apple Pay.

После этого, пока я использовал изолированную учетную запись iCloud и тестовую карту Apple Pay, передача ngrok URL-адреса в качестве domainName значения для merchantSession запроса сработала, и Apple Pay, наконец, начала работать локально. Обратите внимание, что для работы Apple Pay мне пришлось взаимодействовать с моим локально запущенным веб-приложением через ngrok URL-адрес.

Ответ №2:

У меня была такая же проблема, когда платежная ведомость отображалась, а затем исчезала без возможности авторизации транзакции. Я убедился, что домен был подтвержден, сертификат действителен и что я действительно получаю ответ от запроса на стороне сервера к Apple. Разбираясь в процессе исключения, я наткнулся на некоторые интересные наблюдения:

  • Если платежная ведомость немедленно исчезала, обычно это происходило из-за проблемы конфигурации с полезной нагрузкой запроса на стороне сервера (например, «initiativeContext» был «something.com «когда я на самом деле использовал»www.something.com «в адресе веб-браузера).
  • Если платежная ведомость исчезала через несколько секунд, обычно это происходило из-за проблемы с синтаксисом или ошибки в JavaScript на стороне клиента. В моем случае я неправильно выполнял session.onpaymentmethod selected и session.completepaymentmethod selection. Поэтому я удалил все другие функции JS, специфичные для Apple, за исключением session.onvalidatemerchant и последующего вызова session.completeMerchantValidation, передающего ответ Apple из запроса на стороне сервера. Затем это сработало.
  • Если бы ответ Apple на запрос на стороне сервера каким-либо образом (даже просто оболочка) был изменен по сравнению с тем, что Apple отправила изначально, это не сработало бы (например, «epochtimestamp»: 1668095263534,» против «epochTimestamp»: 1668095263534,»).

Надеюсь, это поможет.