Flask / React应用程序,下载的二进制(pkpass)文件与服务器上的同一文件不同

问题描述 投票:0回答:1

我正在构建一个React应用程序,该应用程序可以连接Flask服务器以进行Stripe付款处理和Apple Wallet密码生成。我的服务器脚本生成文件,并将其保存到目录中,然后将pkpass文件的名称返回给客户端,客户端尝试下载该文件并将其加载到电子钱包中。

通票似乎生成正确。我可以下载它们(sftp)并将其放在Simulator上,然后打开它们就可以了。我可以解压缩它们,所有必要的组件似乎都在那里而且似乎有效。

但是,通过网络应用程序,我无法让他们下载并安装到电子钱包中。在我的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应用程序或Web应用程序上。

这是我的烧瓶路线

@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");
  }
});

涉及的技术:

flask safari create-react-app
1个回答
0
投票

知道了。我太花哨了。无需使用download.js来获取文件,我只需要:

window.location.href = `https://my_server.com/passes/${pkpass.filename}`;
© www.soinside.com 2019 - 2024. All rights reserved.