混合应用程序 (cordova) 中的 IAP - iTunes 收据仅包含第一笔交易

IAP in hybrid app (cordova) - iTunes receipt contains only the first transaction

事情是这样的,这几天我一直在努力弄清楚 IAP (应用程序购买中的苹果 ios)在混合应用程序中。

一切似乎都在工作,交易正在触发结束等... 但是当涉及到服务器端收据验证时,奇怪的事情就开始了。

正如我提到的,在应用程序本身中,新交易是使用新的唯一 ID 进行的。 但是,当我向服务器发送 收据 并且我的服务器要求苹果进行验证时,苹果返回的信息 仅包含已完成的第一笔交易 ,没有指示当前事务或在第一个事务之后完成的任何其他事务。

有人经历过类似的事情吗?

附加信息:

  1. 一切都发生在沙盒中(难道只是沙盒的事情吗?在产品中它可能会神奇地开始工作?)
  2. 当我要求收据时在应用程序本身中,以便稍后将其发送到我的服务器,收据始终相同。从我读到的内容来看,这是正确的,因为 ios7
  3. 我正在使用这个插件:https://github.com/j3k0/cordova-plugin-purchase
  4. 交易的自动完成已关闭(cordova 插件选项)
  5. 我用于收据验证的服务器端库:https://github.com/chrismaddern/iOS-Receipt-Validator-PHP/blob/master/itunesReceiptValidator.php

iTunes收据有两种:

  1. SKPaymentTransaction#transactionReceipt(已弃用)和;
  2. 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) {
     ...
})

这将强制插件删除缓存的收据并始终获取最新版本。