具有自己的Web服务器的一致安全的Google Play应用内购买方案

时间:2012-10-09 18:42:27

标签: android security in-app-purchase in-app-billing android-billing

我已多次阅读Android Developer Guide中的所有文档 熟悉好的Google演示文稿Evading Pirates and Stopping Vampires

最后,我尝试根据上面的演示实现涉及我自己的Web服务器的应用内结算方案。 以下是与我的服务器交互的要点:

  1. 在向Google发出REQUEST_PURCHASE请求之前,我向我的网络服务器发出请求以注册新购买。如果请求成功,我从服务器获得一个nonce。
  2. 当事务结束时,我收到一组通知ID,将它们传递给GET_PURCHASE_INFORMATION请求。此时我需要在我的服务器中使用步骤1中收到的nonce。 < - 我被困在这里了!
  3. 当GET_PURCHASE_INFORMATION成功时,我得到一个signedJson和一个签名,我将其传递给我的服务器。它验证购买并在服务器上提交事务。
  4. 到目前为止我无法理解的是两件事:

    1. 如何在我的情况下通过传入的IN_APP_NOTIFY意图来识别以前生成的nonce?据我所知,它可以对应当前购买完成或其他购买退款。根据我的看法,我们只有与REQUEST_PURCHASE请求无关的通知ID。
    2. 如何安全地处理退款,以便我的服务器100%确认此事件?最自然的方式是,我的服务器定期从我的服务器请求Google服务器来检索实际状态订购。不幸的是,在我的国家/地区,开发人员无法使用Google Checkout API。另一种方法是使用GET_PURCHASE_INFORMATION请求通过设备定期检查订单状态,传递已知的通知ID和新的nonce。如果检查在某段时间内失败,则购买将自动到期,直到第一次成功订单状态验证为止。这种情况可能吗?在CONFIRM_NOTIFICATIONS请求订单后,我可以使用已知的通知ID来发出GET_PURCHASE_INFORMATION请求吗?
    3. 编辑:关于退款(第2点),有一个相关主题Android In-App billing security issues? Google Play中没有内置的最终用户功能要求开发者退还应用内购买是否正确?如果是,那么我们可能会在应用程序中实施一个按钮来发送此类退款请求到我们的服务器,包括验证用户凭据等所有必要信息,然后在Google商家帐户和服务器数据库中手动处理退款。

1 个答案:

答案 0 :(得分:1)

没有以编程方式申请退款。用户必须通过电子邮件等方式与您联系,您可以在开发者控制台中退款。退款处理完毕后,应用会收到带有新订单状态的已签名PURCHASE_STATE_CHANGED通知(广播)(已退款)。您可以将此转发到您的服务器进行验证,就像新购买一样,并相应地更改订单状态。你不应该关心nonce被绑定的请求,只需检查它确实是你生成的(Cf. Dungeons示例)。如果您在服务器上执行此操作,通常会搜索数据库以检查先前生成的nonce是否存在。