- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试设置 Google Cloud Function (GCF) 来处理来自 Apple 的订阅通知。我熟悉 GCF,但不太熟悉编写自己的 REST API 和处理 Apple 通过通知发送的数据的 Nodejs 方法。我收到了 Apple 通知,但只收到了“一大块”。这是我的代码(使用 Express 和 body-parser 框架)。我把我的整个函数放在这里是为了帮助人们,因为我在网上可以找到的任何地方都没有关于如何使用 GCF 进行订阅通知的信息(请注意,此代码很大程度上是一个正在进行的工作,我是 Nodejs 的新手):
// Set up express object
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
exports.iosNotification = functions.https.onRequest((req, res) => {
console.log("We are receiving a request from Apple.");
app.use(bodyParser.json());
let receipt = req.body.latest_receipt;
console.log(req.body);
const chunks = [];
req.on('data', chunk => {
chunks.push(chunk);
console.log('A chunk of data has arrived:', chunk);
});
req.on('end', () => {
const data = Buffer.concat(chunks);
console.log('Data: ', data);
console.log('No more data');
});
const type = req.body.notification_type;
console.log("Notification type: ", type);
const lri = req.body.latest_receipt_info;
console.log(lri, receipt);
// Verify the receipt.
validateAppleReceipt(receipt)
.then((appleResponse) => {
console.log("Receipt from App Store server validated.", appleResponse);
res.sendStatus(200);
const oTxId = appleResponse.latest_receipt_info[0].original_transaction_id;
// Receipt is valid and we let Apple know. Let's process the notification.
switch (type) {
case 'CANCEL':
// User canceled the subscription (like on accidental purchase).
console.log("User canceled a subscription.");
break;
case 'DID_CHANGE_RENEWAL_PREF':
console.log("The subscriber downgraded. Effective on next renewal. Handle.");
break;
case 'DID_CHANGE_RENEWAL_STATUS':
console.log("The subscriber downgraded or upgraded. Effective on next renewal. Handle.");
break;
case 'DID_FAIL_TO_RENEW':
console.log("Subscription has a billing issue. Check if in billing retry period.");
break;
case 'DID_RECOVER':
console.log("Renewal of expired subscription that failed to renew.");
break;
case 'INITIAL_BUY':
console.log("Initial purchase. Ignored because we already handled with another function.");
break;
case 'INTERACTIVE_RENEWAL':
console.log("Interactive renewal. Not sure if we'll ever see this.");
break;
case 'RENEWAL':
console.log("Renewal after failure. Same as DID_RECOVER. Handle there.");
break;
default:
console.log("Hit default.");
break;
};
})
.catch((error) => {
console.log("Error validating receipt from App Store server.", error);
});
});
这是我得到的输出(这只是苹果表示正在发送的通知的一部分)。我没有收到 notification_type
或 Apple 文档所说我应该收到的 JSON 文件的任何其他部分:
{ latest_receipt: 'ewoJInNpZ25hdHVyZSIgPSAiQTNVM0FjaDJpbXRPMG53cEtrQW9 <<shortened for this post>>
我从未在 console.log 中看到任何 block 。
我该怎么做才能确保收到所有“ block ”并将它们组合到 Apple 发送给我的完整 JSON 文件中,以便我可以使用它?
最佳答案
我解决了。就是这么简单。我只需使用 req.body 而不是 req。以下代码适用于尝试使用 Google Cloud Functions 处理 Apple 订阅的服务器到服务器通知的任何人。
exports.iosNotification = functions.https.onRequest((req, res) => {
console.log("We are receiving a request from Apple.");
let receipt = req.body.latest_receipt;
const type = req.body.notification_type;
console.log("Notification type: ", type);
const lri = req.body.latest_receipt_info;
console.log(type, lri, receipt);
// Verify the receipt.
validateAppleReceipt(receipt)
请参阅上面的代码,了解如何处理 Apple 发送的类型...
关于ios - Google Cloud 功能中仅接收部分 Apple 订阅通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742537/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!