#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,»).
Надеюсь, это поможет.