我发现很难在线找到完整的文档。所以,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/