java - 如何在 Android 中验证 IAP?

标签 java android firebase in-app-purchase

我发现很难在线找到完整的文档。所以,atm 我有一个 Cloud Firestore DB。一种可解锁高级版本的非消耗品。 short guide我确实找到了推荐:

要在受信任的服务器上验证购买详细信息,请完成以下步骤:

  • 确保设备与服务器握手的安全。

  • 检查返回的数据签名和 orderId,并验证 orderId 是否是您之前未处理过的唯一值。

  • 验证您的应用的 key 是否已对您处理的 INAPP_PURCHASE_DATA 进行签名。
  • 使用 Google Play Developer API 中的 ProductPurchase 资源(适用于应用内商品)或 SubscriptionPurchase 资源(适用于订阅)验证购买响应。此步骤特别有用,因为攻击者无法对您的 Play 商店购买请求创建模拟响应。

我使用什么服务器? cloud fire-store 足以完成此验证吗?

我如何验证您的应用的 key 是否已签署您处理的 INAPP_PURCHASE_DATA

每次用户购买时我都需要读取每个订单 ID 吗?难道这不会很快导致数据库上的数千次读取吗?

这是我将在其中实现验证的 onPurchasesUpdated 代码块:

 @Override
public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
    if (billingResult.getResponseCode() == BillingResponseCode.OK
            && purchases != null) {
        int index = 0;
        for (Purchase purchase : purchases) {
            if(purchase.getSignature().equals( /*Somehow check igned the INAPP_PURCHASE_DATA HERE?*/) || purchase.getOrderId().equals(purchases.get(index).getOrderId())) {
                //Invalid
                getMessage("Invalid. Order cancelled");
                return;
            } else {

                handlePurchase(purchase);
            }

        }
    } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) {
        getMessage("Payment Cancelled");
    } else {
        getMessage("Error. Try Again");
    }
}

我应该采取什么步骤?您如何验证 IAP? 为什么这方面的文档很差。

这值得付出努力吗?我不希望这个应用程序被下载数百万次。我应该跳过它吗?

最佳答案

您可以使用 Firebase Cloud Function 进行收据验证。您将设置一个 HTTP triggered函数,您传递购买 token 并在 token 有效或无效时返回它。

不需要在数据库中存储任何内容(尽管您可能想要)。收据验证可以在函数中完成 - 并且有一些有据可查的 open-source examples在线。

值得付出努力吗?这取决于您希望投入多少时间,以及您是否认为用户使用“虚假”购买代币的成本超过了这项投资。

另一种选择是为应用内购买服务器使用托管解决方案,例如 RevenueCat (免责声明:我在那里工作)。

关于java - 如何在 Android 中验证 IAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56770173/

相关文章:

java - 这个日志语句有什么问题?

java - pdfBox 查找包含签名字段的页号

java - 无法结束我的 Android 应用程序

android - 预期为BEGIN_OBJECT,但在路径Moshi Json数据异常处为BEGIN_ARRAY

swift - 如何在 firebase 中非实时加载数据?

java - 无法通过对象输出流将对象从一个 http 处理程序发送到另一个

java - 如何用gson解析相对复杂的url

android - 我可以使用 Apache Cordova(本地构建)签署 Android 应用吗

ios - 在 iOS 上观察 Cloud Firestore 中的许多路径是不是一件坏事

firebase - Firestore 批处理 - 需要超过 1 次写入的操作