Android 和 iOS 的应用内购买撤销机制

In app purchase revocation mechanism for Android and iOS

我应该为 android 和 iOS 的购买实施通用撤销政策。

这里是我所说的撤销政策的意思:
用户可以选择在应用程序中购买某种虚拟货币 (VC)。当用户成功完成交易时,用户的余额将随着他购买的 VC 的数量而增加。如果稍后他 refunds/cancels 交易,则需要扣除用户的余额(退回存款)。

我也想清除可能弹出的任何问题。
Android 和 iOS 应用程序都有一个共同的后端,用于以下目的:

我能想到的一种可能的流程是:

用户打开应用程序(iOS 或 Android 无关紧要)并开始购买流程。输入他的付款详情并点击提交。这会在相应的 App Store 中创建一个交易。该应用程序然后将交易详细信息发送到服务器。服务器负责验证交易,并在成功验证后将 VC 存入用户余额。

可能出现的问题:

  1. 几天后,用户退款了。服务器将如何收到通知?

    1.1。根据 Google 的文档,他们提供了 Void API 服务器推送 通知 但仅适用于订阅和一次性购买 用于定期购买。这同样适用于 Apple 的服务器 APIs,它也有 Server Push Notifications that are for subscriptions only and Receipt Validation。那些 API 似乎不适合实施购买撤销机制。还要记住,每天有数十万次购买,API 需要适合这样的数量。

  2. 如果由于某种原因服务器成功执行购买验证但由于某些业务规则无法授予 VC 怎么办?在这种情况下,用户的钱将被 App Store 拿走,他将不会收到他支付的商品。

    2.1。我了解在后端验证购买后,应用程序需要 finish/confirm 向 App Store 进行交易。但在这种情况下,交易不应该被确认,因为它不能根据某些业务规则来执行。在这种情况下,用户不应该被收费。 iOS 和 Android 的文档都不清楚如何实现。

非常感谢您提供以下帮助:

TL;DR

后端服务器可以轮询一个 Google 专门的 API 来了解购买状态的变化并采取相应的行动。但是,Apple 没有专门的 API 用于批量状态检索。

问题 1 - 处理退款

在实施任何解决方案之前,请务必了解 Google 和 Apple 都尽最大努力减少退款数量并检测欺诈行为 activity。但是还是有可能出现退款已经发生,申请者想撤销授权商品的情况。

此外 Google (Android) 退款金额与 Apple (iOS) 退款金额不同。 Android 平台的平均退款往往比 iOS 平台多。在决定为每个系统单独实施吊销策略时,这可能很重要,因为似乎没有通用的解决方案。

可能的解决方案

集中式后端服务器需要知道何时发生退款。这将允许它撤销货物(在这种情况下恢复虚拟货币交易)。服务器不得依赖于从移动设备获取此知识,因为它们不是受控的真实来源。因此,后端必须利用 Google 和 Apple 公开的 API 分别处理 Android 退款和 iOS 退款。

Google (Android)

Google提供了一个Voided Purchases API。此 API 可用于检索批量信息,例如购买是否已退款甚至拒付。 API 可以从后端定期轮询,并将返回的购买令牌用于 link 用户进行的购买并执行所需的撤销策略。

苹果 (iOS)

与 Google 不同,Apple 不提供专门的批量 API 来检索购买信息。但是它提供 AppStore Receipt Verification API 可用于检索每个单独购买的状态。 API 旨在用于在实际发生购买时对购买进行服务器端验证。它似乎不适合定期检查购买状态。这并不意味着它不能被轮询,但如果达到某个请求配额并且请求受到限制(只是在这里猜测),我不会感到惊讶。 Apple 还提供 AppStore Server Notifications。当订阅状态发生变化时,它可以用作回调通知您的后端。不幸的是,根据文档,这个 API ONLY FOR SUBSCRIPTIONS 而不是一次性购买。因此,AppStore 收据验证 API 成为唯一可能的解决方案。

问题 2 - Unfinished/Unconsumed 交易

我找不到任何官方文档来解释如果在 Android/iOS 中购买的商品不是 consumed/finished 会发生什么。所有文档都声明购买必须是 consumed/finished.

Android

在试用 Android 之后,我注意到 Google Play 会在购买未消费时自动退款。对于测试购买,发出退款所需的时间小于 30 分钟,但对于实际交易,可能需要一天时间。 因此,如果服务器在向用户收费后未能向用户授予商品,则可以依靠一两天后发出的退款。但是请注意,这在任何官方来源中都没有记录。

iOS

我没有测试 iOS 购买。文档指出购买后需要针对 AppStore 完成。在完成之前,它将保留在 iOS 购买 Q 中。目前尚不清楚此未完成的交易将在 Q 中保留多长时间。并且不清楚是否会以与未消费类似的方式退款 Google 购买。