我正在构建一个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");
}
});
涉及的技术:
知道了。我太花哨了。无需使用download.js来获取文件,我只需要:
window.location.href = `https://my_server.com/passes/${pkpass.filename}`;