Node.js 使用aws api网关的钱包通行证自动更新web服务

Node.js 使用aws api网关的钱包通行证自动更新web服务,node.js,aws-api-gateway,wallet,Node.js,Aws Api Gateway,Wallet,我正在使用AWS Lambda/API gateway/NodeJS开发一个web服务来更新苹果钱包通行证。苹果钱包点击api获取更新许可证,但每次我都会收到以下错误: 遇到错误:接收到无效的密码数据(密码无效,无法读取。) 我在浏览器中尝试了相同的URL以获得通行证。该通行证每次都在下载,每次打开时都是有效通行证。但当苹果钱包点击网址时,它就不起作用了。我在《邮递员》中尝试了相同的URL,它给我的是base64而不是二进制数据 我已经尝试使用NodeJS实现相同的功能,并部署在heroku上,

我正在使用AWS Lambda/API gateway/NodeJS开发一个web服务来更新苹果钱包通行证。苹果钱包点击api获取更新许可证,但每次我都会收到以下错误:

遇到错误:接收到无效的密码数据(密码无效,无法读取。)

我在浏览器中尝试了相同的URL以获得通行证。该通行证每次都在下载,每次打开时都是有效通行证。但当苹果钱包点击网址时,它就不起作用了。我在《邮递员》中尝试了相同的URL,它给我的是base64而不是二进制数据

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

我不确定AWS是否在传输二进制数据时更改了某些内容


在此方面的任何帮助都将不胜感激

我刚刚经历了这一切,花了几个小时试图诊断发生了什么

对于任何使用AWS API Gateway&Lambda作为PassKit web服务端点的人来说,API Gateway的逻辑如何确定是否需要将响应从base64==>二进制转换成二进制,这是一个主要的“问题”(至少截至我的响应日期)

如果您检查Apple Wallet/PassKit中的请求头,您将看到
Accept
头是
*/*

API网关显然会遍历请求
Accept
头中的项目,并确定是否与在您的API名称>设置下定义的任何二进制媒体类型相匹配。它将使用找到的第一个匹配项,然后,如您所愿,将base64字符串(从Lambda)转换为二进制

这里是疯狂的部分——如果您将
application/vnd.apple.pkpass
定义为“请转换为二进制”媒体类型之一,那么来自apple Wallet/PassKit的请求将不起作用。为什么?嗯,AWS(无论出于何种原因…)没有将
*/*
编程为与任何类型匹配。。。它实际上只会匹配
*/*

因此,
Accept
头的
*/*
应用程序/vnd.apple.pkpass
不匹配,并且您的base64编码的.pkpass响应(来自Lambda)将不会转换为二进制,导致PassKit阻塞+报告错误



TL;DR--AWSAPI网关有一些问题。要成功返回PassKit密码数据,您需要在您的API名称>设置>二进制媒体类型下添加
*/*
(而不是
应用程序/vnd.apple.pkpass
)您在iPhone的控制台日志中还看到了什么?您的lambda应用程序中是否安装了WWDR开发者证书?以下是完整的日志:{“日志”:[“[2017-08-31 12:43:04+0530]获取通行证任务(通行证类型pass.com.xxx.xxx.xxx,序列号xxxxxxxxxxxxx,如果自(null)起修改;使用web服务url)遇到错误:接收到无效的通行证数据(无法读取该过程,因为它无效。)“]}已装入WWDR。当通过heroku提供Web服务时,相同的过程正在工作。是否正确设置了内容类型标头?