在线验证iOS上的非消耗性IAP的应用内购买的正确工作流程是什么?
虽然我发现了很多有关应用程序内购买的信息,但我没有发现有关如何实际执行在线验证的详细信息。
以下工作流程是否正确且完整,或者我缺少什么?
常规设置:
- iOS应用通过将
SKPaymentQueue
添加到付款队列来开始购买
- 购买完成后,iOS用
paymentQueue:updatedTransactions:
调用transaction.transactionState == SKPaymentTransactionStatePurchased
- 这时,应用收据已经更新,并且增加了对非消耗性物品的购买。
- 收据数据和
transaction.transactionIdentifier
通过HTTP POST发送到我自己的Web服务
- Web服务将数据过帐到Apples
/verifyReceipt
端点
- 如果收据无效,则苹果服务器响应错误,如果有效,则返回详细的JSON数据
- 从Apple收到的JSON数据包括有关所有以前的非消耗品和订阅购买以及当前消耗品购买的信息。
- 有关耗材购买的信息可以通过
product_id
字段或使用transaction.transactionIdentifier
来标识
- Web服务将购买的商品添加到当前用户帐户和/或将有效/无效的响应发送回iOS应用。
- 如有必要(当购买未在线存储/处理时),iOS应用可以处理购买(添加硬币或其他东西)
- 使用
[queue finishTransaction:transaction]
关闭交易
其他观察结果:
- 收据中包含有关所有先前的非消耗品和订购购买以及当前/最近的消耗品购买的信息。
- 有关当前耗材购买的信息将在下一次购买之前提供(无论是耗材,非耗材还是已订阅)。
- 重新启动应用程序不会破坏有关当前耗材购买的信息
- 删除并重新安装该应用程序后,收据为空/不存在。恢复以前的购买后,收据仅包含有关非消耗性和订购购买的信息。没有恢复有关非消耗品购买的信息(不足为奇)
结论:
- 如果(由于某种原因)收据无法发送到Web服务(服务器关闭,无连接等),则可以稍后重试。购买数据将在收据内显示,直到下一次购买为止。
- 要在下一次购买后仍要访问收据数据,必须实施自定义存储方法(例如,将收据数据保存到文件中)。
- 这样,可以向用户通知未完成的验证,并可以提供重试选项。
这是一个完整且有效的工作流程,可以在线验证可消费的应用内购买吗?还是我缺少某些特殊情况?