java - 如何在 android 中验证 IAP?
问题描述
我发现很难在网上找到完整的文档。所以,atm 我有一个 Cloud Firestore 数据库。一种非消耗品,可解锁高级版本。我找到的简短指南建议:
要在受信任的服务器上验证购买详细信息,请完成以下步骤:
确保设备-服务器握手是安全的。
检查返回的数据签名和 orderId,并验证 orderId 是您之前没有处理过的唯一值。
- 验证您的应用程序的密钥是否已签署您处理的 INAPP_PURCHASE_DATA。
- 使用来自 Google Play Developer API 的 ProductPurchase 资源(用于应用内商品)或 SubscriptionPurchase 资源(用于订阅)验证购买响应。此步骤特别有用,因为攻击者无法为您的 Play 商店购买请求创建模拟响应。
我使用什么服务器?cloud fire-store 是否足以完成此验证?
如何验证您的应用程序的密钥是否已签署您处理的 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 触发函数,通过该函数传递购买令牌并在令牌有效与否时让它返回。
您不需要在数据库中存储任何内容(尽管您可能想要)。收据验证可以在一个函数中完成 - 网上有一些有据可查的开源示例。
值得付出努力吗?这取决于您希望投入多少时间,以及您是否认为拥有“假”购买代币的用户的成本超过了这项投资。
另一种选择是为您的应用内购买服务器使用托管解决方案,例如RevenueCat(免责声明:我在那里工作)。