Я создаю приложение React, которое подключается к серверу Flask для обработки платежей Stripe и генерации пропусков Apple Wallet. Мой серверный скрипт генерирует файл и сохраняет его в каталоге, а затем возвращает имя файла pkpass клиенту, который пытается загрузить его и загрузить в Wallet.
Проходы, кажется, генерируются правильно. Я могу скачать их (sftp) и бросить их на симуляторе, и они открываются просто отлично. Я могу разархивировать их, и все необходимые компоненты, кажется, находятся там и кажутся действительными.
Однако, с помощью веб-приложения я не могу заставить их загрузить и установить их в Wallet. На моем iPhone появляется простая ошибка «Safari не удалось загрузить файл».
Если я использую Safari на рабочем столе, файл pkpass загружается на мой Mac. Когда я перетаскиваю его на симулятор, я вижу в консоли следующую ошибку:
BOM could not extract archive: Couldn't read PKZip signature
Failed to add pass: 'file:///Users/tpoulsen/Downloads/ch_1FPYBoAzcfAbJsLnXDsVRcrc.pkpass' Error Domain=PKPassKitErrorDomain Code=1 "The pass cannot be read because it isn’t valid." UserInfo={NSLocalizedDescription=The pass cannot be read because it isn’t valid., NSUnderlyingError=0x6000016dbbd0 {Error Domain=PKPassKitErrorDomain Code=1 "(null)"}}.
Я использовал VBinDiff для сравнения загрузок (через sftp и Safari) и файлов они совершенно разные. Итак, проблема, похоже, связана либо с моим приложением Flask, либо с моим веб-приложением.
Вот мой маршрут Flask
@application.route("/passes/<path:fname>")
def passes_proxy(fname):
"""static passes serve"""
return send_from_directory("passes", fname, mimetype="application/vnd.apple.pkpass")
А в моем компоненте:
paymentRequest.on('token', async (ev) => {
try {
const response = await fetch('https://my_server.com/charge', {
method: 'POST',
body: JSON.stringify({
token: ev.token.id,
amount: totalInCents,
description: purchasedItems.join(',\n')
}),
headers: {'content-type': 'application/json'},
});
if (!response.ok) {
throw new Error('Network response was not ok.');
}
ev.complete('success');
const pkpass = await response.json();
download(`https://my_server.com/passes/${pkpass.filename}`, pkpass.filename, "application/vnd.apple.pkpass");
} catch (error) {
throw new Error("There was a problem processing your payment");
}
});
Используемые технологии:
- create-Reaction-app / React
- Колба с wallet-py3k для генерации пропусков
- download. js для загрузки сгенерированного файла