混合应用程序 (cordova) 中的 IAP - iTunes 收据仅包含第一笔交易
IAP in hybrid app (cordova) - iTunes receipt contains only the first transaction
事情是这样的,这几天我一直在努力弄清楚 IAP
(应用程序购买中的苹果 ios)在混合应用程序中。
一切似乎都在工作,交易正在触发结束等...
但是当涉及到服务器端收据验证时,奇怪的事情就开始了。
正如我提到的,在应用程序本身中,新交易是使用新的唯一 ID 进行的。
但是,当我向服务器发送 收据 并且我的服务器要求苹果进行验证时,苹果返回的信息 仅包含已完成的第一笔交易 ,没有指示当前事务或在第一个事务之后完成的任何其他事务。
有人经历过类似的事情吗?
附加信息:
- 一切都发生在沙盒中(难道只是沙盒的事情吗?在产品中它可能会神奇地开始工作?)
- 当我要求收据时在应用程序本身中,以便稍后将其发送到我的服务器,收据始终相同。从我读到的内容来看,这是正确的,因为 ios7
- 我正在使用这个插件:https://github.com/j3k0/cordova-plugin-purchase
- 交易的自动完成已关闭(cordova 插件选项)
- 我用于收据验证的服务器端库:https://github.com/chrismaddern/iOS-Receipt-Validator-PHP/blob/master/itunesReceiptValidator.php
iTunes收据有两种:
SKPaymentTransaction#transactionReceipt
(已弃用)和;
- Apple Grand 统一收据,访问自
appStoreReceiptURL
您最有可能使用 transactionReceipt
属性。
看来 cordova-plugin-purchase
实现了 appStoreReceiptURL
here and can be accessed from the IAP.onPurchase 方法。
编辑:
仔细查看插件代码后,应该有一个全局 storekit
对象公开了一个 loadReceipts
方法,就像这样
storekit.loadReceipts(function (receipts) {
console.log('Receipt for appStore = ' + receipts.appStoreReceipt);
console.log('Receipt for ' + productId + ' = ' + receipts.forProduct(productId));
});
这是您要发送到服务器的 receipts.appStoreReceipt
属性。
问题已解决:)
显然,在 cordova-plugin-purchase 中有一种不需要缓存收据的机制,实际上(曾经)导致了我的问题。
所以解决方法是调用:
storekit.setAppStoreReceipt(null);
在获取收据之前:
storekit.loadReceipts(function (receipts) {
...
})
这将强制插件删除缓存的收据并始终获取最新版本。
事情是这样的,这几天我一直在努力弄清楚 IAP (应用程序购买中的苹果 ios)在混合应用程序中。
一切似乎都在工作,交易正在触发结束等... 但是当涉及到服务器端收据验证时,奇怪的事情就开始了。
正如我提到的,在应用程序本身中,新交易是使用新的唯一 ID 进行的。 但是,当我向服务器发送 收据 并且我的服务器要求苹果进行验证时,苹果返回的信息 仅包含已完成的第一笔交易 ,没有指示当前事务或在第一个事务之后完成的任何其他事务。
有人经历过类似的事情吗?
附加信息:
- 一切都发生在沙盒中(难道只是沙盒的事情吗?在产品中它可能会神奇地开始工作?)
- 当我要求收据时在应用程序本身中,以便稍后将其发送到我的服务器,收据始终相同。从我读到的内容来看,这是正确的,因为 ios7
- 我正在使用这个插件:https://github.com/j3k0/cordova-plugin-purchase
- 交易的自动完成已关闭(cordova 插件选项)
- 我用于收据验证的服务器端库:https://github.com/chrismaddern/iOS-Receipt-Validator-PHP/blob/master/itunesReceiptValidator.php
iTunes收据有两种:
SKPaymentTransaction#transactionReceipt
(已弃用)和;- Apple Grand 统一收据,访问自
appStoreReceiptURL
您最有可能使用 transactionReceipt
属性。
看来 cordova-plugin-purchase
实现了 appStoreReceiptURL
here and can be accessed from the IAP.onPurchase 方法。
编辑:
仔细查看插件代码后,应该有一个全局 storekit
对象公开了一个 loadReceipts
方法,就像这样
storekit.loadReceipts(function (receipts) {
console.log('Receipt for appStore = ' + receipts.appStoreReceipt);
console.log('Receipt for ' + productId + ' = ' + receipts.forProduct(productId));
});
这是您要发送到服务器的 receipts.appStoreReceipt
属性。
问题已解决:)
显然,在 cordova-plugin-purchase 中有一种不需要缓存收据的机制,实际上(曾经)导致了我的问题。
所以解决方法是调用:
storekit.setAppStoreReceipt(null);
在获取收据之前:
storekit.loadReceipts(function (receipts) {
...
})
这将强制插件删除缓存的收据并始终获取最新版本。