【问题标题】:AppStore in-app purchase flow with own server使用自己的服务器的 AppStore 应用内购买流程
【发布时间】:2018-08-12 11:14:25
【问题描述】:

谁能帮我理解以下架构?我有一个 iOS 应用程序和一个应用程序服务器。应用程序和服务器(1A、1B)之间的连接已经在工作。

假设该应用的用户有 10 个宝石,出于安全原因,这些宝石由服务器控制。我在 AppStore 中有一个消耗性 IAP 类型:100 个宝石包,用户想购买它。当然,我想在我的 Mongo 数据库中做一个记录,以增加用户的宝石数量。

这个流程是如何工作的?我应该先在应用程序中使用 StoreKit,然后再与服务器通信吗?或者可以在服务器上创建一个端点,如“/buyPack/100gems”,然后在服务器端做所有事情?据我了解,我需要验证来自 AppStore 的收据,但是从哪里获得它以及它包含什么?

如果您能使用我的箭头(1A、2A、3B 等),我将不胜感激。

【问题讨论】:

    标签: ios node.js in-app-purchase app-store storekit


    【解决方案1】:

    购买必须在使用 StoreKit 的 iOS 设备上进行。

    当您收到带有.purchased 状态的交易时,您应该检索收据并将其发送到您的服务器进行验证。一旦您的服务器通过 Apple 验证了收据并更新了用户在 MongoDB 中的余额,它应该向应用程序返回成功状态。此时,应用程序应完成与 StoreKit 的交易。

    请注意,在您更新数据库后但在收到响应并完成交易之前,用户可能会终止应用程序或失去网络连接。在这种情况下,应用程序将在下次启动时再次收到交易。您的服务器应通过检查事务标识符为此做好准备。如果您之前已经处理过交易,请将成功返回给您的应用,以便它可以完成交易但不会再次增加用户的余额。

    有关收据验证的更多建议,请参阅this answer

    流程类似于:

    • 3B - 使用 StoreKit 进行购买
    • 3A - 确认付款后,更新的交易会发送到应用程序
    • 1A - 应用将收据和交易详情发送到您的服务器
    • 2A - 您的服务器通过 Apple 验证收据
    • 2B - 您的服务器根据验证收据更新用户余额
    • 1B - 您的服务器向应用返回成功状态
    • 3B - 您的应用使用 StoreKit 完成交易

    【讨论】:

    • 我实现了几乎所有的东西,而且快乐的场景也能正常工作。只有一种情况我不知道如何解决:
    • 1.我使用 StoreKit 开始购买 2. 使我的服务器离线 3. 下次我启动应用程序(或在线)时,我看到一些已购买但未完成的交易 4. 我标记完成它们而不更新服务器。我是否应该再次从 MainBundle 向我的服务器发送收据并在成功响应后完成它们?
    • 是的,您应该始终遵循相同的流程。如果您无法联系到您的服务器,请不要完成交易。您可能应该向用户提供一些反馈,说明购买仍在进行中
    • 我仍然缺少一件事。示例:我打开应用程序,看到队列中有 4 笔交易:1 笔失败(我立即完成,没有问题),3 笔被购买。我遍历购买的 3 笔交易并尝试将有关它的信息发送到我的服务器并在成功响应后完成。但我还需要发送收据,我从 MainBundle.AppStoreReceiptUrl 获取这个并附加到每个呼叫。在这种情况下,AppStore 说我有些产品在收据中无效。我做错了吗?
    • 我解决了这个问题。我只是发送收据并从中提取交易和产品 ID。它更安全、更正确。
    猜你喜欢
    • 2013-04-09
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2011-11-27
    • 2015-07-14
    • 2018-02-17
    相关资源
    最近更新 更多