【问题标题】:Wallet Pass auto update web service using aws api gateway使用 aws api 网关的 Wallet Pass 自动更新 Web 服务
【发布时间】:2018-02-09 10:47:46
【问题描述】:

我正在开发一项使用 AWS Lambda/API 网关/NodeJS 更新 Apple Wallet 通行证的 Web 服务。 Apple 钱包点击 api 获得更新通过,但每次我收到以下错误:

遇到错误:收到无效的通行证数据(通行证无效,无法读取。)

我已经尝试在浏览器中使用相同的 URL 来获取通行证。通行证每次都在下载,每次都打开一个有效的通行证。但是当 Apple 钱包点击 URL 时它不起作用。我在 Postman 中尝试过相同的 URL,它给了我 base64 而不是二进制数据。

我尝试使用 NodeJS 实现相同的功能并部署在 heroku 上,它可以与 Wallet 正常工作(也在 Postman 中提供二进制文件)。但我需要使用 AWS Lambda/API 网关/NodeJS。

我不确定 AWS 在交付二进制数据时是否会改变某些内容。

对此的任何帮助表示赞赏。

【问题讨论】:

  • 您在 iPhone 的控制台日志中还看到了什么?您的 lambda 应用中是否安装了 WWDR 开发者证书?
  • 这里是整个日志:{ "logs": [ "[2017-08-31 12:43:04 +0530] 获取传球任务(传球类型pass.com.xxx.xxx.xxx , 序列号 xxxxxxxxxx, if-modified-since (null); with web service url xxxxxxxx.execute-api.us-east-2.amazonaws.com/xxx) 遇到错误: Received invalid pass data (The pass can be read because it is not valid.)" ] } WWDR 已安装.当通过 heroku 提供 web 服务时,同样的传递也有效。
  • 您是否正确设置了 content-type 标头?

标签: node.js aws-api-gateway wallet


【解决方案1】:

我刚刚经历过这种情况,并花了几个小时试图诊断发生了什么。

对于将 AWS API Gateway 和 Lambda 用于他们的 PassKit Web 服务端点的任何人,API Gateway 的逻辑如何确定它是否需要从 base64 转换响应存在一个主要的“陷阱”(至少截至我的回复之日) ==> 二进制。

如果您检查来自 Apple Wallet / PassKit 的请求标头,您会看到 Accept 标头是 */*

API Gateway 显然会遍历请求 Accept 标头中的项目,并确定是否与您在 Your API Name > 下定义的任何 Binary Media Types 匹配设置。它将使用找到的第一个匹配项,然后如您所愿,将 base64 字符串(来自 Lambda)转换为二进制。

这是疯狂的部分 - 如果您将 application/vnd.apple.pkpass 定义为“请转换为二进制”媒体类型之一,来自 Apple Wallet / PassKit 的请求将不起作用。为什么?好吧,AWS(无论出于何种原因......)尚未对 */* 进行编程以匹配 any 类型......它只会匹配*/*

因此,Accept 标头的 */*application/vnd.apple.pkpass 匹配,并且您的 base64 编码的 .pkpass 响应(来自 Lambda)将不会转换为二进制,从而导致 PassKit扼杀+报告错误。


TL;DR——AWS API Gateway 存在一些问题。要成功返回 PassKit 传递数据,您需要在 Your API Name > Settings > Binary Media Types 下添加 */*不是 application/vnd.apple.pkpass)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2019-10-17
    • 2019-07-17
    • 2012-07-24
    相关资源
    最近更新 更多