我已多次阅读Android 开发人员指南中的所有文档, 并熟悉了很好的 Google 演示文稿Evading Pirates 和 Stopping Vampires
最后,我尝试按照上面的演示实现涉及我自己的 Web 服务器的应用内计费方案。以下是与我的服务器交互的要点:
- 在向 Google 发出 REQUEST_PURCHASE 请求之前,我向我的网络服务器发出请求以注册新的购买。如果请求成功,我会从服务器获得一个随机数。
- 交易完成后,我会收到一组通知 ID,以将它们传递给 GET_PURCHASE_INFORMATION 请求。此时我需要使用在步骤 1 中从我的服务器收到的随机数。<-我被困在这里了!
- 当 GET_PURCHASE_INFORMATION 成功时,我得到一个signedJson 和一个我传递给我的服务器的签名。它验证购买并在服务器上提交交易。
到目前为止我无法理解的是两件事:
- 在我的情况下,如何通过传入的 IN_APP_NOTIFY 意图识别先前生成的随机数?据我了解,它可以对应于当前购买完成或另一次购买退款。据我所知,我们只有与 REQUEST_PURCHASE 请求无关的通知 ID。
- 如何以我的服务器 100% 确认此事件的方式安全地处理退款?恕我直言,最自然的方式是定期从我的服务器请求 Google 服务器以检索订单的实际状态。不幸的是,在我的国家,开发人员无法使用 Google Checkout API。另一种方法是通过设备定期检查订单状态,使用 GET_PURCHASE_INFORMATION 请求传递已知的通知 ID 和新的随机数。如果在一段时间内检查失败,购买将自动过期,直到第一次成功的订单状态验证。这种情况可能吗?我可以在订单的 CONFIRM_NOTIFICATIONS 请求之后使用已知的通知 ID 发出 GET_PURCHASE_INFORMATION 请求吗?
编辑:关于退款(第 2 点)有一个相关主题Android In-App billing security issues?. Google Play 中没有内置的最终用户功能要求开发者退款应用内购买是否正确?如果是这样,那么我们可能会在我们的应用程序中实现一个按钮,将此类退款请求发送到我们的服务器,包括所有必要的信息,例如经过验证的用户凭据,然后在 Google 商家帐户和服务器的数据库中手动处理退款。