Приложение Flask / React, загруженный двоичный файл (pkpass) отличается от того же файла на сервере - PullRequest
0 голосов
/ 03 октября 2019

Я создаю приложение 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 для загрузки сгенерированного файла

1 Ответ

0 голосов
/ 03 октября 2019

Понял. Я был слишком необычным. Вместо того, чтобы использовать download.js для захвата файла, мне просто нужно было:

window.location.href = `https://my_server.com/passes/${pkpass.filename}`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...